和菜鸟一起学linux内核之初始化init篇

注:以下大部分内容摘自linux内核编程入门篇和linux内核完全注释

       断断续续地看着内核源码,发现很多知识点都不是很明白,特别是对于操作系统的一些基础。虽然看到了块设备了,但是发现也总结不出什么了,这篇好像好久前更新的,一直没有发表。最近还是比较忙碌,同事走了好多人,也有考虑过别的公司。但是正式工作未满1年,也不能随随便便地就离开。虽然很忙,但是还是学了很多东西。渐渐地接触了linux应用层。发现应用和驱动还是有很多区别的,各种需求,各种接口,各种设计,各种实现。嗯,慢慢来总会学好的。对于内核,慢慢看,看一遍不懂,那就第二遍,第三遍。相信总会看懂的。Fighting。。。。。。。。

       初始化init下只有一个main函数。

       首先利用setup.s程序取得的程序参数设置系统的根文件设备号以及一些内存全局变量。这些内存变量指明了主内存的开始地址、系统所拥有的内存变量和作为高速缓冲区内存的末端地址。如果还定义了虚拟盘(RAMDISK), 则主内存将适当减少。

       然后,内核进行所有方面的硬件初始化工作。包括陷阱门、块设备、字符设备和tty包括人工创建第一个任务(task 0)。待所有初始化工作完成就设置中断允许标志,开启中断。

       在整个内核完成初始化后,内核将执行权切换到了用户模块,也即CPU从0特权级切换到了第3特权级。然后系统第一次调用创建进程函数fork(),创建出一个用于运行init()的子进程。

       在该进程中系统将运行控制台程序。如果控制台环境建立成功,则再生成一个子进程,用于运行shell程序/bin/sh。若该子进程退出,父进程返回,则父进程进入一个死循环内,继续生成子进程,并在此子进程中再次执行shell程序/bin/sh,而父进程则继续等待。

       对于linux来说,所有任务都是在用户模式执行的,包括很多系统应用程序,如shell程序、网络子系统程序等

和菜鸟一起学linux内核之初始化init篇_第1张图片

你可能感兴趣的:(和菜鸟一起学linux内核之初始化init篇)