linux 2.6源代码情景分析笔记之内存2
linux中的段机制:
在linux中,逻辑地址到物理地址,是经过分段单元->分页单元这两个部分的转换来完成的。其中逻辑地址由段标识符和指定段内相对地址的偏移量。前者16位长的字段(段选择符segment selector),后者是32位长的字段。
段选择符的构成:
15-3(index)指定了放在GDT或者LDT中的相应段描述符的入口
2(TL-table indicator)标志:指明段描述符是在GDT中(TI=0)或者在LDT中(TI=1)
1-0(RPL)请求者特权级:当相应的段选择符号装入cs寄存器中时,指示出cpu当前的特权级;还可以用于在访问数据段时有选择地削弱处理器的特权级(intel文档)
处理器中有几个段寄存器用来存放段选择符,cs,ss,ds,es,fs,gs.其中cs,ss,ds有专门的用途。
cs:代码段寄存器,指向包含程序指令的段。(其中还含有一个两位的字段,用以指明cpu的当前特权级别(current privilege level,CPL)。当为0的时候,代表最高级优先级别,为3时代表最低优先级别。在linux中前者是内核级别,后者用户级别)
ds:数据段寄存器,指向包含静态数据或者全局数据段。
ss:栈段寄存器,指向包含当前程序栈的段。
而段的表示是由8字节的段描述符(segment descriptor)来完成的,此数据描述了段的特征。段描述符放在全局描述符表(global descriptor table,GDT)或局部描述符表(local descriptor table,LDT)中。
GDT在主存地址和大小存放在gdtr寄存器,当前正被使用的LDT地址和大小放在ldtr控制寄存器中。
其中几个字段:
31-24 23-16 15-0(base 63-56 39-32 31-16):包含段的首字节的线性地址。
G(55):为0时段是以字节为单位,为1时以4096的倍数计。
D/B(54):为D或者为B取决于是代码段还是数据段。D或B的含义在两种情况下有区别。当段偏移量的地址为32位,就设为1,如果偏移量16位长,被清0(intel手册)。
0(53)
AVL(52):被linux忽略
19-16 15-0(limit 51-48 15-0):存放段中最后一个内存单元的偏移量,从而决定段长度。如果段大小是按照字节单位则一个段的大小在1个字节到1mb之间变化;如果以4096字节的倍数计算,则在4kb-4GB之间变化。
p(47):segment-present标志:等于0表示段当前不在主存中。linux总将此设置(47位)为1
DPL(46-45):描述符特权级(descriptor privilege level)字段,用于限制对于这个段的存取。表示为访问这个段要求的cpu最小的优先级别。因此,dpl设为0的段只能当cpl为0时(内核态)才是可访问的,而dpl设为3的段对任
相关文档:
TIMER_INITIALIZER():
1):TIMER_INITIALIZER()用来声明一个定时器,它的定义如下:
#define TIMER_INITIALIZER(_function, _expires, _data) { \
.function = (_fun ......
级别: 中级 M. Tim Jones, 顾问工程师, Emulex 2007 年 1 月 15 日 虚拟化的含义丰富,应用广泛。目前虚拟化技术主要关注于服务器虚拟化,即在一个宿主计算机上提供多个独立操作系统。本文将探索虚拟化背后的思想,然后讨论实现虚拟化的一些技术。我们还将了解现有的其他一些虚拟化技术,例如 Linux 上操作系统的虚拟化 ......
Linux 2.6.19.x 内核编译配置选项简介 作者:金步国 版权声明 本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布。任何人都可以自由使用、转载、复制和再分发,但必须保留作者署名,亦不得对声明中的任何条款作任何形式的修改,也不得附加任何其它条件。您可以自由链接、下载、传播此文档 ......
linux上进程有5种状态:
1. 运行(正在运行或在运行队列中等待)
2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)
3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
5. 停止(进程收到SIGSTOP, SIGSTP, ......