技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 系统运维 --> 引导扇区实现

引导扇区实现

浏览:2800次  出处信息

   最近一段时间把自己之前写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看下效果:

   

   到这里一个简单的启动扇区就成功实现了.

QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1