《深入理解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内核技术手册英文电子版

新书入账-深入linux内核架构

购书癖 又犯了。

去新华书店逛的时候看到全场打折,就忍不住。

《深入linux内核架构》在国内刚刚出版。

原书名: Professional Linux Kernel Architecture
也算是一个经典书籍。

英文版几次升级主要是跟随内核的修改。

第一版写的是2.6.0版内核,之后升级到2.6.18,现在又更新到2.6.24。

2.6.24版发布于2008年1月份,中文版翻译的是最新的2.6.24(英语水平不行不能流畅看英文版,惭愧)。

深入Linux内核架构

深入Linux内核架构

[阅读全文] »

LDD读书笔记第十一章-内核的数据类型

Linux数据类型

Linux内核C语言数据类型大小
  Arch     char     short     int     long     ptr     long-long     u8     u16    u32    u64 
i386 1 2 4 4 4 8 1 2 4 8
alpha 1 2 4 8 8 8 1 2 4 8
armv41 1 2 4 4 4 8 1 2 4 8
ia64 1 2 4 8 8 8 1 2 4 8
m86k 1 2 4 4 4 8 1 2 4 8
mips 1 2 4 4 4 8 1 2 4 8
ppc 1 2 4 4 4 8 1 2 4 8
sparc 1 2 4 4 4 8 1 2 4 8
sparc64 1 2 4 4 4 8 1 2 4 8
x86_64 1 2 4 8 8 8 1 2 4 8

需要注意的是sparc64架构运行的是32位用户空间。但是在内核空间是64位的。
在当前的所有平台上指针和long型的大小总相同
u8等固定大小的值有其有符号版本以s代替u如:s8
如果需要在用户空间使用固定大小的话使用双下划线版本如__u8
固定大小的类型是linux特有的 如果考虑向其他unix变种移植应使用C99标准类型变量如:uint8_t
[阅读全文] »

LDD读书笔记第八章-分配内存

kmalloc函数的内幕

kmalloc函数在没有阻塞的情况下运行速度很快。
并且不会对申请到的内存区域清空,所以在使用时必须清空。
函数原型

1
2
3
#include <linux /slab.h>
void *kmalloc(size_t size, int flags);
</linux>

第一个参数size 表明要申请的内存区域大小。
flags是分配标志,能以多种方法控制kmalloc的行为。

flags参数

带”__“的标志可与不带的版本一起“或”来使用。
[阅读全文] »

Page 1 of 212»