首页 理论教育 操作系统核心功能的初始化-操作系统实现之路

操作系统核心功能的初始化-操作系统实现之路

时间:2023-10-21 理论教育 版权反馈
【摘要】:在MINIKER.BIN模块初始化完成之后,通过一条跳转指令,直接跳转到MASTER.BIN开始处继续执行。上述几个函数做了一个清屏操作,然后打印出了两行提示信息,以指示用户目前系统引导状态。上述代码创建针对整个系统的虚拟内存管理器,并对之进行初始化。Hello China目前尚未实现进程机制,因此整个系统只有一个虚拟内存管理器。任何一个全局对象初始化失败都会导致系统停止启动,进入死循环。表3-3列举了上述初始化的全局对象,以及这些对象的功能。

操作系统核心功能的初始化-操作系统实现之路

在MINIKER.BIN模块初始化完成之后,通过一条跳转指令,直接跳转到MASTER.BIN开始处继续执行。需要注意的是,MASTER.BIN是采用Windows操作系统下的C++编译器编译的,编译结果为PE文件格式,这种文件格式的最开始部分,是一个PE文件头,并不是可执行的二进制代码。因此,我们通过一个特殊的工具(process工具,采用C语言编写的PE文件处理工具),把PE文件的开头部分替换为可执行的指令,并从PE头中提取出文件的入口地址,然后采用一条跳转指令,跳转到此处执行。下面是MASTER.BIN文件的开始部分(MASTER.BIN文件已经经过处理,下面是对MASTER.BIN进行反汇编所得结果的开头部分)。

978-7-111-41444-5-Chapter03-38.jpg

上述代码中,关键的一条JMP指令,跳转到了MASTER.BIN的入口处。

下面便是MASTER.BIN入口函数的实现代码。为了便于阅读,我们分段解释。

978-7-111-41444-5-Chapter03-39.jpg

DisableInterrupt函数禁止了外部可屏蔽中断,实际上,在MINIKER.BIN的初始化过程中,已经禁止了中断,在此重新做一个禁止中断操作,是为了编码上的统一,因为在该函数的尾部,会调用EnableInterrupt函数启用中断。

978-7-111-41444-5-Chapter03-40.jpg

上述几个函数做了一个清屏操作,然后打印出了两行提示信息,以指示用户目前系统引导状态。

978-7-111-41444-5-Chapter03-41.jpg

SetKeyHandler函数用于设置键盘中断处理程序,在Hello China最初的实现中,键盘驱动程序是在MINIKER.BIN模块里实现的,这样用户按键消息最初会被MINIKER.BIN模块捕获,为了把按键消息传递给MASTER.BIN模块,设计了一个回调机制,即在MASTER.BIN中实现一个处理函数(该函数就是_KeyHandler),把该函数的地址传递给MINIKER.BIN模块中的一个变量(该变量位于MINIKER.BIN末尾的特定位置),这样一旦发生键盘中断事件,MINIKER.BIN模块就以适当的参数调用该函数,MASTER.BIN就可以接收到这个按键事件,从而做进一步处理。但是在Hello China V1.75版的实现中,键盘驱动程序功能被剥离了出来,由单独的驱动程序实现,这样上述处理过程就无意义了。但为了兼容,还是保留了上述代码。

978-7-111-41444-5-Chapter03-42.jpg

上述代码完成页索引对象的初始化工作,详细信息可参考第5章。

978-7-111-41444-5-Chapter03-43.jpg

978-7-111-41444-5-Chapter03-44.jpg

上述代码创建针对整个系统的虚拟内存管理器,并对之进行初始化。在Hello China的实现中,为了对虚拟内存进行管理,实现了一个虚拟内存管理器(Virtual Memory Manager)的对象,用于对系统或单个进程的地址空间进行管理。Hello China目前尚未实现进程机制,因此整个系统只有一个虚拟内存管理器。但在未来的实现中,可能会引入进程模型,这样系统中就可能存在多个虚拟内存管理器对象(每进程一个),因此,没有把虚拟内存管理器对象作为全局对象实现,而是作为一个核心对象来实现。虽然目前情况下,整个系统只有一个虚拟内存管理器对象。另外需要注意的是,虚拟内存功能(在IA32构架CPU的实现中,表现为分页机制)是一个可选择的实现模块,通过预先定义的一个宏__ENABLE_VIRTUAL_MEMORY来控制,若在代码中定义了该宏,则在编译操作系统核心的时候,虚拟内存管理功能就会被包含,若没有定义该宏,则不会包含虚拟内存管理功能。

978-7-111-41444-5-Chapter03-45.jpg(www.xing528.com)

978-7-111-41444-5-Chapter03-46.jpg

上述代码完成了两项初始化功能:

(1)创建了空闲线程(Idle Thread)和用户交互线程(Shell Thread)。空闲线程在CPU空闲的时候被调度,用户线程用于完成用户界面功能。其中,Idle线程必须被创建,以完成CPU空闲时的处理,而shell线程则根据需要创建。在基于PC环境的Hello China中,shell用于完成用户输入/输出功能,若移植Hello China到其他硬件环境,shell线程则可根据需要决定是否创建。

(2)完成全局对象的初始化。所谓全局对象,就是整个系统运行环境只存在一个的对象,这些对象一般用于对整个系统中特定部分资源的统一管理。任何一个全局对象初始化失败都会导致系统停止启动,进入死循环。表3-3列举了上述初始化的全局对象,以及这些对象的功能。

表3-3 全局对象

978-7-111-41444-5-Chapter03-47.jpg

这些对象的详细功能及其实现方式等,将会在后面章节进行详细介绍,这也是本书的重点内容。需要注意的是,DeviceInputManager对象是在shell线程创建之后才初始化的,因为该对象的初始化函数需要有一个具体的线程作为当前焦点线程(也可以不指定焦点线程),这样后续的任何主动输入(键盘、鼠标等用户交互设备的输入),都可以被定向到当前焦点线程。在当前的实现中,shell线程被作为当前焦点线程,即任何用户输入,首先被shell感知,然后由shell做进一步处理,这是符合shell线程的功能的。当然,可以根据需要,采用其他线程来替代shell线程,作为当前焦点线程。比如,可以把Hello China移植到一个手持设备上,这样需要实现一个交互式的图形界面。这时候,可以把这个交互式的界面,以一个线程的形式实现,并把该线程作为当前焦点线程,任何输入都可以定向到该线程,从而完成用户和设备的交互。

978-7-111-41444-5-Chapter03-48.jpg

上述代码完成了IA32 CPU环境下,分页机制的使能工作。在此之前,所有对内存的访问都是把线性地址直接映射到物理地址的,在使能分页功能之后,对内存的访问将经过分页机制的映射。在当前的实现中,把线性地址空间的前20MB依然映射到物理内存的前20MB,这样可实现分页功能对操作系统代码的透明程度。当然,分页机制是否使能,是可以通过定义宏__ENABLE_VIRTUAL_MEMORY来进行控制的。

978-7-111-41444-5-Chapter03-49.jpg

上述代码用于连接通用中断处理程序和中断。在当前的实现中,对所有的中断处理,都是采用同一个函数GeneralIntHandler作为入口的,然后GeneralIntHandler再调用System对象的相应函数,完成中断的进一步分发(详细信息请参考第8章)。在Hello China的当前实现中,GeneralIntHandler是在MASTER.BIN模块中实现的,而所有的中断描述表(IDT),则是定义在MINIKER.BIN中,SetTimerHandler函数完成连接GeneralIntHandler和MINIKER.BIN模块中的中断处理程序的功能。从名字上看,该函数似乎是完成时钟中断处理程序的设置,其实不然,该函数完成了通用中断处理函数GeneralInitHandler和所有IDT之间的连接。之所以用SetTimerHandler作为函数名,是由于历史原因造成的。关于中断的详细信息,请参考第8章。

978-7-111-41444-5-Chapter03-50.jpg

上述代码打印出提示符(机器名),并启用中断,然后进入一个死循环。这个死循环的作用,是为了等待一个时钟中断发生后,开始正式调用线程。实际上,系统初始化过程的代码,包括REALINIT.BIN、MINIKER.BIN等模块,不属于任何线程,或者可以看作一个初始化线程,系统一旦初始化完毕,这个初始化线程就算运行完毕,这时候,如果不进入一个死循环,则__init函数返回后,可能会使CPU进入一个不确定的状态,从而导致系统崩溃。需要注意的是,这个死循环并不会真正导致系统死循环,一旦时钟中断发生,线程调度程序会选择一个状态为就绪的线程(Idel或shell),重新投入运行,这样初始化线程就算正式结束了。更详细的内容,在第4章中有详细介绍。

最后部分的代码是出错处理部分。在初始化过程中,遇到任何一个错误都可能导致初始化失败,__init函数跳转到__TERMINAL标号处,打印出一个出错信息,然后进入死循环,这时候必须采用关闭电源的方式,对计算机进行重新引导。

到此为止,Hello China的启动就算完成了,这之后,shell线程将得到调度,从而完成用户和计算机之间的交互。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈