首先说一下到目前为止U盘启动遇到的问题,首先的一个问题是“system volume information“,目前尚未解决,这个问题可能导致U盘启动失败,我猜测可能是由于每一次重新将OS写到U盘的时候原来的信息没有被清除,导致了在执行的时候把那些没有被覆盖掉的信息当成指令执行了。这个问题我会继续的追踪下去,力求能找到引起这个问题的真正原因是什么,如果有遇到同样问题的朋友,能留言相告。
下面是真机的运行截图(当然纯属装逼,哈哈)
下面还是展示ipl10.nas代码
; haribote-ipl
; TAB=4
CYLS EQU 10 ; 十个柱面
ORG 0x7c00 ; MBR在内存中的位置为(DS=0,0x07c00=DS+0x7c00)
; 系统相关设置信息
JMP entry
DB 0x90
DB "HELLOIPL" ; name of boot sector
DW 512 ; size of sector
DB 1 ; f
DW 1 ; FAT first sector
DB 2 ; FAT number
DW 224 ; root dir size
DW 2880 ; disk size in sector
DB 0xf0 ; disk type
DW 9 ; FAT length
DW 18 ; 18 sector each road
DW 2 ; disk up down
DD 0 ; no partition
DD 2880 ; reclaim the disk size
DB 0,0,0x29 ; reserve
DD 0xffffffff ; might be column
DB "HELLO-OS " ; disk name
DB "FAT12 " ; disk fs type
RESB 18 ; reserve 18 byte
; init程序入口
entry:
MOV AX,0 ;
MOV SS,AX
MOV SP,0x7c00 ; heap stack init
MOV DS,AX ; 初始化代码段的基地址在0x00000
; 读取磁盘到内存0x08200的位置
MOV AX,0x0820
MOV ES,AX
MOV CH,0 ; cylinder number
MOV DH,0 ; disk head number
MOV CL,2 ; sector number
readloop:
MOV SI,0 ; failed times
; retry to read disk if failed, read one sector
retry:
MOV AH,0x02 ; AH=0x02 : 读磁盘
MOV AL,1 ; 1扇区
MOV BX,0
;MOV DL,0x00 ; A驱动器
MOV DL,0x80 ; 驱动器号很关键
INT 0x13 ; 调用BIOS的函数例程
JNC next
ADD SI,1
CMP SI,5
JAE error
MOV AH,0x00
;MOV DL,0x00
MOV DL,0x80 ; 驱动器号很关键
INT 0x13
JMP retry
next:
MOV AX,ES
ADD AX,0x0020 ;每读取一个扇区内存向后偏移(ES+=0x0020)<<4
MOV ES,AX
ADD CL,1
CMP CL,62 ;62个扇区
JBE readloop
MOV CL,1
ADD DH,1
CMP DH,4 ;4磁头
JB readloop
MOV DH,0
ADD CH,1
CMP CH,4 ;4柱面
JB readloop
MOV [0x0ff0],CH
JMP 0xc200
error:
MOV SI,msg
JMP putloop
ok:
MOV SI,msg1
putloop:
MOV AL,[SI]
ADD SI,1 ; SI设置为1
CMP AL,0
JE fin
MOV AH,0x0e ; 在teletype模式下显示字符
MOV BX,15 ; 页码BH=0x00,前景色BL=0x0f
INT 0x10 ; BIOS显示服务
JMP putloop
fin:
HLT ; 暂停处理器
JMP fin
msg1:
DB 0x0a, 0x0a ; 换行符
DB "READ OKKKK"
DB 0x0a ; 换行符
DB 0
msg:
DB 0x0a, 0x0a ; 换行符
DB "load error"
DB 0x0a ; 换行符
DB 0
RESB 0x7dfe-$ ; (0x7dfe-当前位置)都填充0x00
DB 0x55, 0xaa
学习这本书到目前为止,还是学到了不少东西,其中包括计算机启动流程、BIOS中断向量表,实模式,保护模式,IDT,GDT,LDT,TSS,内存管理,定时器管理(这个主要是依赖时钟中断,时钟中断可是和任务调度密切相关,需要特别的注意),系统调用API,各种异常中断处理,可执行应用程序的编写(这当中可是和保护模式有很大的联系),还有就是深刻的体验到了模块化编程的各种好处。
在学习此书的过程中,遇到了很多问题,所以在此书的学习过程中,同时也学习了很多相关的数据,包括《linux内核的设计与实现》(PS:学习这本书的原因是因为我选择的课程就是讲授linux的内核,当然还是对此书的学习提供了很多的帮助,主要是概念上的理解和操作系统体系架构的理解);《深入理解linux内核》这本书很厚,但是讲解的比较细,但是如果你对计算机系统结构不是很了解的话,前面和硬件相关的部分理解起来比较困难,这本书对于有一定基础的人应该静下心来细看,肯定是有很大的收获,同时我认为这本书也可以作为内核编程的人的一本参考书籍;还有就是《386intel》手册,对于要学习《30天自制操作系统》的人来说intel386的手册应该静下心来仔细阅读。相信如果你能把这几本书吃透,说明你的基础就真的特别的扎实了,不论你是准备编写应用程序,还是内核编程,还是嵌入式系统设计都不是问题。
平心静气,脚踏实地
版权声明:本文为博主原创文章,未经博主允许不得转载。