深入理解linux内核笔记七:内存管理(1)之内存寻址
1 内存地址
linux中,我们必须区分三种不同的地址
逻辑地址:机器语言指令中用来指定一个操作数和一个指令的地址.在X86中,每一个逻辑地址都由一个段(segment)和偏移量(offset)组成.
线性地址(也称虚拟地址):是一个32位无符号函数,可以表示高达4GB的地址,范围从0x00000000到0xffffffff.
物理地址:用于内存芯片级寻址,它们与从微处理器的地址引脚发送到内存总线上的电信号相对应.
逻辑地址转换图
2 分段
① 硬件分段
段选择符和段寄存器
一个逻辑地址由一个段标识符和一个段内相对地址的偏移量组成.段标识符是一个16位长的字段,称为段选择符
Index:指定在GDT或LDT中相应段描述符的入口
TI:指明段描述符在GDT(TI=0)或LDT(TI=1)中
RPL:请求者特权级,当相应段选择符装入到cs寄存器中指示出cpu当前的特权级.
X86中提供了6个段寄存器cs ss ds es fs gs,段寄存器的唯一目的就是存放段选择符.
段描述符
每一个段描述符由8个字节组成,段描述符放在全局描述符表或局部描述符表中
Base:包含段的首字节的线性地址
G: 粒度标志,0以字节为单位,否则以4096字节为单位
Limit:存放段中最后一个内存单元的偏移量,从而决定段的长度.如果G为0,则一个段的大小在1个字节到1MB之间,否则,在4KB到4GB之间
S: 系统标志,0为系统段,否则普通的代码段或数据段
Type:描述段的类型特征和它的存取权限
DPL: 描述段的特权级.表示访问这个段要求的cpu最小的优先级
P: Segment-Present标志,等于0表示段不在主存中,linux总把这个标志设为1
D或B:称为D或B标志,取决于是代码段还是数据段,如果段偏移量地址是32位,就基本把它设置为1,如果这个偏移量是16位,它被清为0
AVL: 被linux忽略
Linux中广泛使用下面三种段描述符
代码段描述符:可以放在GDT或LDT中,该描述符置S为1
数据段描述符:可以放在GDT或LDT中,该描述符置S为1,栈段通过一般的数据段实现
任务状态段描述符:表示一个任务状态段
相关文档:
一:前言
最近在研究android的sensor driver,主要是E-compass,其中用到了Linux input子系统.在网上也看了很多这方面的资料,感觉还是这篇分析的比较细致透彻,因此转载一下以便自己学习,同时和大家分享!
(这篇博客主要是以键盘驱动为例的,不过讲解的是Linux Input Subsystem,可以仔细的研究一下!)
键盘驱动将检 ......
陈皓 (CSDN)
概述
——
什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在 ......
Redhat5下利用yum安装SVN客户端
由于Redhat5自带的SVN的版本是1.4.1的,比较老,不能读取SVN1.5的库,所有要更新:
直接运行:yum update subversion
会抱错:
http://ftp.sjtu.edu.cn/centos/5/updates/i386/repodata/repomd.xml: [Errno 14] HTTP Error 403: Forbidden
将repo地址改称USTC(科大的),
......
How to change the hostname of a Linux system
Normally we will set the hostname of a system during the installation process. Many peoples don’t care about this, and don’t change the hostname even if for example this was set to something really stupid by the datacenter that installed the ......
用GCC开发linux应用程序(经典)
2009年11月01日 星期日 23:58
作为自由软件的旗舰项目,Richard Stallman 在十多年前刚开始写作 GCC 的时候,还只是把它当作仅仅一个 C程序语言的编译器;GCC 的意思也只是 GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持 C语言;它现在还支持 Ada 语言、C++ 语言、Ja ......