《30天自制操作系统》 day0-day2小结
笑
花了一段时间研读《自己动手写操作系统》,后有朋友建议最好是以C语言为工具进行编程学习,并因此向我推荐了《30天自制操作系统》这本书。
会心一笑
理论部分:
当计算机电源被接通时(开机),系统首先执行开机自检(POST),随后开始搜索启动介质(启动盘)。如果选择从软盘启动(floppy drive),系统将探测软盘的第一面第一磁道的第一个扇区(通常记作A:1,1)。若此区域的尾部标识符读取到字节序列AA 55,则系统将其视为引导扇区(Boot Sector)。一个完整的Boot Sector不仅以AA 55结尾(AA 55H),而且还应包含至少包含有大小写为至少512个字节的执行代码块(EXECUTE SECTOR)。一旦BIOS识别出Boot Sector的存在并读取其中的内容后(下载),该数据会被传输至内存地址$[...]:7CXX处,并通过执行这段代码实现对整个系统的控制。
NASM语法:(1)任何未被方括号包围的标签或变量名被视为地址,在访问标签内容时需使用[]
例如:foo dw 1
mov ax, BootMessage
mov ax, foo 相当于获取foo地址并将其传入ax寄存器
而mov ax, [foo] 则会将bx寄存器的内容赋给ax寄存器
此外,在nasm中无需担心$符号的问题 因为未加方括号的标签即为Offset
(2)$符号在KaTeX中出现了一个特殊的情况 它表示当前行代码距离程序起始点处的距离 - 则代表从当前行代码到程序起始点的距离
然后是相关寄存器:

都是16位寄存器,因此可以存储16位的二进制数。

8个8位寄存器

32位寄存器

段寄存器,16位
MOV BYTE [678],123
MOV WORD [678],123
DB,BW和DD
汇编语言中指定内存地址通常采用以下方式编写代码:数据大小后跟目标地址。然而,在实际编程中使用寄存器指定内存地址并非常见做法。由于可用作目标地址的寄存器种类有限,通常仅限于BX、BP、SI和DI这四个寄存器。剩下的AX和CX等寄存器不具备这样的功能。当需要将DX中的内容复制到AL时,则会按照以下步骤操作:首先将BX registers的值移动到AL中(即执行"MOV BX, DX"),然后执行以下操作:"接着再执行"MOV AL,BYTE [BX]"这一指令。此外,请注意MOV指令的一个重要特性是有关源操作数与目标操作数位对齐的要求。
INT( interrupt )是一种软件中断指令。这些预先封装在 ROM 中的 BIOS 内部函数能够被调用。

INT 0x10 调用显卡

工具部分:
| 直接编辑二进制文件后操作 | 所需执行文件 | 输入 | 输出 | 文件内容 | 操作或者输入指令 | 目的 |
|---|---|---|---|---|---|---|
| * | !cons | 二进制编辑好的img文件 | 虚拟操作系统开始运行 | cmd.exe | 双击执行 | 启动虚拟机加载img运行操作系统 |
| * | run.bat | copy helloos.img …\tolset\z_tools\qemu\fdimage0.bin …\tolset\z_tools\make.exe -C …\tolset\z_tools\qemu | run | 移动img文件到虚拟机目录下 | ||
| * | install.bat | img文件 | …\tolset\z_tools\imgtol.com w a: helloos.img | install | 启动虚拟机加载img运行操作系统 |
| 编辑nas文件的操作 | 所需执行文件 | 输入 | 输出 | 文件内容 | 操作或者输入指令 | 目的 |
|---|---|---|---|---|---|---|
| _ | !cons | 双击执行 | ||||
| _ | nask.exe | .nas格式文件 | .img格式文件 | 无 | 生成软盘可用文件 | |
| _ | asm.bat | 同上 | 同上 | …\z_tools\nask.exe helloos.nas helloos.img | 双击文件调用nask.exe | 省略指令的输入 |
| _ | !cons | .img格式文件 | cmd.exe | asm | 启动命令提示符,执行asm批操作 | |
| * | run, install | 启动虚拟机加载img运行操作系统 |
| 操作优化 | 所需执行文件 | 输入 | 输出 | 文件内容 | 操作或者输入指令 | 目的 | |
|---|---|---|---|---|---|---|---|
| _ | !cons | 双击执行 | |||||
| _ | asm.bat | ipl.nas | ipl.bin,ipl.lst(512字节的指令翻译) | …\z_tools\nask.exe ipl.nas ipl.bin ipl.lst | asm | 制作启动盘 | |
| _ | makeimg.bat | ipl.bin | Helloos.img | …\z_tools\edimg.exe imgin:…/z_tools/fdimg0at.tek wbinimg src:ipl.bin len:512 from:0 to:0 imgout:helloos.img | make img | 生成img文件 | |
| _ | run, install |
| 继续改进操作指令 | 所需执行文件 | 输入 | 输出 | 文件内容 | 操作或者输入指令 | 目的 |
|---|---|---|---|---|---|---|
| * | !cons | 双击执行 | ||||
| * | asm.bat | 略 | 无 | |||
| * | ipl.nas, | 略 | 无 | |||
| _ | make.bat | …\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 | 无 | 更方便地从命令行窗口运行makefile这个工具 | ||
| _ | makefile | ipl.nas | ipl.bin,ipl.lst,Helloos.img | 代码如下 | make img(一条龙生成img并在虚拟机中运行)或者依次执行make run,make img,make install |
代码部分
# 默认指令
default :
../z_tools/make.exe img #默认指令直接执行make.exe img
# 文件生成规则
ipl.bin : ipl.nas Makefile
../z_tools/nask.exe ipl.nas ipl.bin ipl.lst
helloos.img : ipl.bin Makefile
../z_tools/edimg.exe imgin:../z_tools/fdimg0at.tek \
wbinimg src:ipl.bin len:512 from:0 to:0 imgout:helloos.img
# 命令
asm :
../z_tools/make.exe -r ipl.bin
img :
../z_tools/make.exe -r helloos.img
run :
../z_tools/make.exe img
copy helloos.img ..\z_tools\qemu\fdimage0.bin
../z_tools/make.exe -C ../z_tools/qemu
install :
../z_tools/make.exe img
../z_tools/imgtol.com w a: helloos.img
clean : #Clean:删除最终成果(img文件)之外的所有中间生成文件
-del ipl.bin
-del ipl.lst
src_only : #Src_only:删除源程序以外的全部文件
../z_tools/make.exe clean
-del helloos.img
AI写代码
Make.exe随后会解析Mikefile文件以探索制作ipl.bin的途径。
如果ipl.bin不存在:
则会尝试探索创建ipl.bin的方法。
然后基于bin文件生成相应的img文件。
Make.exe还会自动检测输入文件的存在性和更新日期。
它替代了asm.bat、run.bat和install.bat这些程序。
在使用工具时将其详细记录下来后对整个微型操作系统的编译和运行总体上形成了较为全面的理解。继续保持努力的精神吧。
