自制操作系统3

我们在上一张简单的介绍了MBR,本讲,我们来细说MBR。

在细说MBR之前,我们先来厘清两个概念即section和segment。但从字面的英文词典上来说,section有人为区分,切割的而成的“部分”意思,而segment则更偏向自然形成的“部分”。在汇编中“人为”切割而成的section集合,组成了“自然”的segment。

3.1 地址

程序中不同的变量有着不同的大小,而这个变量距离文件的起始位置的偏移量,就是该变量的地址。编译器所要做的事情就是给写好的代码编址。就好比旅馆,变量是其中的一个一个固定大小的房间,而编译器就是这个旅店的管理员,来给这些已经存在的“房间”分配“房间号(地址)”。

地址的本质就是偏移量,假设在文件开头的0位置存在一个32Bit的int型,那么它之后的变量的地址就是0+4Bytes=4,也就是偏移量为4。

每个变量的地址=前一个变量的起始地址+前一个变量的内存空间大小。

而section的真正作用就是帮助程序员,更好的区分指令和数据的结构,比如section指令section,section数据section,在真正变成机器码之后,section有跟没有都是一个样的。

vstart的作用是告诉编译器,让编译器把后面的所有数据(指令和变量)的地址都已xxxx为起始地址开始“分配”房间号。就只有这么一点意思。

vstart的另一个作用是告诉加载器,把我加载到内存中的xxxx地址处,在上节编写的MBR中,我们使用了vstart=0x7c00,使用vstart的前提是,我们已经知道BIOS会将MBR加载到内存0x7c00的位置处,所以,vstart之后的内容都是相对于0x7c00的偏移量。如果vstart中的这个地址超过了文件的大小,则这个地址不会落到该文件内,这有就是我们为什么会说vstart是“虚拟的”地址。

地址不管是不是虚拟的,只要交给地址总线,地址总线就会按照给定的地址去寻找该地址出的内容。在我们使用vstart时,只要保证,该地址处的内容是你所需要的即可。

小结:在3.1中,我们大概了解了

地址:其实就是相对于文件起始位置的一个偏移量

section:只是用来人为的标记,帮助程序编写人员更好的划分数据和指令,实际的机器码中有section和没有section一个样

vstart:标记的是一个"虚拟"的起始地址,所谓的虚拟就是,当指定的该地址可以是任意的,如果该地址超过了该文件内容的范围,那么该地址将会落在文件的外面,即文件中不存在的位置,相对于这个文件而言,它不存在,即“虚拟的”。

3.2 CPU的实模式

cpu的工作原理,参考http://blog.sina.com.cn/s/blog_54f82cc2010121yj.html

CS和IP是8086CPU中两个最关键的寄存器,它们指示了CPU当前要读取指令的地址。CS为代码段寄存器,IP为指令指针寄存器,从名称上我们可以看出它们和指令的关系

在8086PC机中,任意时刻,设CS中的内容为M,IP中的内容为N,8086CPU将从内存M*16+N单元开始,读取一条指令并执行。

也可以这样表述:8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行。

实模式下的寄存器:

寄存器:寄存器使用SRAM(Static RAM)来存储数据,SRAM比DRAM要快。原因是寄存器是用触发器实现的,这也是一种工作电话,工作速度极快,是纳秒级别的。

在80x86 CPU中设置的段寄存器只有16位,只能存放20位段起始地址的高16位,称它为段基值(Segment Base Value),而机器将段起始地址的低4位设置为0。故将段基值左移4位后(即末尾加4位二进制0),就得到一个20位的段起始地址,称它为段基地址或段基址(Segment Base Address)。显然,段基址为xxxx0H,其低4位二进制数为0,即能被16整除的主存物理地址才可作为段基址。

实模式下的分段的由来:

我们知道8086CPU对外20位地址线,因此,存储器的可寻址范围为1MB,但是8086微处理器的内部结构是16位的,用户可用的寄存器也都是16位(64KB)的,显然用16位的地址码无法寻址1MB的存储空间,如何才能做到呢,8086采用了分段寻址的方式对存储器进行管理,原理如下:
  把1MB的存储空间分成若干段,每段的容量最大是64KB,为什么呢?因为寄存器是16位的,从寄存器送出去的物理地址的寻址空间最大达到2的16次方,也即64KB,这样段内地址就可以用16位来表示了。实际上,可以根据编程的需要来确定段的大小,只要段的大小不大于64KB。段的地址可以用4位来表示,这样结合16位的段内偏移地址就可以实现存储空间1MB的物理寻址了。

有了20位地址,就有了20位的空间,0xffff+0xffff,经过segment base address 左移4位之后最大地址变成0xffff0+0xffff,即0x10ffef,最大的地址是1MB+64KB-16Bytes,A0~A19总共20条地址线的大小为1MB,现在多出来的该怎么办?8086采用的办法是wrap-round地址回卷。例如0xfffff+2就变成了0x100001。但只能容纳20位长的数据,所以最终结果是0x00001.这也引出了保护模式要打开A20地址线的问题。

实际模式的CPU内存寻址方式

主要分为:寄存器寻址;立即数寻址;内存寻址。

一种寻址方式对应一种电路实现,增加一种寻址方式,就会增加电路的复杂性,所以寻址方式是有限的。
  

 

转载于:https://my.oschina.net/u/3424826/blog/911258

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值