操作系统开发之——一个简单的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 ...
随机推荐
- STL容器 -- Queue
核心:先进先出, FIFO. 头文件: #include <queue> 常用的构造方法: queue<int> qu1; //构造一个空的存放 int 型的队列 queue& ...
- Codeforces Round #404 (Div. 2) C 二分查找
Codeforces Round #404 (Div. 2) 题意:对于 n and m (1 ≤ n, m ≤ 10^18) 找到 1) [n<= m] cout<<n; 2) ...
- POJ 2960 S-Nim 博弈论 sg函数
http://poj.org/problem?id=2960 sg函数几乎是模板题. 调试代码的最大障碍仍然是手残在循环里打错变量名,是时候换个hydra产的机械臂了[超想要.jpg] #includ ...
- JZYZOJ1442 [noip2013]华容道 bfs 最短路 剪枝
http://172.20.6.3/Problem_Show.asp?id=1442 想到最短路的简直神了,如果我写我大概只能写一个30分的bfs. 从数据范围可以看出思路是bfs剪枝,但这里的剪枝是 ...
- [Codeforces #211] Tutorial
Link: Codeforces #211 传送门 一套非常简单的题目,但很多细节都是错了一次才能发现啊…… 还是不能养成OJ依赖症,交之前先多想想corner case!!! A: 模拟,要特判0啊 ...
- [ARC097F]Monochrome Cat
题意:一棵树,每个节点是黑色或白色,你可以从任意节点开始进行一些操作并在任意节点结束,如果当前在$x$,那么一次操作可以是:1.走到相邻节点$y$并翻转$y$的颜色,2.翻转$x$的颜色,问把所有节点 ...
- 【线段树区间合并】BZOJ1593-[Usaco2008 Feb]Hotel 旅馆
好无聊,以前写过没什么好讲的,水过.戳 #include<iostream> #include<cstdio> #include<cstdlib> #define ...
- nginx配置本地https
客户端如何验证服务器的证书呢?服务器自己的证书必须经过某"权威"证书的签名,而这个"权威"证书又可能经过更权威的证书签名,这么一级一级追溯上去,最顶层那个最权威 ...
- [WikiOI "天梯"1281] Xn数列
题目描述Description 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn m, a, c, x0, n, g<=10^18 输入描 ...
- Java高级架构师(一)第31节:Nginx简介、安装和基本运行
第一节:主要介绍Nginx和安装