这是一份珍贵的历史技术文档,包含了Linux操作系统最早的内核版本之一(0.11版)的源代码,并配有详细的中文注释,适合于对Linux早期发展史和技术细节感兴趣的开发者和学者研究参考。
这段代码是Linux内核初始化的一部分,并包含了一些重要的系统启动步骤。它从各种头文件导入必要的函数和数据结构,并定义了几个关键的C语言函数。
首先,代码包含了多个标准库文件以及与操作系统相关的头文件,如`unistd.h`, `fcntl.h`, `sys/ioctl.h`, 和其他特定于Linux内核的头文件等。这些导入确保程序能够访问系统调用和其他必要的功能。
接下来定义了几个静态全局变量和数组,例如用于存储命令行参数、环境变量以及初始化过程中使用的字符串数组。`argv_rc[]`和`envp_rc[]`分别代表执行rc脚本时传递给shell的参数列表及其环境设置;而`argv[]`和`envp[]`则是在创建新的用户会话时使用,指向的是不同的路径。
核心函数是 `init()`, 它负责启动系统初始化过程。这个函数首先调用一系列内核模块来读取硬盘分区信息,并且为虚拟磁盘分配空间以及安装根文件系统设备。接着它打开终端控制台作为标准输入、输出和错误流,然后创建一个新的子进程。
如果成功创建了子进程,`init()`将关闭当前的句柄0(stdin),并尝试以只读方式打开`/etc/rc`配置文件来执行初始化脚本。如果没有找到这个文件,则会调用_exit()函数终止该进程,并返回错误码1;否则它将继续运行shell程序。
对于父进程而言,一旦子进程被创建后,它将进入一个无限循环中等待子进程结束或遇到异常情况时重新启动一个新的子进程并继续初始化过程。如果在执行过程中发现任何问题(例如文件不存在),系统会打印相应的错误信息,并重复上述步骤直到所有必要的服务都成功运行起来。
最后的`move_to_user_mode()`函数用于切换到用户模式,这标志着内核引导阶段结束,控制权转移到了操作系统的第一级守护进程init上。