操作系统开发之——一个简单的Bootsect
先吓唬一下读者朋友呵呵,直接发代码:(这是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一个操作系统的实现》,感谢其作者于渊
;參照<a target=_blank href="http://wenku.baidu.com/view/1ee907d528ea81c758f5786b.html">http://wenku.baidu.com/view/1ee907d528ea81c758f5786b.html</a> ,感谢其作者
%macro DiskAddressPacket 3
DB 16 ;数据包尺寸(默认16字节)
DB 0 ;保留
DB %2 ;要传输的数据块个数(以扇区为单位),最大读128扇区
DB 0 ;保留
DD %3 ;传输缓冲地址(segment:offset)
DQ %1 ;磁盘起始绝对块地址。注意此处的地址是从零開始
%endmacro
OS_Kernel_S1: DiskAddressPacket 3, 128, 0x10000000
OS_Kernel_S2: DiskAddressPacket 131, 128, 0x20000000
OS_Kernel_S3: DiskAddressPacket 259, 128, 0x30000000
[bits 16]
OS_Entry:
;初始化寄存器
MOV AX,CS
MOV DS,AX
MOV ES,AX
MOV SS,AX Read_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:2608184397@qq.com
假设读者朋友也有开发操作系统的想法,能够联系我。
操作系统开发之——一个简单的Bootsect的更多相关文章
- Web开发之tomcat配置及使用(环境变量设置及测试,一个简单的web应用实例)
Tomcat的配置及测试: 第一步:下载tomcat,然后解压到任意盘符 第二步:配置系统环境变量 tomcat解压到的D盘 (路径为: D:\tomcat), 配置环境变量: 启动tomcat需要两 ...
- 鸿蒙系统应用开发之JS实现一个简单的List
在之前的文章鸿蒙应用开发之怎么更好的远程连接手表模拟器做调试里我运行了一个穿戴设备的应用,利用JS UI实现了一个最简单的HelloWorld. 今天我打算在智慧屏设备上利用豆瓣音乐的接口数据实现一个 ...
- iOS-iPad开发之SplitViewController简单介绍
iOS-iPad开发之SplitViewController简单介绍 SplitViewController图形化创建 SplitViewController可以并列显示两个view,适用于基于nav ...
- iOS开发之WKWebView简单使用
iOS开发之WKWebView简单使用 iOS开发之 WKWebVeiw使用 想用UIWebVeiw做的,但是突然想起来在iOS8中出了一个新的WKWebView,算是UIWebVeiw的升级版. ...
- 哪种缓存效果高?开源一个简单的缓存组件j2cache
背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...
- 在Openfire上弄一个简单的推送系统
推送系统 说是推送系统有点大,其实就是一个消息广播功能吧.作用其实也就是由服务端接收到消息然后推送到订阅的客户端. 思路 对于推送最关键的是服务端向客户端发送数据,客户端向服务端订阅自己想要的消息.这 ...
- ASP.NET Aries 入门开发教程2:配置出一个简单的列表页面
前言: 朋友们都期待我稳定地工作,但创业公司若要躺下,也非意念可控. 若人生注定了风雨飘摇,那就雨中前行了. 最机开始看聊新的工作机会,欢迎推荐,创业公司也可! 同时,趁着自由时间,抓紧把这系列教程给 ...
- 计算机程序的思维逻辑 (60) - 随机读写文件及其应用 - 实现一个简单的KV数据库
57节介绍了字节流, 58节介绍了字符流,它们都是以流的方式读写文件,流的方式有几个限制: 要么读,要么写,不能同时读和写 不能随机读写,只能从头读到尾,且不能重复读,虽然通过缓冲可以实现部分重读,但 ...
- 如何开发一个简单的HTML5 Canvas 小游戏
原文:How to make a simple HTML5 Canvas game 想要快速上手HTML5 Canvas小游戏开发?下面通过一个例子来进行手把手教学.(如果你怀疑我的资历, A Wiz ...
随机推荐
- 141. Linked List Cycle【Easy】【判断链表是否存在环】
Given a linked list, determine if it has a cycle in it. To represent a cycle in the given linked lis ...
- ZSTU OJ 4273 玩具
枚举,二分,$RMQ$. 肯定是将连续一段中最大值免去花费,枚举起点之后,二分终点即可.可以证明单调性. #include<map> #include<set> #includ ...
- 公司gitlab不支持ssh时,用http提交代码免密输入方法
由于公司内网22端口被封,只能拨vpn 才能用ssh 提交代码.因此记录以下免密码http(https)提交方式. 修改项目下.git/config 将原来的 http://git.xxx.com/x ...
- 用jquery实现文章自动生成二级目录(续)
前文:用jquery实现文章自动生成二级目录. 使用方法的补充 我们可以把我们的js和css上传到博客园,然后在页面HTML代码中使用他们. 发现的一些问题 在我把我的js放到自己的博客园上运行之后发 ...
- 洛谷——P1223 排队接水
P1223 排队接水 题目描述 有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小. 输入输出格式 输入格式: 输入文件共两行, ...
- 【大视野入门OJ】1083:数组的二分查找
Description 在1500个整数中查整数x的位置,这些数已经从小到大排序了.若存在则输出其位置,若不存在则输出-1. Input 第一行,一个整数x 后面1500行,每行一个整数 Output ...
- 【图论】Popular Cows
[POJ2186]Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 34752 Accepted: ...
- 【MySQL笔记】触发器,存储过程和函数
一.触发器 触发器(TRIGGER):是由事件来触发某个操作.当数据库系统执行这些事件时,就会激活触发器执行相应的操作.MySQL从5.0.2版本开始支持触发器. 触发事件:INSERT语句.UPDA ...
- Educational Codeforces Round 9 A. Grandma Laura and Apples 水题
A. Grandma Laura and Apples 题目连接: http://www.codeforces.com/contest/632/problem/A Description Grandm ...
- jQuery中,子页面与父页面之间的调用方法
在jQuery中, 子页面查找父页面的元素 parent.$("#元素Id") 父页面调用子页面的元素 $("#子页面iframe的Id").contents( ...