Linux学习笔记零零二

实模式为什么不安全?

在实模式中,cpu根据指令类型决定采用DS、CS、ES还是SS,从段寄存器中取出基值,再从指令中取出偏移值。这里存在两个问题:

1. 段寄存器的值可以被普通权限的指令访问,这就意味着用户进程可以修改段寄存器的值。

2. 偏移值为16位,可以访问从基地址开始的64K的连续空间。

通过这两个值,可以访问整个空间。

 

保护模式的由来:

8086是8位CPU,实模式;80286采用保护模式;80386是32位CPU。

 

保护模式:

16位的段寄存器分成了几部分:高13位决定了偏移值;1位决定是GPDR还是LPDR;2位决定访问权限。cpu根据指令决定采用哪个段寄存器后(例如,jump就是访问CS),根据段寄存器中的值决定是GPDR还是LPDR;GPDR和LPDR中存储了段描述表的基地址值;再根据13位的偏移值确定段描述表项。段描述表项的大小是8个字节;其中4个字节记录了段的基地址值,20个位记录了段的长度;剩下12个位记录了权限等信息。

 

保护模式为什么安全?

在80286时,有两种模式:特权模式和普通模式;在80386,分成了4级:0-3;其中0级权限最高,3级权限最低;linux一般只使用0级和3级。

段寄存器可以用普通权限指令访问,但GPDR和LPDR必须用特权指令访问。这就意味着,即便是段寄存器改变了,由于段描述表不可修改,因此,用户进程无法访问其他进程的空间。

 

段管理机制的缺陷:

段的大小是灵活的,这在导入段的内容时,会不方便;

段的大小不宜过小,即便是有2的13次方个段,仍然可能不够,使得频繁更改段寄存器的值。

 

80386引入了分页管理机制;

80386为了兼容286,采用了段页结合的映射方式。首先将逻辑地址通过段式映射到线性地址,再用页式映射到物理地址。

从线性地址到物理地址是如何映射的呢?

将线性地址分成三部分:页目录表偏移值+页表偏移值+页内地址;引入一个CR3寄存器存储页目录表基地址,再根据页目录表偏移值找到页表基址,再根据页表偏移值找到对应的页;页目录表偏移值为10位,页表偏移值位10位,页内地址位12位。一个页的大小为4KB。

 

存储管理:

为了兼容多种CPU,Linux采用了一种虚拟分层的机制。分为三层。在页目录表和页表之间插入了中间表。

 

如何将三层映射到80386的两层上:

将中间表大小设置位0.

 

Linux的地址空间分为两部分:内核地址空间和用户地址空间。

内核地址空间的映射采用直接映射,为固定偏移值。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值