先前看了一段时间的《自己动手写操作系统》,后来朋友建议说最好学习用c语言编写的方式,就推荐了《30天自制操作系统》这本书。
这本书的风格比较轻松,读起来也挺有意思。
早之前看过一些,总觉得有些不好懂。现在看第二遍发现懂得多一些了,看来确实需要反复学习才是【笑】
前两章涉及到的工具特别多,一不注意就混乱了。作者有意循序渐进地引导我们一步一步编写并且优化代码,第一遍看的时候倒是太急躁导致后来根本看不下去。
这次将两章的讲的重要内容做点归纳,尤其注重了工具的使用和它的优化改良。
理论部分:
计算机电源被打开时,首先进行加电自检(POST),然后寻找启动盘。如果是选择从软盘启动,计算机就会检测软盘的0面0磁道1扇区,如果发现它以0xaa55结束,则BIOS认为它是一个引导扇区,即Boot Sector。一个正确的Boot Sector不光以0xaa55结尾,还应包含有不少于512B的执行码。
BIOS发现Boot Sector就会将这512B内容装载到内存0000:7c00处,然后跳转到0000:7c00处将控制权彻底交给这段代码,计算机由此由操作系统控制。
NASM语法:(1)任何不被方括号[]括起来的标签或是变量名都被认为是地址,访问标签中的内容必须使用[]
比如:foo dw 1
mov ax, BootMessage
Mov ax, foo 相当于把foo的地址传给ax
而mov ax, [foo] 是将bx的值赋为1
而Offset这个关键字在nasm不需要,因为标签不加方括号就是Offset
(2)$表示当前行被汇编后的地址
KaTeX parse error: Can't use function '$' in math mode at position 33: …出被汇编后的地址。 $̲-表示本行代码距离程序开始处的相对距离。
然后是相关寄存器:
都是16位寄存器,因此可以存储16位的二进制数。
8个8位寄存器
32位寄存器
段寄存器,16位
MOV BYTE [678],123
MOV WORD [678],123
DB,BW和DD
在汇编语言里指定内存地址时,要用下面的方法来写:
数据大小[地址]
虽然可以用寄存器来指定内存地址,但可做此用途的寄存器有限,只有BX、BP、SI、DI这几个。剩下的AX、CX、DX、SP不能用来指定内存地址。如果想把DX内存里的内容赋值给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
Make.exe首先会读取Mikefile文件,寻找制作ipl.bin的方法。
If ipl.bin not exist
Then find the way to create ipl.bin.
然后根据bin文件生成img文件
Make.exe还会自动判断输入文件是否存在和文件的更新日期
代替asm.bat, run.bat,install.bat
将使用到的工具用表格记录之后对整个微型操作系统的编译以及运行总算有了一个比较完整的认识,继续努力啦~