引导扇区实现
最近一段时间把自己之前写OS的体会全部以博文的方式放出并讲述其深层次原理, 有志同道合的朋友可以和我以"回复"的形式进行交流,也可以发邮件给我, 这里先呈现一个简单OS的实现, 模拟器用的是linux下的bochs.
所谓引导扇区是指设备的第一个扇区,用于加载并转让处理器控制权给操作系统, 当计算机启动加电自检时,会寻找启动盘,现在电脑一般启动程序都在硬盘上,说到这可以是什么程序可以从硬盘中把程序读到计算机的内存(RAM)呢?是大部分人都知道的BIOS,那BIOS又是怎么启动的呢?我们从开机启动,只能先启动硬件,要想能够运行程序,首先需要硬件能够知道程序在哪里,在Intel的所有80x86系列的CPU中都为加电就进入16位的实模式下运行,什么为实模式?实模式是x86兼容CPU的操作模式,它是一个20bit的存储器的地址空间(2^20=1M可被寻址),其实以后我会说到保护模式,你就知道实模式的渺小(寻址范围远远不够),接着说,当加电的时候,CS:IP的值会是:0xF000:0xFFF0,物理地址会是:段地址(CS)*16+偏移地址(IP),比如刚才的计算结果为0xFFFF0就为BIOS的地址,所以加电后,硬件会首先执行这个地址的代码
BIOS启动好后,BIOS就会接着启动剩下的操作系统的程序,比如引导程序,它会检查磁盘的0面0磁道1扇区(主引导区),若发现这个扇区中的程序是以0xaa55结束的,会认为这个扇区为一个引导扇区,BIOS一旦发现这是个引导区就会把它加载至内存并把处理器控制权交给这段引导程序.
其中这里会把那段引导代码加载至0x7c00处. 所以引导程序会有一段:
org 0x7c00
到这基本引导扇区原理基本就这样, 我们来看下一段简单的引导扇区代码:
org 07c00h ;bios会把代码加载至0x7c00处,并跳转到该地址运行 mov ax, BootMsg ;把BootMsg首地址传给ax mov bp, ax ;放入基地址寄存器 ES:BP = 显示字符串的地址 mov cx, 12 ;BootMessage的长度为12 mov ax, 01301h ;AH=13H ,在Teletype显示字符串 具体请看下面10h中断参数 mov bx, 000ch mov dl, 0 int 10h ;中断 jmp $ BootMsg: db "Hello,CB_OS!" times 510-($-$$) db 0 dw 0xaa55 ;扇区结束地址
程序比较简单, 其中int 10h前面有三句
mov ax, 01301h mov bx, 000ch mov dl, 0
这里可以参考下面一段参数说明:
功能号:13H
功能:在Teletype模式下显示字符串
入口参数:AH=13H
BH=页码
BL=属性(若AL=00H或01H)
CX=显示字符串长度
(DH、DL)=坐标(行、列)
ES:BP=显示字符串的地址 AL= 显示输出方式
0—字符串中只含显示字符,其显示属性在BL中。显示后,光标位置不变
1—字符串中只含显示字符,其显示属性在BL中。显示后,光标位置改变
2—字符串中含显示字符和显示属性。显示后,光标位置不变
3—字符串中含显示字符和显示属性。显示后,光标位置改变
使用nasm编译这段引导程序:
nasm -o boot.bin boot.asm
我们这用bochs来模拟, 所以直接把程序写进镜像:
dd if=./boot.bin of=boot.img bs=512 count=1 conv=notrunc
ok, 启动bochs看下效果:
到这里一个简单的启动扇区就成功实现了.
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:Crazybaby 来源: 狂Shell - Happy Hacking狂Shell - Happy Hacking
- 标签: 引导扇区
- 发布时间:2013-05-20 23:23:31
- [70] Twitter/微博客的学习摘要
- [65] find命令的一点注意事项
- [64] IOS安全–浅谈关于IOS加固的几种方法
- [64] 如何拿下简短的域名
- [63] android 开发入门
- [62] 流程管理与用户研究
- [62] Go Reflect 性能
- [60] Oracle MTS模式下 进程地址与会话信
- [59] 图书馆的世界纪录
- [58] 读书笔记-壹百度:百度十年千倍的29条法则