[计算机操作系统] —— bootsect

531 阅读2分钟

x86开机处于实模式, CS=0xFFFF, IP=0x0000, 实模式CS<<4+IP, 寻址0xFFFF0(ROM BIOS), 检查RAM, 键盘, 显示器, 磁盘, 主板, 磁盘0磁道0扇区读入0x7c00, 512bytes, 这个是操作系统的第一段代码, 设置CS=0x07c0, IP=0x0000, 接着进入下面的代码,也就是bootsect。

START(0x7c00):
	mov ax, 0x07c0        mov ds, ax	; ds = 0x07c0
    mov ax, 0x9000        mov es, ax	; es = 0x9000
    
    ; src_address  = ds:si = 0x07c00
    ; dest_address = es:di = 0x90000
    sub si, si            sub di, di	; si = di = 0
    
	; 将主引导扇区从0x07c00拷贝到0x90000
    ; 256 * word = 512 byte
    mov cx, 0x0100		  rep movw		; 0100H = 256D
    
    ; CS:IP = 0x9000:BOOTLOADER
    jmpi BOOTSECT, 0x9000

BOOTSECT:
	; cl = 2 从第二个扇区开始读,第一个扇区是bootsect
    ; al = 4 读取扇区的个数,setup占四个扇区
    ; bx = 512D 将bootsect读到0x90200,bootsect占512字节
    
    ... 								; 省略了一些操作,如设置寄存器等
	mov dx, 0x0000						; dh磁头号 dl驱动器号
    mov cx, 0x0002						; ch柱面号 cl开始扇区
    mov bx, 0x0200						; es:bx待写入内存地址
    mov ax, 0x0204						; ah = 02读驱动器扇区 al扇区数量
    int 0x13							; BIOS读磁盘中断
    
    ; 在屏幕上显示字符串
    ...									; 省略了显示字符中断对寄存器的设置
	mov bp, msg
    int 0x10							; BIOS显示字符中断
    
    ; 继续使用0x13中断读入system,启动盘的第6个扇区
    ...
    call read_system
    jmpi 0x0200, 0x9000					; bootmain
    
msg:
	.byte 13, 10
    .ascii "loading system..."
	.byte 13, 10    

该段代码执行完毕后,控制权就交给setup了。