Skip to content

04 操作系统怎么把自己从硬盘搬运到内存?

你好,我是闪客。

上一讲,咱们说过了为访问内存,操作系统做的最最基础的准备工作。这一讲,我们要讨论的问题是,操作系统是怎么把在硬盘中的自己搬运到内存中来的。

图片

如上图所示,此时操作系统用短短几行代码,将数据段寄存器 ds代码段寄存器 cs 设置为了 0x9000,方便之后程序访问代码和数据。并且,将栈顶地址 ss:sp 设置在了离代码的位置 0x9000 足够遥远的 0x9FF00,保证栈向下发展不会轻易覆盖掉已有的代码。

简单说,就是设置了如何访问数据的数据段,如何访问代码的代码段,以及如何访问栈的栈顶指针,也即初步做了一次内存规划。从 CPU 的角度看,访问内存就这么三块地方而已。

图片

做好这些基础工作后,接下来又到了新一翻的“折腾”。上一讲结尾说过,我们目前仅仅把硬盘中最开始的 512 字节加载到内存中了,但操作系统还有很多代码仍然在硬盘的其他扇区里,不能抛下他们不管呀。

把剩下的操作系统代码从硬盘请到内存

所以下一步,自然是把仍然在硬盘里的操作系统代码请到内存中来。

我们接着往下看代码:

load_setup:
    mov dx,#0x0000      ; drive 0, head 0
    mov cx,#0x0002      ; sector 2, track 0
    mov bx,#0x0200      ; address = 512, in 0x9000
    mov ax,#0x0200+4    ; service 2, nr of sectors
    int 0x13            ; read it
    jnc ok_load_setup       ; ok - continue
    mov dx,#0x0000
    mov ax,#0x0000      ; reset the diskette
    int 0x13
    jmp load_setup

ok_load_setup:
    ...