【操作系统】计算机的启动过程

  计算机的启动过程十分复杂,在这里仅仅写一下我个人大致的理解。(以Intel x86结构为例)
1.计算机在按下电源键之后,CPU处于实模式寻址。CS=0xFFFF;IP=0x0000。

CS(Code segment)是一个16位段寄存器,IP是指令指针寄存器(段内偏移),也是16位寄存器。处于实模式寻址时,实际寻找的地址是将CS的值左移4位加上IP的值得到的地址。实际上是20位寻址,因此最大可寻址内存空间为1MB。

2.CS=0xFFFF;IP=0x0000,寻址0xFFFF0,在内存空间中,从0XFFFF0开始的一段内存空间(具体大小是多少?)是固化的,叫做ROM BIOS映射区(即基本输入输出系统)。这一段空间是计算机上电后内存里面唯一有代码的空间,这一段代码的作用是检查RAM,键盘,显示器,软硬磁盘等硬件是否存在问题。

3.将磁盘0磁道0扇区里的内容读入内存地址0x7c00处。然后设置CS=0x07c0,IP=0x0000。这段内容的大小是512字节。0磁道0扇区是操作系统的引导扇区。是操作系统的第一段代码,这段代码是bootsect.s(.s表示汇编代码)

bootsect.s的作用
这段代码干了好几件事情:

1.将bootsect.s从地址0x7c00开始的区域转移到0x9000中。后面会看到这样做的目的就是为了腾出空间。

start
    mov ax,#BOOTSEG  //BOOTSEG=0x07c0
    mov ds,ax  
    mov ax,#INITSEG  //INITSEG=0x9000,SETUPREG=0x9020
    mov es,ax  
    mov cx,#256  
    sub si,si  
    sub di,di  
    rep  
    movsw    //一次移动两个字节,256B*2=512B
    jmpi go, INITSEG

2.加载setup模块

//0x13是BIOS读磁盘扇区的中断: ah=0x02-读磁盘,al=扇区数量(SETUPLEN=4),ch=柱面号,cl=开始扇区,dh=磁头号,dl=驱动器号,es:bx=内存地址

go: mov ax,cs //cs=0x9000
    mov ds,ax mov es,ax mov ss,ax mov sp,#0xff00
load_setup: //载入setup模块
    mov dx,#0x0000
    mov cx,#0x0002    //cx低8位为2,表示从第二个扇区开始读
    mov bx,#0x0200
    mov ax,#0x0200+SETUPLEN int 0x13 //int 0x13是BIOS中断,读磁盘,ax低八位是SETUPLEN,表示需要读取的扇区数量,即为4个扇区。
    jnc ok_load_setup
    mov dx,#0x0000
    mov ax,#0x0000 //复位
    int 0x13
    j load_setup //重读

读取4个扇区的数据接着在bootsect后面存放,可以看到ex:bx组成的地址刚好是boot后面的第一个字节。

【操作系统】计算机的启动过程_第1张图片

3.读入setup之后:Ok_load_setup

Ok_load_setup: //载入setup模块
    mov dl,#0x00 mov ax,#0x0800 //ah=8获得磁盘参数
    int 0x13 mov ch,#0x00 mov sectors,cx
    mov ah,#0x03 xor bh,bh int 0x10 //读光标
    mov cx,#24 mov bx,#0x0007
    mov bp,#msg1mov ax,#1301 int 0x10 //显示字符
    mov ax,#SYSSEG //SYSSEG=0x1000
    mov es,ax
    call read_it //读入system模块
    jmpi 0,SETUPSEG

(未完待续)

你可能感兴趣的:(Linux)