《深入理解linux内核》边读边说-内存寻址(二)

硬件中的分段

从80286模型开始,INTEL处理器添加了一种叫保护模式的东西。所以现在的CPU有两种模式:实模式(80286以前CPU运行的模式),保护模式(现代的CPU大部分时间工作的模式)。
CPU刚加电开机的时候处于实模式。这种模式下对内存的寻址是直接使用物理地址寻址。而且可寻址的空间很有限,只有1MB。
经过一定的转换机制后CPU进入保护模式(CR0寄存器的PE为置1,PE位为CR0寄存器的第0位),保护模式中,CPU的寻址能力得到扩展能使用所有的可用内从空间。
实模式存在的主要原因是为了保持和以前处理器的兼容(现在都32年过去了,还得和1978年的8086CPU保持兼容。。。。),并且让操作系统自举。
保护模式相关更多信息请看:http://en.wikipedia.org/wiki/Protected_Mode

段选择符和段寄存器

CPU中有6个段寄存器分别是:CS,DS,SS,ES,FS,GS。
这些中三个寄存器有专门的用途:
CS:代码段寄存器,可执行的指令就包含在这里,执行时SC:IP指向要执行的指令(当前执行)。
SS:栈段寄存器,程序的栈就在这个段。
DS:数据段寄存器,保存程序执行时的数据。
其他寄存器可以用做任意用途。
这里简单说一下没启用保护模式的时候分段机制。
没启用保护模式的时候段寄存器直接存储地址的高16位,而偏移表示底16位。
也就是物理地址=段寄存器*16+偏移地址
开启保护模式后段寄存器保存的就不是简单的保存物理地址高位,而是保存叫段选择符(Segment Selector)的东西。
PS:以下注意段选择符,段描述符,这两个是不同的,分别用于选择和描述一个段。
段选择符的结构如图:

Segment Selector format

Segment Selector format

[阅读全文] »

《深入理解linux内核》边读边说-内存寻址(一)

内存地址

内存地址有三种类型:逻辑地址,线性地址,物理地址。
逻辑地址:常见程序所表示的地址就是逻辑地址。比如MS-DOS程序设计时使用DS:EAX,CS:IP等地址都是逻辑地址。此类地址把地址分为段偏移的模式来把程序分为若干段。在逻辑地址层面上可以把内存看为若干个段来分开的空间。
线性地址:线性地址是32位整数。是逻辑地址通过分段单元转换后的结果。在线性地址上可以把内存看为0×00000000到0xfffffff的线性空间。
物理地址:芯片级寻址用的地址。与地址总线上的电信号对应。

刚开始突然接触三种地址有点晕,可以这么理解:
比如把内存比喻成几本书落在一起。
逻辑地址的模式是,第X本书的第Y页的内容。
线性地址的模式是:从头数,第XX页的内容。
物理地址的模式是:从头开始测量第N毫米的页的内容。
虽然这种比喻在后面的说实际工作模式的时候会发现不太正确。但是现在对于理解三种地址还是有些帮助的。
CPU和内存真正进行数据交换的时候需要使用物理地址,而一般程序所使用的是逻辑地址。可能会有疑问为什么会进行两次转换,而不是一次转换搞定的策略,这个问题在接下来的分析中会浮出水面。

[阅读全文] »

linux内核技术手册英文电子版

关于这本书的详细介绍在
新书入账-LINUX内核技术手册
本书根据CC2.5协议免费发布,看完了感觉不错。
对gentoo等从零开始类发行版安装的时候作为内核帮助手册很不错。
分享下。
官网:http://www.kroah.com/lkn/
下载地址:linux内核技术手册英文电子版

container_of分析

内核源码中存在这么一个宏container_of
用于从一个结构体的成员指针获取结构体的指针。
如:

1
2
3
4
struct my{
	int a;
	int b;
};

在此如果知道成员b的指针可用container_of函数来获取包含b的my结构体的指针。
在此列中使用如以知b的指针pb:

1
2
struct my *getmy;
getmy = container_of(pb,struct my,b);

这样就获取到了my的指针。
这个宏的工作原理比较简单,下面简单介绍下其工作原理和实际代码。
[阅读全文] »

新书入账-LINUX内核技术手册

原书名: Linux Kernel in a Nutshell
很薄的一本书,主要讲述linux内核配置
因为我使用的是gentoo系统,必须手动配置内核。
而网上讲解内核配置的文章比较零散。
感觉买来需要时当手册用确实不错。
看到作者是gentoo系统开发者,稍微支持下拉。。
因为书薄的关系很短时间内能看完,也确实学到了内核配置方面以前不知道的技巧。

LINUX内核技术手册

LINUX内核技术手册


[阅读全文] »

Page 1 of 512345»