日期:2014-05-16  浏览次数:20681 次

《linux 内核完全剖析》 chapter 7 初始化程序

初始化程序



7.1 main.c 程序



         图中,高速缓存的部分还要扣除显存和ROM BIOS占用的部分。告诉缓冲区是用于磁盘等块设备临时存放数据的地方,以1K字节为一个数据单位。



init().函数的功能可分为四个部分

  • 安装根文件系统
  • 显示系统信息
  • 运行系统初始资源配置文件rc中的命令
  • 执行用户登录程序shell程序





要注意的是,由于创建新进程的过程通过完全复制父进程代码段和数据段的方式实现。因此在首次使用fork()创建新进程init时,为了确保新进程用户态栈中没有进程0的多余信息,要求进程0在创建第一个新进程(进程1)之前不要使用其用户态栈,即要求任务0不要调用函数。(个人理解,之前的变量全都放寄存器上面了,不需要经过栈).因此在main.c主程序移动到任务0执行后,任务0中的代码fork()不能以函数形式进行调用。程序中实现的方法是采用内联函数的形式实现的。

 


7.1.3 CMOS信息


CMOS的地址空间在基本地址空间之外,因此其中不包括可执行代码。






2.fork()是一个syscall。除此之外,对于fork所有的了解可以去复习看APUE。那样更爽,《注释》说的很简略。




7.2环境初始化工作



init进程的主要任务是根据/etc/rc文件中设置的信息,执行其中设置的命令,然后根据/etc/inittab文件中的信息,为每一个允许登录的终端设备使用fork()创建一个子进程,并在每个新创建的子进程中运行agetty程序。


在正常操作下,init确定agetty在工作着以允许用户登录,并且收取zombie。当系统关闭时,init负责杀死所有其他进程,卸载所有文件系统以及停止处理器的工作,以及任何它被配置成要做的工作。


getty程序主要任务是设置终端类型,属性,速度和线路规程。


login程序主要用于要求登录用户输入密码。












马上就要开始第八章的“洗礼”了 chapter 8 is coming