之前我们了解了计算机启动内核的流程,其中启动阶段涉及到的程序有mbr和loader两个,
mbr注意点有两个:一. 实模式下磁盘作函数 d_disk_m_16 二.mbr大小及格式
一.实现d_disk_m_16函数
1 ;---------------- 实模式读取硬盘n个扇区函数--- 2 rd_disk_m_16: 3 ;eax=LBA扇区数 ebx=将数据写入的内存地址 ecx=读入的扇区 4 mov esi,eax 5 mov di,cx 6 7 mov dx,0x1f2 8 mov al,cl 9 out dx,al 10 11 mov eax,esi 12 13 mov dx,0x1f3 14 out dx,al 15 16 mov cl,8 17 shr eax,cl 18 mov dx,0x1f4 19 out dx,al 20 21 shr eax,cl 22 mov dx,0x1f5 23 out dx,al 24 25 shr eax,cl 26 and al,0x0f 27 28 or al,0xe0 29 mov dx,0x1f6 30 out dx,al 31 32 mov dx,0x1f7 33 mov al,0x20 34 out dx,al 35 36 .not_ready: 37 nop 38 in al,dx 39 and al,0x88 40 cmp al,0x08 41 jnz .not_ready 42 43 mov ax,di 44 mov dx,256 45 mul dx 46 47 mov cx,ax 48 49 mov dx,0x1f0 50 51 .ready_go: 52 in ax,dx 53 mov [bx],ax 54 add bx,2 55 loop .ready_go
56 ret
二.mbr大小格式
mbr大小必须是一个扇区及512字节,并且结尾两个字节为固定的0x55,0xaa
实现:
1 ;------------------------ 填充0 ----------------------- 2 3 times 510-($-$$) db 0 4 5 db 0x55,0xaa
源码链接:github
参考书籍
1.《操作系统真象还原》
2.《课堂在线ucore_lab》