内核窥秘之一:start_kernel()运行过程记录

本文系itspy原创,复制/转载请尽量标明原出处http://blog.csdn.net/yyplc/article/details/7030983,谢谢!
解开linux内核的神秘面纱,它是怎么运行起来的呢?它是怎么做到的?做了什么,怎么做,流程如何等等,均需要一个清晰的过程(因为要给我们一个说法~!),如何更好的亲密、深入的了解,接触它,找到一个很好的突破点是很关键的---那就是‘从头开始’(从linux的头开始)。本文将结合源码浅析并硬件平台上运行实践验证。
内核版本: linux-2.6.30.4
硬件CPU: s3c2440(arm920vt)
所有的程序员都知道,无论怎样,所有的入口点都是从‘main’函数开始的(start_kernel)。 废话~~
Linux的‘头’叫做一个start_kernel的函数,就是我们通常所说的main函数一样。
主要流程有:
{
…
printk(KERN_NOTICE"%s", linux_banner);  //输出linux版本信息
setup_arch(&command_line);   //设置与初始化硬件体系相关的环境并调用
                           //pageint_inig() ->devicemaps_init(mdesc);初始化异常向量表,初始化zone memory maps,初始化结构体:MACHINE_START等
sched_init()                 //初始化调度器…先于中断开始前
printk(boot_command_line);   //提取分析核心启动参数过程(从bootloader 中传递)
parse_early_param();
parse_args
trap_init();                  //自陷入口函数初始化,针对此版本arm中直接return
early_irq_init();              //中断初始化过程….
init_IRQ();          
init_timers();                //初始化定时器,开启定时器软中断服务以及注册服务程序以及初始化各CPU中的tev_base等init_timers()->run_timer_softirq()->__run_timers().. 
timekeeping_init(); 
time_init(); //设置定时器及返回当前时间
console_init() //初步的初始化控制台,此控制台只能打印出一些简单//的启动信息…
vmalloc_init(); //
vfs_caches_init_early(); //
mem_init(); //初始化内存并计算可用内存大小
kmem_cache_init(); // 初始化SLAB缓存分配器
calibrate_delay(); //延迟校准,jiffy,记录系统的定时器的节拍数,每变化一次代表了系统定时器2个连续节拍时间的间隔。
fork_init(num_physpages); //初始化max_threads,init_task参数为fork()提供参考
buffer_init(); //初始化块设备读写缓冲区
vfs_caches_init(num_physpages);   //初始化虚拟文件系统 inode_init() ->files_init() ->mnt_init()...
signals_init(); //初始化内核信号队列….
rest_init(); //最后实际进入reset_init()函数,包括所有剩下的硬件//驱动,线程初始化等过程…这也最终完成//start_kernel//的启动过程。
}

在进入reset_init(),首先创建系统的第一个线程kernel_init(),线程pid&

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值