《30天自制操作系统》学习笔记-第1天

为了加深对操作系统的理解,我决定照着《30天自制操作系统》这本书实践一下。项目的github链接是https://github.com/YatesXu/YatesOSASK/

关于十六进制编辑器

第一个问题就是书中给的十六进制编辑器是日文的,在我的电脑上打开之后是一片乱码,于是我比较之后选用了这个十六进制编辑器wxMEdit,链接是https://wxmedit.github.io/

另外,visual studio也可以,但是express版不能用,所以还是选用免费开源的软件吧(笑)

(伪)启动程序代码

第一个程序是作者用汇编语言写的,应该是启动程序,但并没有加载操作系统的功能,只是输出了一个字符串。这里,我把我的项目命名为YatesOSASK(因为作者管他的系统交OSASK)照着书上的流程,基本没有问题(除了一开始丧心病狂的一堆0)

我把注释翻译了一下(从日文乱码)并且加了一些说明

; hello-os
; TAB=4,TAB键的宽度
; 一下为标准FAT12格式软盘专用代码,FAT格式是用windows或msdos格式化出来的软盘格式。

        DB        0xeb, 0x4e, 0x90
        DB        "HELLOIPL"        ;启动区名称,可以为任意字符串,IPL是启动程序加载器,用来加载操作系统
        DW        512                ;每个扇区的大小,必须为512字节
        DB        1                ; 簇的大小,必须为1扇区
        DW        1                ; FAT起始位置,第一个扇区开始
        DB        2                ; FAT个数,必须为2
        DW        224                ; 根目录大小,一般设为224项
        DW        2880            ;磁盘大小,必须是2880扇区
        DB        0xf0            ;磁盘种类,必须是0xf0
        DW        9                ; FAT长度,必须为9扇区
        DW        18                ; 1个磁道有几个扇区,必须为18
        DW        2                ; 磁头数,必须是2
        DD        0                ; 不使用分区,必须是0
        DD        2880            ; 重写一次磁盘大小
        DB        0,0,0x29        ; 意义不明,固定
        DD        0xffffffff        ; 可能是卷标号码
        DB        "HELLO-OS   "    ; 磁盘名称,11字节
        DB        "FAT12   "        ; 磁盘格式名称,8字节
        RESB    18                ; 先空出18字节

; 程序主体

        DB        0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
        DB        0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
        DB        0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
        DB        0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
        DB        0xee, 0xf4, 0xeb, 0xfd

; 信息显示部分

        DB        0x0a, 0x0a        ; 两个换行
        DB        "YatesOSASK"
        DB        0x0a            ; 换行
        DB        0

        RESB    0x1fe-$            ; 填写0x00直到0x001fe

        DB        0x55, 0xaa

; 一下是启动区以外的输出

        DB        0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
        RESB    4600
        DB        0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
        RESB    1469432

总结与思考

第一天的程序基本上就是熟悉了环境,体验了虚拟机,(因为2016年软盘太少见了哈),制作了一个伪启动程序,也算是对操作系统的最开始有了一点理解。

去年学习操作系统理论课的时候,都是概念,没有从实际中去理解。上学期的操作体统实验课,只是用c模拟了一些算法(进程调度啦通信啦),这本书从0开始做操作系统,应该是学以致用的良好契机。

时间: 2024-10-24 12:28:42

《30天自制操作系统》学习笔记-第1天的相关文章

《30天自制操作系统》笔记(12)——多任务入门

<30天自制操作系统>笔记(12)——多任务入门 进度回顾 上一篇介绍了设置显示器高分辨率的方法.本篇讲一下操作系统实现多任务的方法. 什么是多任务 对程序员来说,也许这是废话,不过还是说清楚比较好. 多任务就是让电脑同时运行多个程序(如一边写代码一边听音乐一边下载电影). 电脑的CPU只有固定有限的那么一个或几个,不可能真的同时运行多个程序.所以就用近似的方式,让多个程序轮换着运行.当轮换速度够快(0.01秒),给人的感觉就是"同时"运行了. 多任务之不实用版 我们首先从

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

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

《30天自制操作系统》笔记(08)——叠加窗口刷新

<30天自制操作系统>笔记(08)--叠加窗口刷新 进度回顾 上一篇中介绍了内存管理的思路和算法,我们已经可以动态申请和释放内存了.这不就是堆(Heap)么.在此基础上,本篇要做一段程序,一并解决窗口和鼠标的叠加处理问题. 问题 在之前的<<30天自制操作系统>笔记(05)--启用鼠标键盘>篇,已经能够移动鼠标了.但是遗留了如下图所示的一个小问题. 我们希望的情形是这样的: 实际上,当前版本的OS还没有窗口图层的东西.本篇要做一段程序,一并解决窗口和鼠标的叠加处理问题.

《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天自制操作系统》笔记(06)——CPU的32位模式

<30天自制操作系统>笔记(06)--CPU的32位模式 进度回顾 上一篇中实现了启用鼠标.键盘的功能.屏幕上会显示出用户按键.点击鼠标的情况.这是通过设置硬件的中断函数实现的,可以说硬件本身的设计就具有事件驱动的性质,所以软件层面上才有基于事件的消息机制. 但上一篇没有说明中断的来龙去脉,本篇就从头到尾描述一下CPU与此相关的设置问题. Segment 32位的CPU使用32条地址线,能区分232=4G个内存地址.每个内存地址都有1Byte的内容. 分段,就是将4GB的内存分成很多块(blo

《30天自制操作系统》笔记(04)——显示器256色

<30天自制操作系统>笔记(04)--显示器256色 进度回顾 从最开始的(01)篇到上一篇为止,已经解决了开发环境问题和OS项目的顶层设计问题. 本篇做一个小练习:设置显卡显示256色. 原理 设置显卡模式 调用BIOS中断命令INT 0x10,设置显卡模式为VGA图形模式,320*200*8位彩色模式,调色板模式.代码如下. 1 MOV AL,0x13 ; VGA图形模式,320*200*8位彩色模式 2 MOV AH,0x00 3 INT 0x10 设置调色板 256色的调色板是这样一个

《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天自制操作系统》笔记(09)——绘制窗口

<30天自制操作系统>笔记(09)--绘制窗口 进度回顾 上一篇中介绍了图层式窗口管理的思路和算法.在此基础上,本篇就解决绘制窗口及其简单的优化问题. 这里稍微吐槽一下<30天自制操作系统>原作者.全书我刚刚看了三分之一,写得确实不错,但是我能感受到原作者是习惯用汇编语言和汇编思维来写程序的.虽然书里尽量使用了C语言,但给我一种用C写汇编的感觉.也可能是原作者故意简化了OS开发过程,方便初学者理解吧.幸好这在我预料之中,一开始我就打算先看完这本书然后自己再从零设计OS的. 看似立体

《30天自制操作系统》笔记(07)——内存管理

<30天自制操作系统>笔记(07)--内存管理 进度回顾 上一篇中处理掉了绝大部分与CPU配置相关的东西.本篇介绍内存管理的思路和算法. 现在想想,从软件工程师的角度看,CPU也只是一个软件而已:它的功能就是加载指令.执行指令和响应中断,而响应中断也是在加载指令.执行指令.就像火车沿着一条环形铁轨前进:当中断发生时,就好像铁轨岔口处变轨了,火车就顺着另一条轨迹走了:走完之后又绕回来重新开始.决定CPU是否变轨的,就是CPU里的特定寄存器. 这是题外话,就此为止. 什么是内存管理 假设内存大小是

《30天自制操作系统》笔记(13)——总结

<30天自制操作系统>笔记(13)——总结 进度回顾 上一篇介绍了操作系统实现多任务的方法.操作系统利用CPU的far模式的JMP指令.寄存器TR.GDT.TSS和PIT中断这些功能实现了多任务,可见CPU在设计时就考虑到了计算机要具有多任务处理的能力.也就是说,CPU.PIC等硬件支持什么功能,操作系统才能实现什么功能. 至此全书已经读了一半.我发现后半部分读不下去,也没必要再读了.本篇就对所有的笔记做一总结,至此<30天自制操作系统>这本书就暂且不读了. 所学所感 我们可以把C