易截截图软件、单文件、免安装、纯绿色、仅160KB

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的地址空间分为两部分:内核地址空间和用户地址空间。
内核地址空间的映射采用直接映射,为固定偏移值。


相关文档:

实战Linux Bluetooth编程 (七) SDP协议

Service Discovery Protocol(SDP)提供一种能力,让应用程序有方法发现哪种服务可用以及这种服务的特性。
服务发现协议(SDP或Bluetooth SDP)在蓝牙协议栈中对蓝牙环境中的应用程序有特殊的含意,发现哪个服务是可用的和确定这些可用服务的特征。SDP定义了bluetooth client发现可用bluetooth server服务和它们的特征的方法。 ......

linux下gdb单步调试

GDB 概述
————
GDB 是 GNU 开源组织发布的一个强大的 UNIX 下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像 VC 、 BCB 等 IDE 的调试,但如果你是在 UNIX 平台下做软件,你会发现 GDB 这个调试工具有比 VC 、 BCB 的图形化调试器更强大的功能。所谓 “ 寸有所长,尺有所短 &rd ......

linux 系统安装和软件推荐

1、安装基本系统
这里安装使用的是Ubuntu 7.04 的 Alternate CD。使用 Alternate CD 引导启动,然后选择 “安装命令行系统(Install Command Line)” 进行最小化安装,在这一步,要注意,一定不要选择中文语言环境,否则在终端窗口下的各种提示,有很多都是中文的。在没有装载完成X Window之前,你只能看到一堆 ......

Linux下串口信息的读取

1. 打开串口
  与其他的关于设备编程的方法一样,在Linux下,操作、控制串口也是通过操作起设备文件进行的。在Linux下,串口的设备文件是/dev/ttyS0或/dev/ttyS1等。因此要读写串口,我们首先要打开串口:
 
  char *dev = "/dev/ttyS0"; //串口1
 
  int fd = open( dev, O_RDWR );
 
  //| O_NOCT ......

linux 32位与64位系统下数据类型长度的区别

近日在centos下用c写东西,这个程序的服务端运行在64位的centos下,客户端有可能是32机,也有可能是64位的。
为了保证数据传输的一致性制定了一套协议,用struct实现。为了保证输出过程中,数据的完整性,特别针对系统的不同对struct里变量的类型进行了优化。为了保证内存对齐方式的一致和数据存储空间的紧凑,都用 #pragm ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号