linux核心代码分析(系统初始化start_kernel函数)

2016-01-29 19:15 51 1 收藏

linux核心代码分析(系统初始化start_kernel函数),linux核心代码分析(系统初始化start_kernel函数)

【 tulaoshi.com - Linux 】

  至于x86的引导无非如下步骤:
1,cpu初始化自身,在固定位置执行一条指令。
2,这条指令条转到bios中。
3,bios找到启动设备并获取mbr,该mbr指向我们的lilo
4,bios装载并把控制权交给lilo
5,压缩内核自解压,并把控制权转交给解压内核。
简单点讲,就是cpu成为内核引导程序的引导程序的引导程序的引导程序,西西。
这时内核将跳转到start_kernel是/init/main.c的重点函数,main.c函数很多定义都是为此函数服务的,这里
我简要介绍一下这个函数的初始化流程。
初始化内核:
从start_kernel函数(/init/main.c)开始系统初始化工作,好,我们首先分析这个函数:
函数开始首先:
#ifdef __SMP__
 static int boot_cpu = 1;
 /* "current" has been set up, we need to load it now *//*定义双处理器用*/
 if (!boot_cpu)
 initialize_secondary();
 boot_cpu = 0;
#endif
定义双处理器。
printk(linux_banner);    /*打印linux banner*/
打印内核标题信息。
开始初始化自身的部分组件(包括内存,硬件终端,调度等),我来逐个分析其中的函数:
setup_arch(&command_line, &memory_start, &memory_end);/*初始化内存*/
返回内核参数和内核可用的物理地址范围
函数原型如下:
setup_arch(char **, unsigned long *, unsigned long *);
返回内存起始地址:
memory_start = paging_init(memory_start,memory_end);
看看paging_init的定义,是初始化请求页:
paging_init(unsigned long start_mem, unsigned long end_mem)(会在以后的内存管理子系统分析时详细介
绍)
{
 int i;
 struct memclust_struct * cluster;
 struct memdesc_struct * memdesc;
 /* initialize mem_map[] */
 start_mem = free_area_init(start_mem, end_mem);/*遍历查找内存的空闲页*/
 /* find free clusters, update mem_map[] accordingly */
 memdesc = (struct memdesc_struct *)
 (hwrpb-mddt_offset + (unsigned long) hwrpb);
 cluster = memdesc-cluster;
 for (i = memdesc-numclusters ; i  0; i--, cluster++) {
 unsigned long pfn, nr;
 /* Bit 0 is console/PALcode reserved. Bit 1 is
   non-volatile memory -- we might want to mark
   this for later */
 if (cluster-usage & 3)
  continue;
 pfn = cluster-start_pfn;
 if (pfn = MAP_NR(end_mem)) /* if we overrode mem size */
  continue;
 nr = cluster-numpages;
 if ((pfn + nr)  MAP_NR(end_mem)) /* if override in cluster */
  nr = MAP_NR(end_mem) - pfn;
 while (nr--)
  clear_bit(PG_reserved, &mem_map[pfn++].flags);
 }
 memset((void *) ZERO_PAGE(0), 0, PAGE_SIZE);
 return start_mem;
}
trap_init();   初始化硬件中断
/arch/i386/kernel/traps.c文件里定义此函数
sched_init()   初始化调度
/kernel/sched.c文件里有详细的调度算法(这些会在以后进程管理和调度的结构分析中详细介绍)
parse_options(command_line) 分析传给内核的各种选项(随后再详细介绍)
memory_start = console_init(memory_start,memory_end) 初始化控制台
memory_start = kmem_cache_init(memory_start, memory_end) 初始化内核内存cache(同样,在以后的内存
管理分析中介绍此函数)
sti();接受硬件中断
kernel_thread(init, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGHAND);
 current-need_resched 

来源:http://www.tulaoshi.com/n/20160129/1508868.html

延伸阅读
ALTER DATABASE DATAFILEd:\ORANT\DATABASE\USER1ORCL.ORA RESIZE 1000M; CREATE TABLESPACE INDEX_DATA DATAFILEd:\ORANT\DATABASE\INDEX_DATA SIZE 500M; ALTER DATABASE DATAFILEd:\ORANT\DATABASE\RBS1ORCL.ORA RESIZE 300M; ALTER DATABASE DATAFILEd:\ORANT\DASTABASE\TMP1ORCL.ORA RESIZE 300M; alter rollback segment "RB1" offlin...
Windows应用程序的初始化文件(INI)对应用程序缺省设置起着重要的作用,初始化文件可以采用文本编辑器修改,但这种方法容易出现错误,不易由用户操作。下面介绍用VB实现修改初始化文件的方法。 1初始化文件的结构与特点 Windows应用程序初始化文件中通常设置应用程序的运行环境,确定应用程序变量的缺省设置,初始化文件既包含Win...
标签: windows10
这样能初始化你的win10系统 系统使用久了之后难免会出现慢统变慢,小故障频发等现象,而在最新的Win10系统中,微软为Win10系统配备了恢复初始化的功能,我们可以很方便的对系统进行恢复让系统回到一个最佳状态,虽然很多用户表示重装系统也没有什么关系,不过对于一些用户来说恢复显然比重装来的更简单,很多用户对Win10系统的恢复步骤还...
问题:        C++中如何初始化类中的表数据?在C语言中,我能像下面这样初始化结构数组:  // strUCt MYSTRUCT {     int x,y,z; };MYSTRUCT table[] = {     { 1,2,3 },     { 4,5,6 },     .....
final变量的初始化位置 一是其定义处,也就是说在final变量定义时直接给其赋值, 二是在构造函数中。而且在Java1.1以前,只能是在定义时给值。 三是在初如化代码块中{} 或者 static{} 代码如下: public class InitOrder {     {         System.out.println("before---field");  ...

经验教程

139

收藏

21
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部