欢迎访问 如意编程网!

如意编程网

当前位置: 首页 > 运维知识 > windows >内容正文

windows

30天自制操作系统读书笔记(三)

发布时间:2024/5/15 windows 2 豆豆
如意编程网 收集整理的这篇文章主要介绍了 30天自制操作系统读书笔记(三) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

来吧。第三天。

制作真正的IPL:

        

 

作者又是那样,一上来就甩一堆代码,用他的话猜测,下面这段代码应该是用来装载下一个512字节的内容的。

MOV AX,0x0820MOV ES,AXMOV CH,0 ; 柱面0MOV DH,0 ; 磁头0MOV CL,2 ; 扇区2MOV AH,0x02 ; AH=0x02 : 读盘MOV AL,1 ; 1个扇区MOV BX,0MOV DL,0x00 ; A驱动器INT 0x13 ; 调用磁盘biosJC error

 

好吧,作者在代码后面稍微解释了一下:

 

调用了13号中断,mov入ch,dh等寄存器的数据原来就是这个个断函数需要传递进入的参数。

 

那么什么是扇区,什么是柱头呢? 看图吧!

 

含有IPL的启动区,位于C0-H0-S1(柱面0,磁头0,扇区1),下一个扇区是C0-H0-S2

所以上面那段程序就是装载这个扇区。

 

既然读取了数据,那就要放到内存里啊,否则读取出来有什么用?但是我们怎么指定放入哪里呢?其实这个地址已经指明了。  ES:BX 就是要载入的地址。也就是0x8200-0x83ff

但是为什么不放入0x8000呢,作者说是留给启动区的(启动区不是7c00-7dff吗?什么鬼!)

 

 

作者又添加了循环写入的代码。

利用bios程序错误时在flags里返回的数据。

 

看注释吧。。

  

MOV AX,0x0820MOV ES,AXMOV CH,0 ; 柱面0MOV DH,0 ; 磁头0MOV CL,2 ; 扇区2readloop:MOV SI,0 ;用来记录失败次数的寄存器retry: MOV AH,0x02 ; AH=0x02 : 读盘MOV AL,1 ; 1个扇区MOV BX,0MOV DL,0x00 ; A驱动器INT 0x13 ; 调用磁盘biosJNC fin ;如果没有出错就跳转到nextADD SI,1 ;错误次数加一CMP SI,5 ;和5对比JAE error ;大于等于5就跳转MOV AH,0x00 ;这一句不懂MOV DL,0X00INT 0X13JMP retry

 

     

 

 

 

Omg,这一章难道全是汇编代码了吗?

作者一鼓作气读了10个柱头。

 

 

总于开始着手操作系统的开发了吗?

 

Fin:

         HTL

         JMP fin

 

什么,,难道这只是一个只会待机的操作系统???

但是怎么运行他呢?

让我们来看看makefile里面的修改吧:

 

haribote.img : ipl.bin haribote.sys Makefile

         $(EDIMG)   imgin:../z_tools/fdimg0at.tek \

                   wbinimg src:ipl.bin len:512 from:0 to:0 \

                   copy from:haribote.sys to:@: \

                   imgout:haribote.img

 

其中haribote.sys就是 haribote.nas经过nask编译后的文件。

虽然不是很懂makefile里面的这些代码,但应该就是将系统保存到了我们的img磁盘映像里了。

 

或许这样太抽象那就理解为这样好了:

         我将磁盘映像写入到了硬盘了。然后将haribote.sys复制到硬盘里了,然后我又把硬盘做成了硬盘镜像。

 

 

作者说 0x002600保存的是文件名

            0x002400保存的是文件内容。那就相信他吧。

那么启动这个操作系统就简单了。

 

我们根据计算,磁盘上的内容加载到0x8000那么磁盘0x4200处就对应着内存里的0xc200.

但是我又不懂了。

不是只需要在IPL里jmp一下就好了吗?

为什么又来个ORG 0xc200??

好吧,博主表示搞不懂这里。

 

 

索性不管它了。

 

作者自称现在程序的前半部分是用汇编写的,后半部分是C语言写的。

所以啊,又来了一次大跳跃,扔给我们一个 asmhead.nas

这到底是什么鬼。

 

不管了,先来看看C语言这个部分吧。

那么C语言怎么变成机器语言呢?

好麻烦。。。。。还好他把一系列过程写到了makefile里面。

 

 

 

体系结构好像有点复杂啊。博主盗了一张图:

 

 

 

 

好像放着naskfunc不讲,有点过不去啊,其实就是有些东西C语言实现不了,使用汇编写,然后编译的时候,把naskfunc链接到一起。

 

;naskfunc

;TAB=4

 

[FORMAT "WCOFF"] ;制作目标文件的模式

[BITS 32]           ;制作32位模式用的机械语言

 

;制作目标文件的信息

[FILE "naskfunc.nas"] ;源文件名信息

         GLOBAL _io_hlt;程序中包含的函数名   想在C语言中使用必须用global声明

 

;以下是实际的函数

[SECTION .text]     ;目标文件中写了这些之后再写程序

 

_io_hlt:    ;void io_hlt(void);  要用_开头

         HLT

         RET

转载于:https://www.cnblogs.com/You0/p/4432252.html

总结

以上是如意编程网为你收集整理的30天自制操作系统读书笔记(三)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得如意编程网网站内容还不错,欢迎将如意编程网推荐给好友。