第01天,hello world《30天自制操作系统学习笔记》

第01天,hello world《30天自制操作系统学习笔记》自备书籍 30 天自制操作系统 000 0000 到 000 0090 输入以下内容 000 0090 到 168 000 开始后面全都是 00 可以复制粘贴

大家好,欢迎来到IT知识分享网。

序言

  1. 自备书籍:30天自制操作系统
  2. 光盘文件:https://github.com/hi347/30makeos

如何启动二进制编辑器?

“二进制编辑器”(Binary Editor)是一种能够直接对二进制数进行编辑的软件

第01天,hello world《30天自制操作系统学习笔记》

第01天,hello world《30天自制操作系统学习笔记》

第01天,hello world《30天自制操作系统学习笔记》

如何制作二进制文件?

000:0000 到 000:0090输入以下内容

第01天,hello world《30天自制操作系统学习笔记》

000:0090 到 168:000开始后面全都是00,可以复制粘贴

第01天,hello world《30天自制操作系统学习笔记》

0001F0 附近不全是00,修改参数

第01天,hello world《30天自制操作系统学习笔记》

001400附近不全是00,修改参数

第01天,hello world《30天自制操作系统学习笔记》

保存文件:命名为helloos.img(文件大小 =1440×1024字节 =字节 )

此时完成了软盘映像文件的制作

第01天,hello world《30天自制操作系统学习笔记》

第01天,hello world《30天自制操作系统学习笔记》

源文件路径:projects\01_day\helloos0\helloos.img

如何启动二进制文件?

第01天,hello world《30天自制操作系统学习笔记》

2.复制:所有文件到projects\01_day

第01天,hello world《30天自制操作系统学习笔记》

3.进入:helloos0文件夹

第01天,hello world《30天自制操作系统学习笔记》

除了helloos.img,还有其他4个文件

看看!cons_nt.bat内部长啥样,鼠标右键,编辑

第01天,hello world《30天自制操作系统学习笔记》

cmd.exe

原来是在windows系统下启动cmd方法,只有一行代码!

!cons_nt.bat名称太难记了,改名为cmd.bat

再看看!cons_9x.bat内部长啥样

command

原来是在苹果mac系统下启动command方法,只有一行代码!

第01天,hello world《30天自制操作系统学习笔记》

根据自己的系统,保留一个文件即可!

再来看看run.bat文件,这是启动虚拟机的指令

copy helloos.img ..\z_tools\qemu\fdimage0.bin ..\z_tools\make.exe -C ../z_tools/qemu
第01天,hello world《30天自制操作系统学习笔记》

再来看看install.bat文件,这个文件暂时用不到,可以删掉

..\z_tools\imgtol.com w a: helloos.img

此时只剩下三个文件

第01天,hello world《30天自制操作系统学习笔记》

双击:cmd.bat
输入:run
按下:回车键

第01天,hello world《30天自制操作系统学习笔记》

第01天,hello world《30天自制操作系统学习笔记》

helloos.img系统成功启动!显示:hello, world


第01天,hello world《30天自制操作系统学习笔记》

开始创建虚拟机

第01天,hello world《30天自制操作系统学习笔记》

第01天,hello world《30天自制操作系统学习笔记》

第01天,hello world《30天自制操作系统学习笔记》

第01天,hello world《30天自制操作系统学习笔记》

第01天,hello world《30天自制操作系统学习笔记》

第01天,hello world《30天自制操作系统学习笔记》

第01天,hello world《30天自制操作系统学习笔记》

第01天,hello world《30天自制操作系统学习笔记》

第01天,hello world《30天自制操作系统学习笔记》

第01天,hello world《30天自制操作系统学习笔记》

找到helloos.img文件,然后关闭即可

第01天,hello world《30天自制操作系统学习笔记》

第01天,hello world《30天自制操作系统学习笔记》

出现弹窗,不用管,点确定

第01天,hello world《30天自制操作系统学习笔记》

第01天,hello world《30天自制操作系统学习笔记》

既然vm虚拟机可以用!
windows10自带的hyper-v虚拟机怎么启动img系统?
hyper-v不支持img系统文件

第01天,hello world《30天自制操作系统学习笔记》

做了什么?

为什么用这种方法就能开发出操作系统来呢?
CPU(二进制) = 与其他电路进行电信号交互,只起到开(ON)/关(OFF)作用,
把电信号的开(ON)/关(OFF)与数字0和1对应起来, 就能将二进制数转换为电信号。
还可以用0100 1011 0100 1111 0100 1111 0100 0010这32个电信号来表示“BOOK”,
这实际上就是电脑内部,保存这个单词时的电信号集合,给每个文字都编上号。
(即文字编码ASCII编码),就可以建立一个文字与数字的对应关系。

二进制只有0和1,十六进制有0ABCEDF 0 =0 1 =1 10 =2 11 =3 100 =4 101 =5 110 =6 111 =7 1000 =8 1001 =9 1010 =A=10 1011 =B=11 1100 =C=12 1101 =D=13 1110 =E=14 11111 =F=15

一起来体验汇编语言吧!

二进制语言挺好的,为什么又要学新的汇编语言?
二进制需要输入大量的0,即便是复制粘贴也是费时费力的
而汇编语言中只需要输入一行代码即可搞定!

第01天,hello world《30天自制操作系统学习笔记》

如何制作汇编文件?

删除:二进制文件helloos.img
新建:汇编文件helloos.nas,文件内容如下
(先创建一个helloos.txt文件,内容填写后,后缀改为helloos.nas即可)

DB 0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f DB 0x49, 0x50, 0x4c, 0x00, 0x02, 0x01, 0x01, 0x00 DB 0x02, 0xe0, 0x00, 0x40, 0x0b, 0xf0, 0x09, 0x00 DB 0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 DB 0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff DB 0xff, 0xff, 0xff, 0x48, 0x45, 0x4c, 0x4c, 0x4f DB 0x2d, 0x4f, 0x53, 0x20, 0x20, 0x20, 0x46, 0x41 DB 0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00 RESB 16 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, 0x0a, 0x0a, 0x68, 0x65 DB 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72 DB 0x6c, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 368 DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 4600 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 
  • 与helloos.img对比来看,少写了很多行0
  • 0x是十六进制,没有0x是十进制.
  • DB(define byte) 声明字节:往文件里写入1个字节的指令
  • RESB(reserve byte)预定字节:从当前行数到指定行数自动填充0x00
  • 1GB=1024MB,1MB=1024KB,1KB=1024byte,1字节byte=8比特bit(8位0和1).

目前来看,汇编语言的优势:

1. 少写很多行0

2. 二进制升级为十六进制

如何转换汇编文件?

接下来把helloos.nas文件转换成helloos.img即可

新建:asm.bat文件,填写如下内容

..\z_tools\nask.exe helloos.nas helloos.img
第01天,hello world《30天自制操作系统学习笔记》

此时,只有4个文件

第01天,hello world《30天自制操作系统学习笔记》

helloos.img文件生成啦!

继续输入:run,然后回车

第01天,hello world《30天自制操作系统学习笔记》

试试用vm虚拟机运行生成的helloos.img

迭代更新?

看不懂汇编文件!

第01天,hello world《30天自制操作系统学习笔记》

给汇编文件添加注释

DB 0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f ; 第一行 DB 0x49, 0x50, 0x4c, 0x00, 0x02, 0x01, 0x01, 0x00 ; 启动区名称 = 任意字符串 = 8个字节 (必须) DB 0x02, 0xe0, 0x00, 0x40, 0x0b, 0xf0, 0x09, 0x00 ; 簇(cluster)的大小 = 1个扇区(必须) DB 0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 ; FAT的个数 = 2(必须) DB 0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff ; 磁盘种类 = 0xf0(必须) DB 0xff, 0xff, 0xff, 0x48, 0x45, 0x4c, 0x4c, 0x4f ; 意义不明,固定 DB 0x2d, 0x4f, 0x53, 0x20, 0x20, 0x20, 0x46, 0x41 ; 磁盘名称 = 11个字节(必须) DB 0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00 ; 磁盘格式名称 = 8字节(必须) RESB 16 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, 0x0a, 0x0a, 0x68, 0x65 ; 0x0a = 换1行,0x0a + 0x0a=换2行 DB 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72 ; 展示效果"hello, world" = 12个字符 DB 0x6c, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00 ; 0x0a = 换1行 RESB 368 DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa ; 第510个字节,第511个字节,必须保证该位置两个参数不变 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 ; 启动区以外部分的输出 RESB 4600 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 

对汇编文件进行专业化整理(简化代码)

; hello-os ; TAB=4 ; setup: 标准FAT12格式软盘专用代码 DB 0xeb, 0x4e, 0x90 ; 意义不明,固定 DB "HELLOIPL" ; 启动区名称 = 任意字符串 = 8个字节 (必须) DW 512 ; 1个扇区(sector)的大小 = 32*16 =512个字节(必须) DB 1 ; 簇(cluster)的大小 = 1个扇区(必须) DW 1 ; FAT的起始位置 = 第一个扇区(通常) DB 2 ; FAT的个数 = 2(必须) DW 224 ; 根目录的大小 = 244项(通常) DW 2880 ; 该磁盘大小 = 2880个扇区(必须) DB 0xf0 ; 磁盘种类 = 0xf0(必须) DW 9 ; FAT的长度 = 9个扇区(必须) DW 18 ; 1个磁道(track)= 18个扇区(必须) DW 2 ; 磁头数 = 2个(必须) DD 0 ; 不使用分区 = 0(必须) DD 2880 ; 重写1次 = 磁盘大小 DB 0,0,0x29 ; 意义不明,固定 DD 0xffffffff ; 卷标号码(猜测) DB "HELLO-OS " ; 磁盘名称 = 11个字节(必须) DB "FAT12 " ; 磁盘格式名称 = 8字节(必须) RESB 16 ; 空出 = 16字节(必须),作者这里写成18了,应该是8*8=16个字节 ; draw: 程序主体 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 ; 换2行 DB "hello, world" DB 0x0a ; 换1行 DB 0 RESB 0x1fe-$ ; 从该行到0x001fe行,填写0x00 DB 0x55, 0xaa ; 第510个字节,第511个字节,必须保证该位置两个参数不变 ; 启动区以外部分的输出 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 4600 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB  

简化(专业)后的汇编文件有好多新单词

第01天,hello world《30天自制操作系统学习笔记》

技能3:; 注释功能 技能4:DB第二个特效,直接输入字符串,编译器自动转换为十六进制编码 技能5:DW(difine word),word是16位bit = 2个byte 技能6:DD(difine double-word),double-word是32位bit = 4个byte 技能7:RESB 0x1fe - $ ,其中$表示从第一行到这一行的字节总数,相减就是需要填充的字节数 技能8:TAB=4 , 将TAB键的宽度设定成4 ,写代码时的缩进功能 技能9:FAT12格式, FAT12 Format , 用Windows或MS-DOS格式化出来的软盘就是这种格式 技能10:启动区, (boot sector)软盘第一个的扇区称为启动区。 什么扇区?计算机读写软盘的时候,并不是一个byte一个byte地读写的, 而是以512个byte作为一组,一组一组的读写。因此,软盘的512个byte一组就称为一个扇区。 一张软盘1440KB =1440个 * 1024byte= byte /512byte = 2880组=2880个扇区。 计算机从第一个扇区开始读软盘,如果最后两个字节正好是0x55 AA, 那它就认为这个扇区的开头是启动程序,并开始执行这个程序,否则报错。 (为什么一定是0x55 AA呢?未解之谜!) 技能11:IPL( initial program loader)启动程序加载器, 启动区只有512个字节, 实际的操作系统不像hello-os这么小,根本装不进去。所以几乎所有的操作系统, 都是把加载操作系统本身的程序放在启动区里的。有鉴于此,有时也将启动区称为IPL。 但hello-os没有加载程序的功能,所以HELLOIPL这个名字不太顺理成章。 技能12:启动(boot) 是bootstrap的缩写, “自力更生完成任务”的意思。 磁盘上明明装有操作系统,还要说读入操作系统的程序 (即IPL)也放在磁盘里, 这就像打开宝物箱的钥匙就在宝物箱里一样,是一种矛盾的说法。 这种矛盾的操作系统自动启动机制,被称为bootstrap方式。 boot这 个说法就来源于此。如果是笔者来命名的话, 肯定不会用bootstrap 这么奇怪的名字,笔者大概会叫它“多级火箭式”吧。

第一天就这样吧,不需要完全搞懂,先运行成功即可

第01天,hello world《30天自制操作系统学习笔记》

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/178078.html

(0)
上一篇 2025-05-07 08:20
下一篇 2025-05-07 08:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信