您的位置:首页 > 其它

《30天自制操作系统》U盘启动,真机运行(16天)

2015-07-10 20:18 316 查看
首先说一下到目前为止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的手册应该静下心来仔细阅读。相信如果你能把这几本书吃透,说明你的基础就真的特别的扎实了,不论你是准备编写应用程序,还是内核编程,还是嵌入式系统设计都不是问题。

平心静气,脚踏实地
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: