操作系统真象还原第二章基础知识整理

BIOS 基本输入输出系统

0xF0000~0xFFFFF,这 64KB 的内 存是 ROM。这里面存的就是 BIOS 的代码。BIOS 的主要工作是检测、初始化硬件,怎么初始化的?硬件自己提 供了一些初始化的功能调用,BIOS 直接调用就好了。BIOS 还做了一件伟大的事情,建立了中断向量表,这样 就可以通过“int 中断号”来实现相关的硬件调用,当然 BIOS 建立的这些功能就是对硬件的 IO 操作,也就是输 入输出,但由于就 64KB 大小的空间,不可能把所有硬件的 IO 操作实现得面面俱到,而且也没必要实现那么多, 毕竟是在实模式之下,对硬件支持得再丰富也白搭,精彩的世界是在进入保护模式以后才开始,所以挑一些重要 的、保证计算机能运行的那些硬件的基本 IO 操作,

cpu地址映射

并不是只有咱们插在主板上的内存条需要通过地址总线访问, 还有一些外设同样是需要通过地址总线来访问的
请添加图片描述
表示地址的那串数字是地址总线的输入,相当于其参数,和内存条没关系。CPU 能够访问一 个地址,这是地址总线给做的映射,相当于给该地址分配了一个存储单元,而该存储单元要么落在某个 rom 中,要么落到了某个外设的内存中,要么落到了物理内存条

Intel 8086

Intel 8086 有 20 条地址线,故其可以访问 1MB 的内存空间,即 2 的 20 次方=1048576=1MB,地址范围若按十六进制来表示,是 0x00000 到 0xFFFFF。不知道硬件工程师当时设计的初衷是什么,总之人家有 自己的理由,这 1MB 的内存空间被分成多个部分。

在这里插入图片描述
先从低地址看,地址 0~0x9FFFF 处是 DRAM(Dynamic Random Access Memory)

DRAM 动态随机访问内存

物理内存就是 DRAM,如 DDR、DDR2 等。又要开始咬文嚼字了,动态是什么意思? 动态指此种存储介质由于本身电气元件的性质,需要定期地刷新。内存中的每一位都是由电容和晶体管来 组成的,您想,单条内存现在都到 4GB,内存条的体积大小您也清楚,那么小的面积得集成多少电容才能 够拼凑出 4GB 的内存容量,不包括相关电路元件,也得是 4GB×8 个电容了。如此小的电容,其缺点也是 明显的,漏电很快,所以漏电了就要及时把电补充上去,这样数据才不至于丢失。这个补充电的过程就称 为刷新。其实不仅是电容需要刷新,就连电信号也是一样的,不知道您注意了没有,我们平时使用的网线, 也是需要在每隔一定长度距离时接个中继放大器,这个就是来放大电信号的,因为物理链路一长,信号衰 减就特别严重,只好通过这种“打气”的方式来保持稳定了

固态硬盘

基于闪存的固态硬盘(IDEFLASH DISK、Serial ATA Flash Disk):采用FLASH芯片作为存储介质,这也是通常所说的SSD。它的外观可以被制作成多种模样,例如:笔记本硬盘、微硬盘、存储卡、U盘等样式。这种SSD固态硬盘最大的优点就是可以移动,而且数据保护不受电源控制,

ROM

只读存储器(Read-Only Memory,ROM)以非破坏性读出方式工作,只能读出无法写入信息。信息一旦写入后就固定下来,即使切断电源,信息也不会丢失,所以又称为固定存储器。ROM所存数据通常是装入整机前写入的,整机工作过程中只能读出,不像随机存储器能快速方便地改写存储内容。ROM所存数据稳定 ,断电后所存数据也不会改变,并且结构较简单,使用方便,因而常用于存储各种固定程序和数据。

开机加载BIOS过程

开机的一瞬间,也就是接电的一瞬间,CPU 的 cs:ip 寄存器被强制初始化为 0xF000:0xFFF0。由于 开机的时候处于实模式,在实模式下的段基址要乘以 16,也就是左移 4 位,于是 0xF000: 0xFFF0 的等效地址将是 0xFFFF0。上面说过了,此地址便是 BIOS 的入口地址。

在这里插入图片描述

主引导记录MBR加载过程

;主引导程序 
;------------------------------------------------------------
;BIOS是通过jmp 0:0x7c00跳转到MBR的,故cs 此时为 0
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

功能描述

屏幕上打印字符串“1 MBR”

实现过程

打印显示”的操作都利用 BIOS 给我们 建立好的例程就好了,这里第 0x10 号中断便是负责有关打印的例程。

0x10 中断是最为强大的 BIOS 中断了
vstart=0x7c00”表示本程序在编译时,告诉编译器,把我的起始地址编译为 0x7c00。

由于BIOS是通过jmp 0:0x7c00跳转到MBR的,故
cs 此时为 0。对于 ds、es、fs、gs 这类 sreg,CPU 中不能直接给它们赋值,没有从立即数到段寄存器的电路实现, 只有通过其他寄存器来中转,这里我们用的是通用寄存器 ax 来中转

初始化栈指针,在 CPU 上运行的程序得遵从 CPU 的规则,mbr 也是程序,是程序就要用到 栈。目前 0x7c00 以下暂时是安全的区域,就把它当作栈来用。

因为在 BIOS 工作中,会有一些输出,如检测硬件的结果信息。为了让大家看 清楚我们在 MBR 中的输出字符串,故先把 BIOS 的输出清掉

第 30~35 行是做打印前的工作,先获取光标位置,目的是避免打印字符混乱,覆盖别人的输出。其实这是防 君子不防小人的做法,万一别人不在光标处打印,自己打印的内容同样也会被别人覆盖。不管别人了,咱们做好 自己的就行,老老实实地只在光标处打印。

您看第 33 行,往 bh 寄存器中写入了 0,这是告诉 BIOS 例程,我要获取第 0 页当前的光标。什么是页呢?

所有个人计算机上的显卡在加电后都将自己置为 8025 这种显示方式。8025 是指 一屏可以显示 25 行、每行 80 列的字符,也就是 2000 个字符。但由于一个字符要用两字节来表示,低字 符是字符的 ASCII 编码,高字节是字符属性,故显示一屏字符需要用 4000 字节(实际上,分配给一屏的 容量是 4KB),这一屏就称为一页,0 页是默认页。

第 38~52 行是往光标处打印字符。说一下第 48 行的 mov ax,0x1301,13 对应的是 ah 寄存器,这是调用 0x13 号子功能。01 对应的是 al 寄存器,表示的是写字符方式,其低 2 位才有意义,各位功能描述如下。
(1)al=0,显示字符串,并且光标返回起始位置。 (2)al=1,显示字符串,并且光标跟随到新位置。 (3)al=2,显示字符串及其属性,并且光标返回起始位置。 (4)al=3,显示字符串及其属性,光标跟随到新位置。

第 55 行执行了个死循环, 是 本 行 指 令 的 地 址 , 这 属 于 伪 指 令 , 是 汇 编 器 在 编 译 期 间 分 配 的 地 址 。 在 最 终 编 译 出 来 的 程 序 中 , 是本行指令的地址,这属于伪指令,是汇编器在编译期间分配的地址。在最终 编译出来的程序中, 会被替换为指令实际所在行的地址。jmp 是个近跳转,$是 jmp 自己的地址,于是跳到自 己所在的地址再执行自己,又是跳到自己所在的地址再继续执行跳转,这样便实现了死循环。可见 CPU 可乖 了,它只会埋头做事,并不会觉得有什么不妥,靠谱,值得依赖。

第 57 行是定义打印的字符串。
第 58 行的KaTeX parse error: Can't use function '$' in math mode at position 24: …ion 的起始地址,上面说过了$̲是本行所在的地址,故$-是本行到本 section 的偏移量。由于 MBR 的最后两个字节是固定的内容,分别是 0x55 和 0xaa,要预留出这 2 个字节,故本 扇区内前 512-2=510 字节要填满,那到底要用多少字节才能填满此扇区呢。用 510 字节减去上面通过 − - $ 得到的偏移量,其结果便是本扇区内的剩余量,也就是要填充的字节数。由此可见第 50 行的“times 510-
( − - $) db 0”是在用 0 将本扇区剩余空间填充。

编译过程和制作启动盘过程

请查看实验文档

总结

整理流程已经大致清楚,但是因为汇编语言并不熟悉,所以此处的汇编操作不是那么深刻理解,不过这个并不影响后边学习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值