1.操作系统如何从BIOS到MBR的

简介: 1.操作系统如何从BIOS到MBR的

1.操作系统如何从BIOS到MBR

1.1首先进入BIOS系统

BIOS系统保存在ROM可读存储器里面,在这里面并不会被掉电擦除。所有BIOS程序基本上不会改变。

这里产生3个问题:

1.BIOS是由谁加载的

2.BIOS被加载在哪里

3.BIOS的cs:ip是谁来更改的

BIOS程序保存在ROM里面,在开电的一瞬间CPU的CS:IP被强制初始化为0xF0000:0xFFF0。在实模式下被转化为0xFFFF0地址,在实模式下0xFFFFF是最大的寻址空间。在怎么小的空间里面保存不了BIOS的代码。所以这里存放的是转移指令 jmp far f000:e05b。BIOS代码真正的保存在0xfe05b处。

BIOS所做的工作是检测内存和显卡等外设信息。当检测通过的时候,并初始化硬件后,开始在内存中0x000~0x3FF处建立数据结构,中断向量表并填写中断例程。


1.2当BIOS程序使命完成之后调用MBR(主引导)程序

BIOS通过跳转指令转移jmp 0:0x7c00实现的。

为什么跳转到0x7c00处呢?为的是不能让MBR程序过早的被破坏或者覆盖其他程序。

被认为是MBR程序,必须末尾两个字是0x55和0xaa,这样BIOS才把相应段认为是MBR段。

;主引导程序 
;------------------------------------------------------------
SECTION MBR vstart=0x7c00         
   mov ax,cs      
   mov ds,ax
   mov es,ax
   mov ss,ax
   mov fs,ax
   mov sp,0x7c00
; 清屏 利用0x06号功能,上卷全部行,则可清屏。
; -----------------------------------------------------------
;INT 0x10   功能号:0x06     功能描述:上卷窗口
;------------------------------------------------------
;输入:
;AH 功能号= 0x06
;AL = 上卷的行数(如果为0,表示全部)
;BH = 上卷行属性
;(CL,CH) = 窗口左上角的(X,Y)位置
;(DL,DH) = 窗口右下角的(X,Y)位置
;无返回值:
   mov     ax, 0x600
   mov     bx, 0x700
   mov     cx, 0           ; 左上角: (0, 0)
   mov     dx, 0x184f    ; 右下角: (80,25),
         ; VGA文本模式中,一行只能容纳80个字符,共25行。
         ; 下标从0开始,所以0x18=24,0x4f=79
   int     0x10            ; int 0x10
;;;;;;;;;    下面这三行代码是获取光标位置    ;;;;;;;;;
;.get_cursor获取当前光标位置,在光标位置处打印字符.
   mov ah, 3    ; 输入: 3号子功能是获取光标位置,需要存入ah寄存器
   mov bh, 0    ; bh寄存器存储的是待获取光标的页号
   int 0x10   ; 输出: ch=光标开始行,cl=光标结束行
      ; dh=光标所在行号,dl=光标所在列号
;;;;;;;;;    获取光标位置结束    ;;;;;;;;;;;;;;;;
;;;;;;;;;     打印字符串    ;;;;;;;;;;;
   ;还是用10h中断,不过这次是调用13号子功能打印字符串
   mov ax, message 
   mov bp, ax   ; es:bp 为串首地址, es此时同cs一致,
      ; 开头时已经为sreg初始化
   ; 光标位置要用到dx寄存器中内容,cx中的光标位置可忽略
   mov cx, 5    ; cx 为串长度,不包括结束符0的字符个数
   mov ax, 0x1301 ; 子功能号13是显示字符及属性,要存入ah寄存器,
      ; al设置写字符方式 ah=01: 显示字符串,光标跟随移动
   mov bx, 0x2    ; bh存储要显示的页号,此处是第0页,
      ; bl中是字符属性, 属性黑底绿字(bl = 02h)
   int 0x10   ; 执行BIOS 0x10 号中断
;;;;;;;;;      打字字符串结束   ;;;;;;;;;;;;;;;
   jmp $    ; 使程序悬停在此
   message db "1 MBR"
   times 510-($-$$) db 0
   db 0x55,0xaa

这里贴上一个MBR主引导区的代码。

程序中的知识点:

1.SECTION MBR vstart=0x7c00

这里给编译器指明MBR开始的地址设置在0x7c00处,但是实际上程序的还是在本文件的开头处。这种写法只有提前规定了该段程序的地址,才可以进行声明。CPU就直接从这个地址处进行程序的执行。


2.INT 0x10或者INT 0x13

INT 0x10调用中断,在调用中断的时候,需要提前设置好寄存器的值,这样才能调用中断。


3. $ 和 $$

$表示当前行, $ $表示此section的虚拟起始地址。


4.times 510-( $ - $$) db 0

$ - $$标识程序所占的大小。并且510减去这个大小,表示这个程序字节大小到510个字节还有多少个字节。剩下的用0进行填写。


寄存器赋值

寄存器的值只能通过通用寄存器AX,BX,CX,DX进行间接复制,不能直接用立即数进行赋值。


目录
相关文章
|
存储 小程序 Unix
《操作系统真象还原》——0.28 MBR、EBR、DBR和OBR各是什么
MBR和EBR是分区工具创建维护的,不属于操作系统管理的范围,因此操作系统不可以往里面写东西,注意这里所说的是“不可以”,其实操作系统是有能力读写任何地址的,只是如果这样做的话会破坏“系统控制权接力赛”所使用的数据,下次开机后就无法启动了。
3845 0
|
6月前
|
存储 Unix Linux
手写操作系统(4)——计算机是如何启动的?BIOS、GRUB、文件系统......
手写操作系统(4)——计算机是如何启动的?BIOS、GRUB、文件系统......
115 1
|
存储 Linux 算法
《操作系统真象还原》——0.20 BIOS中断、DOS中断、Linux中断的区别
BIOS够底层吧?难道它还要依赖别人?是啊,BIOS也是软件,也要有求于别人。首先硬件厂商为了让自己生产的产品易用,肯定事先写好了一组调用接口,必然是越简单越好,直接给接口函数传一个参数,硬件就能返回一个输出,如果不易用的话,厂商肯定倒闭了。
4760 0
|
Linux 内存技术
《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》——1.1 启动BIOS,准备实模式下的中断向量表和中断服务程序
本节书摘来自华章计算机《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》一书中的第1章,第1.1节,作者:新设计团队著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1873 0
|
JavaScript 前端开发 Linux
《操作系统真象还原》——2.3 让MBR先飞一会儿
虽说主引导记录mbr是咱们能够掌控的第一个程序,但这并不是让我们为之激动的理由。我们平时所写的程序都要依赖于操作系统,而我们即将实现的这个程序是独立于操作系统的,能够直接在裸机上运行,这才是让我们激动的理由,对咱们来说这无疑是历史性的一刻。
2412 0
|
存储 内存技术 程序员
《操作系统真象还原》——2.2 软件接力第一棒,BIOS
Intel 8086有20条地址线,故其可以访问1MB的内存空间,即2的20次方=1048576=1MB,地址范围若按十六进制来表示,是0x00000到0xFFFFF。不知道硬件工程师当时设计的初衷是什么,总之人家有自己的理由,这1MB的内存空间被分成多个部分。
2100 0
|
存储
《操作系统真象还原》——第2章 编写MBR主引导记录,让我们开始 掌权 2.1 计算机的启动过程
所以,都在内存中运行程序,操作系统和硬件设计都省事了,这可能也是为了方式的统一吧,否则总不能出现某种存储介质后,操作系统和硬件就要付出额外努力去支持。当然,具体原因只有硬件工程师才知道,咱们在此先打住,继续咱们的内容。
1559 0
|
3天前
|
存储
进入BIOS设置和基本选项
进入BIOS设置和基本选项