系统操作与I/O子系统详解
1. 系统启动与进程初始化
系统启动时,通过机器汇编执行 /sbin/init
。相关代码 icode
定义在 misc.s
文件中。执行 /sbin/init
的过程如下:
1. 分配并初始化一个地址空间数据结构,用于保存新进程的用户地址空间(参考 as_alloc()
)。
2. 分配一个文本段,并将其映射到进程的地址空间,用于保存代码(参考 as_map()
)。
3. 将 icode
从已知的固定虚拟内存地址复制到新创建的文本段。
4. 最后,分配一个栈段并将其分配给进程的地址空间。
当进程 1 下次切换使用 CPU 时,代码将在用户模式下执行。运行时,它首先会构建一个运行时栈,用作 exec
新程序映像的 argv
、 argc
和 envp
。 argv[0]
保存字符串 /etc/init
,该字符串硬编码在 icode
中(在文件系统中, /etc/init
符号链接到 /sbin/init
)。然后, icode
调用 exec()
,并使用在运行时栈上构建的参数。从那时起,进程 1