博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
操作系统开发之——一个简单的Bootsect
阅读量:6121 次
发布时间:2019-06-21

本文共 2076 字,大约阅读时间需要 6 分钟。

先吓唬一下读者朋友呵呵,直接发代码:(这是UOS操作系统的Bootsect)(有兴趣的朋友能够增加我们,联系方式在最后)

;------------------------------;文件名称:Bootsect.asm;文件创建者:@Imcjy;文件參与编辑者:@Imcjy;文件编码:UTF-8;状态:O;Build:3;文件创建日期:2015年7月24日;文件最后改动日期:2015年8月12日;备注:本文件为Nasm;凝视等级:LV2;------------------------------	ORG 0x7c00	;装载此程序至0x7c00处。由于BIOS默认会从内存0x7c00处開始运行	JMP OS_Entry;參照《Orange's一个操作系统的实现》,感谢其作者于渊;參照http://wenku.baidu.com/view/1ee907d528ea81c758f5786b.html ,感谢其作者%macro DiskAddressPacket 3       DB 16 ;数据包尺寸(默认16字节)       DB 0  ;保留       DB %2 ;要传输的数据块个数(以扇区为单位),最大读128扇区       DB 0  ;保留       DD %3 ;传输缓冲地址(segment:offset)       DQ %1 ;磁盘起始绝对块地址。注意此处的地址是从零開始%endmacroOS_Kernel_S1: DiskAddressPacket 3, 128, 0x10000000OS_Kernel_S2: DiskAddressPacket 131, 128, 0x20000000OS_Kernel_S3: DiskAddressPacket 259, 128, 0x30000000[bits 16]OS_Entry:	;初始化寄存器	MOV	AX,CS	MOV	DS,AX	MOV	ES,AX	MOV	SS,AXRead_Kernel:	;读内核	KS1:	;状态1	MOV	AX,OS_Kernel_S1	MOV SI,AX	MOV DL,0x80	;一号硬盘	MOV AH,0x42	;读盘操作	INT 0x13		JC KS1	;失败则重试		KS2:	;状态2	MOV	AX,OS_Kernel_S2	MOV SI,AX	MOV AH,0x42	;读盘操作	MOV DL,0x80	;一号硬盘	INT 0x13		JC KS2	;失败则重试		KS3:	;状态3	MOV	AX,OS_Kernel_S3	MOV SI,AX	MOV DL,0x80	;一号硬盘	MOV AH,0x42	;读盘操作	INT 0x13		JC KS3	;失败则重试			JMP 0x8000:0	;跳转到段0x8000处并更新CS		TIMES 510 - ($ - $$) DB 0	;填充剩下的空间。使生成的二进制代码恰好为512字节	DB 0x55,0xAA 	;BIOS认可的结束标志

这里读盘操作用的是扩展0x13号BIOS中断,假设看不懂,能够点开asm代码里的百度链接。假设打开不了能够联系我哦。

如今開始解释一下第一句,“ORG 0x7c00”,这里为什么要装载到0x7c00处呢。如今也解释不清楚。这是IBM的大叔设置的,假设有质疑能够去问问他们哦。

第二句:“JMP OS_Entry” 这里为什么要跳转呢?那我再问你一句,这一句后面的那些代码难道要运行吗?(那可不能运行)所以要跳转到Bootsect真正的入口点。

第三句:宏定义,为了降低挨个挨个设置參数的麻烦,參数能够參照intel手冊来写。

第四句:依赖宏定义定义參数,这里不用解释了把,相信学过Nasm的朋友都能看懂。

第五句:“[bits 16]”,为了使Nasm生成出来的是16位代码。(话说为什么一定要生成16位代码呢?由于BIOS仅仅认16位的中断处理),话说Nasm好笨哦。(嘻嘻)

第六句:“OS_Entry:”标签,相应第二句。

第七句——第十句:初始化寄存器。有兴趣的读者能够去掉这句看看。

第十一句——第十五句:将各个參数放到相应的寄存器里。否则虚拟器(或者真机)会出问题(或许就是重新启动吧)。

第十六句:调用0x13号BIOS中断。

后面的以此类推。

到了“JMP 0x8000:0”这一句,看一下凝视把,这里是一个长跳转。跳转到0x8000内存地址处。

最后两句:为了使BIOS认可我们的Bootsect,我们须要这段代码的大小控制到512字节以内,且最后两个字节为0x55 0xAA。

注意事项:

1:我们须要将这段代码放到硬盘的第一个扇区,(话说这也是IBM那群大叔设置的)。

2:我们须要将硬盘的第二个扇区至第三个扇区放置兴许的操作代码(比方打开A20啊,进入保护模式啊)。

3:版权归UOS项目组全部。

假设还有问题能够联系我:Email:

假设读者朋友也有开发操作系统的想法,能够联系我。

转载地址:http://xmgka.baihongyu.com/

你可能感兴趣的文章
第五十七篇、AVAssetReader和AVAssetWrite 对视频进行编码
查看>>
Vivado增量式编译
查看>>
一个很好的幻灯片效果的jquery插件--kinMaxShow
查看>>
微信支付签名配置正确,但返回-1,调不出支付界面(有的手机能调起,有的不能)...
查看>>
第二周例行报告
查看>>
vue实现点击展开,点击收起
查看>>
如何使frame能居中显示
查看>>
第k小数
查看>>
构建之法阅读笔记三
查看>>
写给对前途迷茫的朋友:五句话定会改变你的人生
查看>>
并行程序设计学习心得1——并行计算机存储
查看>>
JAVA入门到精通-第86讲-半双工/全双工
查看>>
bulk
查看>>
js document.activeElement 获得焦点的元素
查看>>
C++ 迭代器运算
查看>>
【支持iOS11】UITableView左滑删除自定义 - 实现多选项并使用自定义图片
查看>>
day6-if,while,for的快速掌握
查看>>
JavaWeb学习笔记(十四)--JSP语法
查看>>
【算法笔记】多线程斐波那契数列
查看>>
java8函数式编程实例
查看>>