|
目录中可以找到 IP(版本 4)代码。
scripts/:这个目录中包含的脚本可用于内核的构建,但并不将任何代码加入到内核本身之中。例如,各种配置工具可以将它们的文件放在这里。
security/:在这里可以找到不同 Linux 安全模型的代码,比如 NSA Security-Enhanced Linux 以及套接字和网络安全钩子函数(hooks),以及其他安全选项。
sound/:这里放置的是声卡驱动程序和其他与声音相关的代码。
usr/:此目录中的代码用于构建包含 root 文件系统映像的 cpio-格式 的归档文件,用于早期用户空间。
所有这些汇集在哪里?
init/main.c 文件是整个 Linux 内核的中央联结点。每种体系结构都会执行一些底层设置函数,然后执行名为 start_kernel 的函数(在 init/main.c 中可以找到这个函数)。
代码的执行顺序大致如下:
Architecture-specific set-up code (in arch//*)
|
v
The function start_kernel() (in init/main.c)
|
v
The function init() (in init/main.c)
|
v
The user level "init" program
|
关于执行顺序的更多细节
更详细地讲,发生的事情是:
- 执行体系结构相关的设置代码:
- 如果需要,解压缩并移动内核代码本身
- 初始化硬件
- 将控制权转交给函数
start_kernel()
start_kernel() 去执行以下事情(以及其他事情):
- 打印内核版本和命令行
- 启动控制台输出
- 启用中断
- 校准延迟循环
- 调用
rest_init(),这个函数会:
- 启动一个内核线程来运行
init() 函数
- 进入空闲循环
init():
- 启动其他处理器(在 SMP 机器上)
- 启动设备子系统
- 挂载 root 文件系统
- 释放不使用的内核内存
- 运行
/sbin/init(或者 /etc/init,或者...)
此时,用户级 init 程序正在运行;它将完成启动网络设备并在控制台上运行 getty (登录程序)等任务。
加入自己的 printk,并观察那个子系统的 printk 相对于自己的 printk 何时出现,就可以指出那个子系统是在 start_kernel() 中还是在 init() 中初始化的。例如,如果想要知道 ALSA 声音系统何时被初始化,那么将 printk 加入到 start_kernel() 和 init() 的起始处,然后找到“Advanced Linux Sound Architecture [...]” 相对于您的 printk 在何处打印出来。
共2页: 上一页 [1] 2 下一页
|