OS真象还原-读书笔记(一)

OS真象还原-读书笔记(一)

1.操作系统是什么?

操作系统是一个“人”,用户进程也是“人”;
操作系统是软件,用户进程也是软件;
操作系统是一个“部落首领”,负责指挥;用户进程是“部落平民”,负责听指挥;
操作系统负责搭建一个有序良好的组织,并对其进行管理。但是cpu不对操作系统和用户进程进行区分。统一认为他们是软件。

2.软件如何访问硬件

cpu通过 接口访问硬件。总体上大致分为串行和并行。

访问外部硬件有两个方式:

1.将某个外设的内存映射到一定范围的内存空间中,cpu通过地址总线访问该内存区域会落到相应外设的的内存中。
举例:显卡,汇编时候,显存被映射到主机物理内存上的低端1M 的0xB8000~0xBFFFF地址上。
2.外设通过IO接口与CPU进行通信。CPU访问外设,就是访问IO接口。

访问IO接口本市上就是访问那些寄存器,这些寄存器就是人么常说的端口。

3.应用程序时什么,和操作系统是如何配合到一起的?

他们两都是软件,CPU知道去cs:ip寄存器中指向的内存取指令并执行。

总结,操作系统是人想出来的,为了让自己管理计算机方便而创造出来的一套管理方法。

其实没有语言的存在,有的只是编译器。语言只是编译器和大家的约定。
C运行库,CRT。
应用程序加上操作系统才算是完整的程序。

用户态和内核态是对CPU来讲的,是指CPU运行在用户态(特权3级)还是内核态(特权0级)。

注意,用户进程永远不会因为进入内核态而变身为操作系统。

编译器下载的时候对应操作系统版本号,因为已经把宿主系统的系统调用号写死了。不同系统不一样。linux系统,直接嵌入汇编代码“int 0x80”便可以直接执行系统调用。

4.当用户程序访问系统资源时,需要进行系统调用,CPU进入内核态,也称为管态。

5.内存访问为什么要分段?

首先,内存是随机读写设备,就是访问其内部任何一处,不需要从头开始找,只要直接给出其地址便可。

分段是内存访问机制,是给CPU用的访问内存的方式,只有CPU才关注段。

分段是从8086开始的,16位寄存器,那时没有虚拟地址一说,只有物理地址,访问任何存储单元都可以直接给出物理地址。

在直接以绝对物理地址访问内存的CPU上运行程序,该程序中指令的地址也必须得是绝对物理地址。

总结,要想在一个硬件上运行,就要遵循该硬件的规则,操作系统和编译器无一例外。

但是这样也就产生了一个重要问题——若加载程序运行,不论是内核程序,还是用户程序,程序中的地址若都是绝对物理地址,那该程序必须放在内存中固定的地方,于是,两个编译出来地址相同的用户程序无法同时运行,只能运行一个。

为了解决以上的问题,所以,采用分段的方式,让CPU采用“段基址+段内偏移地址”的方式来访问任意内存,这样的好处是程序可以重定位了,尽管程序指令中给的是绝对物理地址,但是可以同时运行多个程序了。

重定位:简单的说,就是将程序中的指令的地址改写成另外一个地址,但该地址处的内容还是原地址处的内容。

关键点:只要程序分了段,把整个段平移到任何位置后,段内的地址相对于段基址是不变的,无论段基址是多少,只要给出段内偏移地址,CPU就能访问到正确的指令。于是加载用户程序时,只要将整个段的内容复制到新的位置,再将段基址寄存器中的地址改成该地址,程序便可准确无误地运行,因为程序中用的是段内偏移地址,相对于新的段基址,该偏移地址处的内存内容还是一样的。

说白了,就是段基址,变了,但是段偏移地址没变,也就是相对位置没变,因为段的内容是直接拷贝的,所以段的内容也没变,所以可以找到原来的内容的拷贝。

一个段最多访问64KB。改变段基址,有一个段变为另一个段,就像一个段在内存中滑动,采用这种在内存中来回挪位置的方式可以访问到任意内存位置。

所以,程序分段又是为了将大内存分成可以访问的小段,通过这样变通的方法就可以访问到所有的内存。

6.代码中为什么分为代码段,数据段?

首先指令是连续紧凑的,其次是通过机器码能够判断当前指令长度,当前指令地址+当前指令长度=下一条指令地址。
指令的连续是指执行逻辑上的连续性。

对齐的话,是数据对齐,不是指令对齐。指令大小是由实际指令的操作码决定的,也就是说CPU在译码阶段拿到操作码之后,就知道实际指令所占的大小。

将数据和代码分开的3点好处

1.可以为他们赋予不同的属性;
2.为了提高CPU内部缓存的命中率;
CPU内部有针对数据和针对指令的两种缓存机制。增强程序的局部性。
3.节省内存。

GDT,全局描述符表。

总结:

1.编译器负责挑选出数据具备的属性,从而根据属性将程序片段分类,比如,划分出制度属性的代码段和可写属性的数据段。
2.操作系统通过设置GDT全局描述符表来构建段描述符,在段描述符中指定段的位置、大小以及属性。
这里,操作系统认为代码应该是只读的,所以给用来指向代码段的那个段描述符设置了只读的属性,这才是真正给段添加属性的地方。
3.CPU中的段寄存器提前被操作系统赋予相应的选择子,从而确定了指向的段,在执行指令时,会根据该段的属性来判断指令的行为,若有返回则发出异常。

7.物理地址、逻辑地址、有效地址、线性地址、虚拟地址的区别?

物理地址就是物理内存真正的地址,实模式下,“段基址+段内偏移地址”经过段部件的处理,直接输出的就是物理地址,CPU可以直接通过此地址访问内存。

在保护模式下,“段基址 + 段内偏移地址”称为线性地址,不过,此时的段基址已经不是真正的地址了,而是选择子。

无论在实模式还是保护模式下,段内偏移地址又称为有效地址,也称为逻辑地址。

线性地址或称为虚拟地址,都不是真实的内存地址。他们都用来描述程序或任务的地址空间。由于分页功能是需要在保护模式下开启的,32位系统保护模式下的寻址空间式4GB,所以虚拟地址或线性地址就是0~4GB的范围。

平坦模型指的就是一个段

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值