《自己动手写操作系统》(一)
2019-4-26 AM 9:15
前言:记得上初中时,在一张英语报上看到一篇关于史蒂夫乔布斯的文章,那时他才20多岁,就已经达到人生的巅峰,可谓意气风发,我的内心对其充满崇敬之意。联想到表哥家的那台windows95大块头电脑,时常偷偷玩上两把魔兽争霸,那时,已经对这个魔术般奇幻的机器充满好奇。再后来一直到大学,在偌大的图书馆看到关于计算机的书籍,里边总是浮现一些不明所以的代码,既感到神奇的同时也暗下决心一探究竟,我记得第一次运行hello world程序的狂喜心情,然后这种对计算机技术的热爱就一直延续至今。很纯粹的热爱,就想弄明白操作系统的运作原理,便想依照于渊老师的《自己动手写操作系统》做一个小的系统内核,真正属于自己的!想想都有种莫名的激动。
基本上,书中都是在虚拟机上运行,我手边有一个基本上不用的联想Y460的笔记本电脑,我决定直接在这个机器上做实验,不知是不是对不起我的爱机?
以前实际上是有过类似的写操作系统的经验的,但因为没有任何文档记录,现在得一切从头开始。这两天已经摸索出基本测试思路:1.使用notepad++文本编辑器编辑好系统代码,asm格式。2.使用NASM转为格式为bin文件 3.直接使用rawrite写入U盘 4.使用真机测试
第一章--最小的“操作系统”
最最简单的“操作系统”就是一个最最简单的引导扇区(Boot Sector)。虽然它不具有任何功能,但是它却能够直接在裸机上运行,不依赖其他软件。一个引导扇区是512个字节,并且以0xAA55为结束标识的扇区。
/****************************************************************************************************************************************************引导扇区(Boot Sector) 通常指设备的第一个扇区,用于加载并转让处理器控制权给操作系统。
0x07C00相当于十进制中的:31744
***************************************************************************************************************************************************/
- org 07C00h ; 告诉编译器程序加载到07C00处
- mov ax, cs
- mov ds, ax
- mov es, ax
- call DispStr ; 调用显示字符串例程
- jmp $ ; 无限循环
- DispStr:
- mov ax, BootMessage
- mov bp, ax ; es:bp = 串地址
- mov cx, 16 ; cx = 串长度
- mov ax, 01301h ; ah = 13, al = 01h
- mov bx, 000Ch ; 页号为0(bh = 0) 黑底红字 (bl = 0Ch,高亮)
- mov dl, 0
- int 10h ; 10h号中断
- ret
- BootMessage: db "Hello,OS world!"
- times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
- dw 0xaa55 ; 结束标志
1、org 07C00h
org伪指令: org + 数值表达式
其中,org是操作码,不可省略。数值表达式给出偏移地址值,即org语句后的指令或数据以数值表达式给出的值作为起始的偏移地址。数值表达式必须是一个可计算得到的正整数,数值范围在0~65535之间。
org伪指令用来指出其后的程序段或数据块存放的起始地址的偏移量。汇编程序汇编时把语句中表达式的值作为起始地址,连续存放org语句之后的程序和数据,直到出现一个新的org指令。若省略org语句,则从本段起始地址开始连续存放。
在大多数情况下,不需要用org语句设置位置指针。由于段定义语句是段的起点,它的偏移地址为0000H,以后每分配一个字节,位置指针自动加1,所以每条指令都有确定的偏移地址。只有程序要求改变这个位置指针时,才需要安排org语句。通常org语句可以出现在程序中任何位置上。
org示例:
在数据段中依次定义以下变量,由于此时没有使用org语句,则变量word1的偏移地址为0。
word1 DW 1234h
byte1 DB 56h
word2 DW abcdh
其在数据段中word1,byte1,word2的存储位置如下图所示(采用小端存储,按单字节对齐)。
在数据段中依次定义以下变量,由于此时使用org语句,则变量word1的偏移地址为1。
org 0001h
word1 DW 1234h
byte1 DB 56h
word2 DW abcdh
其在数据段中word1,byte1,word2的存储位置如下图所示(采用小端存储,按单字节对齐)。
我们知道编译器本身在汇编时对指令的地址计算是相对地址,而对于引导扇区,是按绝对地址执行,那么对于用相对地址编译的执行码就要换算成绝对地址。一般而言,“真实开始执行的引导扇区”都会固定装载到07C00h处。
由于编译器在编译时的地址是从第一行开始用0000h开始相对计算的,而且我们要写的是“引导扇区”程序,所以我们要将下面的代码加载到地址07C00h处,所以我们需要org 07C00h,通过该伪指令,将代码和数据加载到07C00h地址。
2、jmp $
$被称为当前位置计数器
在汇编程序对源程序进行汇编的过程中,使用地址计数器来保证当前正在汇编的指令地址。地址计数器值可用“$”来表示,汇编语言也允许用户直接用“$”来引用地址计数器的当前值,因此,org $+5可表示从当前地址开始跳过5个字节存储单元,在指令和伪指令中,也可直接用“$”表示地址计数器的当前值。故jmp $进入了一个无限循环。
3、int 10h
int 10H号中断
int 10H 是由BIOS 对屏幕及显示器所提供的服务程序。使用int 10H 中断服务程序时,先指定 AH 寄存器为下表编号其中之一,该编号表示欲调用的功用,而其他寄存器的详细说明,参考表后文字,当一切设定好之后再调用 int 10H。
在这里我们只详细讲解本程序中的10号中断。由于ah=13,故调用编号为13的功能:即显示字符串。其中ES:BP=串地址,CX=串长度 ,AH=13,当AL=01h时,光标会跟随显示移动。BH为页号,BH=0表示页号为0,BL=0CH,表示属性,即黑底红字高亮。因此在调用10号中断之前,无非就是对各个寄存器进行初始化。
4、times 510-($-$$) db 0
times:重复指令或数据
times前缀引起指令被汇编多次。其中
)次。也就是用0来填充剩下的空间,达到510字节。
打开计算机电源;加电自检(POST);寻找启动盘,该系统设置从软盘启动,计算机检查软盘的0面0磁道1扇区,如果发现它以0xAA55结束,则BIOS会认为它是一个引导扇区;BIOS将该512字节扇区内容加载到内存地址0000:7c00;跳转到0000:7C00出将控制权交给这段引导代码。到此为止,计算机不再由BIOS中固有的程序来控制,而变成由操作系统的一部分来控制。
《自己动手写操作系统》(一)相关推荐
- 关于《那些年啊,那些事——一个程序员的奋斗史》——24提到的鼻炎治疗方法
在<那些年啊,那些事--一个程序员的奋斗史>--24中有提到用清水治疗鼻炎的方法,很多朋友在留言或email都有问到这问题,在此一并做个回答. 简单说说norains的鼻炎 ...
- 《那些年啊,那些事——一个程序员的奋斗史》十四(完结)
125 距离离职交接的一个月时间还剩几天,本来应该是平淡无事的,却没想到最后还是波澜四起.昨天下班前,公司突然停了电.这本是件普通得不能再普通的事情,可没想到过了一会来电了,或许是波峰电压太大,或许是 ...
- 《那些年啊,那些事——一个程序员的奋斗史》——128 (终章)
周五,如约而至.张文香果然没有被邀请,武总自然也是被排除之列,来的都是平时大家谈得比较来的.几个月不见,小黑和小蓝还是老样子,但精神相比以前是好多了:麦吉则没什么太大的变化,倒是陈莉胖了不少,颇有一番 ...
- 关于 那些年啊,那些事——一个程序员的奋斗史 ——24提到的鼻炎治疗方法
分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 在<那些年啊 ...
- 关于 那些年啊 那些事 一个程序员的奋斗史 24提到的鼻炎治疗方法
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在< ...
- 《那些年啊,那些事——一个程序员的奋斗史》——79
旧的4.3'主板是废弃了,新的带CMMB的板子开始了.对于新的板子来说,其实只是在旧的板子上做改动,比如删掉蓝牙模块啊,去掉视频输入啊等:最大的不同,只是根据Telechips的原理图增加CMMB部分 ...
- 那些年啊,那些事——一个程序员的奋斗史 ——23
分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow "开会咯 ...
- 《那些年啊,那些事——一个程序员的奋斗史》——23
"开会咯!"黄华中在研发部嚷了一下,让大家到外面的会议桌去.说起来,自从段伏枥来到这公司以来,已经差不多有好几个月,却连一个会都没有开过,甚至是小一点的内部会议都没有.为什么突然间 ...
- 《那些年啊,那些事——一个程序员的奋斗史》——117
这段时间段伏枥在折腾.NET Micro Framework的时候,终于体会到什么叫举步维艰了.因为这玩意没有操作系统做支撑,直接是操作硬件,有时候出问题了,根本就不知道是如何引起的. 比如说,在移植 ...
- 《那些年啊,那些事——一个程序员的奋斗史》——38
自从会见了律师之后,时间又过了一周,期间还是和往常没什么两样,段伏枥依然还是赶最后一班公交,周六还是依然需要加班.不过,经过王健的努力,这板子终究还是跑起来了.不过,这跑起来的概念也就是能够进入Win ...
最新文章
- JQuery学习笔记02-选择器把需要的东西揪出来(基础)
- 【临实战】CentOS 批量配置
- 树莓派搭建minecraft服务器
- 小学计算机应用到英语课教案,信息技术与PEP小学英语三年级学科整合交流课例...
- 好产品改变世界——《人人都是产品经理》即将上市
- 虚拟化软件Xen的简单应用
- 《我在谷歌大脑见习机器学习的一年:Node.js创始人的尝试笔记》阅读笔记
- ssh整合mysql不能自动生成表_ssh整合思想 Spring与Hibernate的整合 项目在服务器启动则自动创建数据库表...
- 工业互联网发展驶入快车道
- windows下的文件服务器监控
- 毕设教程系列 - FCM模糊聚类算法
- Jekins配置Publish over SSH详解
- Spring的配置项aspectj-autoproxy
- mysql创建管理员账户
- 小心啦!水上有“天眼”,查你没商量!
- python open unicodedecodeerror_python 读取文件时报错UnicodeDecodeError: 'gbk' co
- 拒绝B站邀约,从月薪3k到年薪47W,我的经验值得每一个测试人借鉴
- 数据库连接池的优点和原理
- 大数据后从此再无隐私_大数据时代没有个人隐私?
- 与苹果相反 三星向所有第三方应用开放指纹识别功能