第5章 从内核空间到用户空间
前面,我们从无到有,编译了内核,构建了initramfs和一个基本的根文件系统,成功启动了用户空间的第一个进程。虽然我们只是迈出了一小步,但是这是关键的一步。在此基础上,我们可以放开手脚,去探索曾经的遥不可及。但是,我们也才刚刚破冰,学而不思则罔,因此,在继续构建一个完整的操作系统之前,我们先来更深入的探索一下这一切是如何发生的。
曾经不止一次,笔者在各个技术文章、书籍、甚至顶尖高校的讲义中,都看到类似的论述:内核首先进入实模式,然后从实模式跳入保护模式,事实果真如此吗?在这一章中,我们首先从Linux操作系统的加载谈起。
对于普通程序,它们运行在操作系统已经为其准备好的环境中,操作系统则没有这么幸运,其运行在裸机上。操作系统需要在裸机上自己引导自己,而且还要为运行进程搭建好环境。因此,本章的5.2节和5.3节将讨论内核是如何自解压以及如何初始化的。
操作系统最终的目的之一是承载进程。因此,在本章的最后,我们讨论了进程的加载和运行。提及进程的加载和运行,我们几乎将所有的关注都放在了内核上,却往往忽略了另外一个为进程辅以建立运行环境的重要角色:动态链接器。在进程加载中,相当一部分烦琐而又重要的工作由动态链接器完成。因此,除了讨论进程在内核中的加载过程外,我们也深入探讨了进程在用户空间的加载和链接过程。