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

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

平心静气,脚踏实地

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-23 23:28:18

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

《30天自制操作系统》笔记(03)——使用Vmware

<30天自制操作系统>笔记(03)--使用Vmware 进度回顾 在上一篇,实现了用IPL加载OS程序到内存,然后JMP到OS程序这一功能:并且总结出下一步的OS开发结构.但是遇到了真机测试和U盘启动的一些问题.本篇就来解决之. 遇到的问题 物理机测试 简单来说,把软盘(U盘)做成启动盘后,自然想要用来启动物理机器.毕竟这才是真正的测试.(用QEMU总没多大的成就感)但物理机测试的麻烦在于太慢了,每次都要关掉Windows,重启,测试,然后再重启Windows.而且还没办法截图. 而用Vmwa

关于U盘启动操作系统《30天自制操作系统》

原本的启动是从img启动的,并且这个img是用FAT12文件系统进行格式化的(详细去搜索FAT12文件格式,这里给大家推荐一篇http://www.doc88.com/p-646605198560.html),那么也就是说我们的img文件符合FAT12文件系统的格式了.接下来我们用winhex这个软件来查看我们的img文件,同一时候比对FAT12文件系统的格式,看是否我们的img文件同FAT12文件系统描写叙述的同样: 从上图中能够看到里面有一个haribotesys的文件夹项.那么我们看看我们

《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!

<30天自制操作系统>笔记(01)--hello bitzhuwei's OS! 最初的OS代码 1 ; hello-os 2 ; TAB=4 3 4 ORG 0x7c00 ; 指明程序的装载地址 5 6 ; 以下这段是标准FAT32格式软盘专用的代码 7 8 JMP entry 9 DB 0x90 10 DB "HELLOIPL" ; freeparam 启动区的名称可以是任意的字符串(8字节) 11 DW 512 ; 每个扇区(sector)的大小(必须为512字节)

《30天自制操作系统》读书笔记(2)hello, world

让系统跑起来 要写一个操作系统,我们首先要有一个储存系统的介质,原版书似乎是06年出版的,可惜那时候没有电脑,没想到作者用的还是软盘,现在的电脑谁有软驱?不得已我使用一张128M的SD卡来代替,而事实上你用的是U盘还是软盘对我们的操作系统没有影响,缺点是你的U盘刷入系统后容量只能是1440 MB,即当年流行的3.5英寸软盘的大小,当然不用担心,再格式化一次(用DiskGeniu),就可以恢复. 我做事情的话,总是怕自己的努力的结果白费了,害怕辛辛苦苦看完这本书但是发现做出来的东西现在根本没法用,

《30天自制操作系统》笔记(02)——导入C语言

<30天自制操作系统>笔记(02)--导入C语言 进度回顾 在上一篇,记录了计算机开机时加载IPL程序(initial program loader,一个nas汇编程序)的情况,包括IPL代码(helloos.nas).编译生成helloos.img文件.用虚拟机QEMU加载helloos.img.制作U盘启动盘和用物理机加载helloos.img. 计算机启动时会自动加载和执行IPL程序,但IPL程序只能占用512字节.若直接用IPL写OS,空间不够用.所以IPL程序一般用于将真正的OS程序

《30天自制操作系统》读书笔记(3) 引入C语言

这一次的学习相当曲折, 主要是因为粗心, Makefile里面的错误导致了文件生成出现各种奇奇怪怪的问题, 弄得心力交瘁, 因此制作过程还是尽量按着作者的路子来吧. 作者提供的源码的注释在中文系统下是乱码, 而且代码的分隔用了两个Tab, 在这里要处理一下: :%s/;.*//g 删除所有的注释; :%s/\t\t/\t 把两个Tab替换为一个Tab; 要让作者的nas文件和asm文件拥有相同的语法规则, 在_vimrc文件的最后一行添加 au BufNewFile,BufRead *.nas

《30天自制操作系统》读书笔记(5) GDT&amp;IDT

梳理项目结构 项目做到现在, 前头的好多东西都忘了, 还是通过Makefile重新理解一下整个项目是如何编译的: 现在我们拥有这么9个文件: ipl10.nas    InitialProgramLoader, 占用了软盘的第一个扇区并符合启动盘的规范, 默认被载入地址是0x7c00 到 0x7e00, 负责将10个柱面读入到0x8200到0x34fff (10个柱面共10*2*18 = 360 个扇区但是第一个没有被读入); asmhead.nas     包含一些暂时未知的设定; naskf

《30天自制操作系统》——从引导区到磁盘

上一篇讲了如何使用虚拟机运行我们写好的操作系统,但上一篇的操作系统其实仅仅存在于引导扇区中,接下来我们将看到程序如何从引导扇区跳到其他位置. 引导区内容的装载位置为0x00007c00-0x00007dff,规定该位置的人是当年开发IBM-PC的工程师们.0x7e00-0x9fbff是操作系统可以随便使用的内存位置.按照<30天自制操作系统>中所讲,我们把前10个磁道的数据都读入内存,内存位置从0x8000开始.因此磁盘镜像文件中,位于地址x的字符加载到内存的位置就为0x8000+x.现在设我

《30天自制操作系统》——虚拟机使用

<30天自制操作系统>是一本学习操作系统的好教材,它教我们怎么从建立引导区开始,从零实现一个操作系统.但是,实现书中例子的时候,我们需要不断将我们写好的操作系统代码写入软盘并且还要不断重启电脑来试验我们的代码,大家一定感到很头疼吧. 与其不停的重启,不如使用模拟器,向大家推荐一款模拟器qemu,它是由Fabrice Bellard编写,功能非常强大.那么下面我就来教大家使用qemu运行书中自制操作系统的方法吧. 一.安装qemu 我使用的是苹果笔记本,苹果有一个非常好用的程序管理工具叫brew