《一个操作系统的实现》读书笔记-- 第一章--最小的“操作系统”
2014-07-30 22:31
260 查看
一、最简单的“操作系统”
最最简单的“操作系统”就是一个最最简单的引导扇区(Boot Sector)。虽然它不具有任何功能,但是它却能够直接在裸机上运行,不依赖其他软件。一个引导扇区是512个字节,并且以0xAA55为结束标识的扇区。下面就是那个最最简单的引导扇区。
[cpp] view
plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
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的存储位置如下图所示(采用小端存储,按单字节对齐)。
![](http://img.blog.csdn.net/20140213232612640)
在数据段中依次定义以下变量,由于此时使用org语句,则变量word1的偏移地址为1。
org 0001h
word1 DW 1234h
byte1 DB 56h
word2 DW abcdh
其在数据段中word1,byte1,word2的存储位置如下图所示(采用小端存储,按单字节对齐)。
![](http://img.blog.csdn.net/20140213232653312)
我们知道编译器本身在汇编时对指令的地址计算是相对地址,而对于引导扇区,是按绝对地址执行,那么对于用相对地址编译的执行码就要换算成绝对地址。一般而言,“真实开始执行的引导扇区”都会固定装载到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号中断之前,无非就是对各个寄存器进行初始化。
关于10号中断的其他信息,请参考 http://blog.csdn.net/yes_life/article/details/6778834
4、times 510-($-$$) db 0
times:重复指令或数据
times前缀引起指令被汇编多次。其中$$表示是该程序的初始代码段的地址,故该指令将会被执行510-($-$$)次。也就是用0来填充剩下的空间,达到510字节。
二、如何运行该“操作系统”
1、环境准备
(1)计算机操作系统(Windows)
(2)虚拟机(VMware)
(3)汇编编译器(NASM)
(3)软盘(虚拟软盘RamDiskNT)
(4)rawrite.exe/本书光盘自带OS/Tools/FloppyWriter,负责将程序写入到软盘。
2、编译boot.asm
将上述代码文件命名为boot.asm,然后使用nasm命令编译该文件。
nasm boot.asm –o boot.bin
3、虚拟软盘A
![](http://img.blog.csdn.net/20140214110611593)
点击Start之后,查看“我的电脑”里是否有虚拟软盘A,如果没有,重启。
4、将boot.bin写入到软盘A
![](http://img.blog.csdn.net/20140214110723234)
点击Enter。(注意boot.bin与Rawrite.ext在同一文件目录下)。
5、创建虚拟机
安装VMware,在VMware创建一个虚拟机,命名为Tinix,并设置系统引导盘为软盘A。
![](http://img.blog.csdn.net/20140214110825437)
启动该系统,得出结果图为:
![](http://img.blog.csdn.net/20140214110927031)
三、本操作系统启动流程
打开计算机电源;加电自检(POST);寻找启动盘,该系统设置从软盘启动,计算机检查软盘的0面0磁道1扇区,如果发现它以0xAA55结束,则BIOS会认为它是一个引导扇区;BIOS将该512字节扇区内容加载到内存地址0000:7c00;跳转到0000:7C00出将控制权交给这段引导代码。到此为止,计算机不再由BIOS中固有的程序来控制,而变成由操作系统的一部分来控制。
上述工具下载地址 http://download.csdn.net/detail/zgh1988/6922887
转载于:
/article/2894172.html
最最简单的“操作系统”就是一个最最简单的引导扇区(Boot Sector)。虽然它不具有任何功能,但是它却能够直接在裸机上运行,不依赖其他软件。一个引导扇区是512个字节,并且以0xAA55为结束标识的扇区。下面就是那个最最简单的引导扇区。
[cpp] view
plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
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号中断之前,无非就是对各个寄存器进行初始化。
关于10号中断的其他信息,请参考 http://blog.csdn.net/yes_life/article/details/6778834
4、times 510-($-$$) db 0
times:重复指令或数据
times前缀引起指令被汇编多次。其中$$表示是该程序的初始代码段的地址,故该指令将会被执行510-($-$$)次。也就是用0来填充剩下的空间,达到510字节。
二、如何运行该“操作系统”
1、环境准备
(1)计算机操作系统(Windows)
(2)虚拟机(VMware)
(3)汇编编译器(NASM)
(3)软盘(虚拟软盘RamDiskNT)
(4)rawrite.exe/本书光盘自带OS/Tools/FloppyWriter,负责将程序写入到软盘。
2、编译boot.asm
将上述代码文件命名为boot.asm,然后使用nasm命令编译该文件。
nasm boot.asm –o boot.bin
3、虚拟软盘A
点击Start之后,查看“我的电脑”里是否有虚拟软盘A,如果没有,重启。
4、将boot.bin写入到软盘A
点击Enter。(注意boot.bin与Rawrite.ext在同一文件目录下)。
5、创建虚拟机
安装VMware,在VMware创建一个虚拟机,命名为Tinix,并设置系统引导盘为软盘A。
启动该系统,得出结果图为:
三、本操作系统启动流程
打开计算机电源;加电自检(POST);寻找启动盘,该系统设置从软盘启动,计算机检查软盘的0面0磁道1扇区,如果发现它以0xAA55结束,则BIOS会认为它是一个引导扇区;BIOS将该512字节扇区内容加载到内存地址0000:7c00;跳转到0000:7C00出将控制权交给这段引导代码。到此为止,计算机不再由BIOS中固有的程序来控制,而变成由操作系统的一部分来控制。
上述工具下载地址 http://download.csdn.net/detail/zgh1988/6922887
转载于:
/article/2894172.html
相关文章推荐
- 《一个操作系统的实现》读书笔记-- 第一章--最小的“操作系统”
- 深入理解计算机操作系统(第二版) 读书笔记(第一章 计算机系统漫游)
- 第一章《马上动手写一个最小的操作系统》
- 第一章 自己动手写第一个最小的“操作系统”
- 第一章--最小的“操作系统”
- 深入解析Windows操作系统(Windows Internals) 4th Edition 读书笔记 - 第一章 概念和工具(一)
- 现代操作系统读书笔记第一章 引论
- 操作系统概念--读书笔记之第一章导论(一)
- 《一步一步写嵌入式操作系统——ARM编程方法与实践》(第一章、第二章)读书笔记
- windows网络编程第二版 第一章 winsock简介 读书笔记
- <虚拟化与云计算>读书笔记--第一章 数据中心的构建与管理
- 《数据仓库》读书笔记:第一章
- 长尾理论读书笔记:第一章 长尾市场
- 《TCP/IP详解 卷1:协议》 读书笔记 第一章 概述
- 《构建之法》第一章读书笔记
- 读书笔记-现代操作系统-6死锁-6.7其他问题
- C++ Primer 读书笔记 - 第一章
- 第一章 开篇 - 编程珠玑 - 读书笔记
- effective STL 读书笔记——第一章:容器
- Android源码设计模式解析与实战(Based on Lollipop) 第一章 读书笔记