Linux内核物理布局与关键机制解析
1. 内核从闪存执行的流程
当内核直接从闪存执行时,makefiles、ld脚本和引导代码紧密协作。ld规则将代码和只读段(如初始化调用信息)放入闪存,而将数据段(数据和以符号开始的块,即BSS)放在系统RAM中,这导致两者地址不连续。makefile提供特殊规则,将这些段合并为连续地址,并转换为适合上传到目标系统的格式。这是必要的,因为数据段包含已初始化的数据结构,必须写入只读内存,否则会丢失。在 start_kernel 之前运行的汇编代码,需要将数据段从闪存复制到RAM(到链接器指定的地址),并将BSS段相关的地址范围清零。只有完成这些重映射后,C语言代码才能运行。
上传新内核到目标系统时,固件从网络或串行通道获取数据文件,并写入闪存。上传内核到目标计算机的中间格式因系统而异,取决于实际上传方式。例如,BIN格式用于网络传输,S3格式是通过串行电缆发送到目标系统的十六进制ASCII文件。系统开机时,用户通常可以选择启动Linux或输入固件命令。
2. init进程
start_kernel 分叉出init线程(由 init/main.c 中的 init 函数实现),此时它和init线程都在内核模式下运行。完成所有初始化后,线程释放内核锁,准备执行用户空间的init进程。要执行的文件通常位于 /sbin/init 、 /etc/init 或 /bin/init ,若都未找到,则运行 /bin/s
超级会员免费看
订阅专栏 解锁全文
2033

被折叠的 条评论
为什么被折叠?



