这里解释两点
1 记得前面我的每个段地址描述结构都占8个字节,所以地址一定按8的整数倍对其,这里我们的页面大小人为的划分为4k,即按4k对其,所以我们的目录项和页表同样可以拿出低12位用作他用。至于怎样实现,那是硬件上的问题。
2 为什么采用多级分页机制,而不简单直接的使用页表和页内偏移地址来进行分页,目的是在于节省内存,至于是怎么节省的,我当初上操作系统课程始终不明白,现在搞明白了。因为操作系统在创建进程时会为进程分配一个进程控制块,里面其中有一部分就是对虚存管理的页面数据结构,如果不采用多级分页机制的话,那么每个进程关页面表就占 个字节,即1M,即是进程用不着那么页表项(因为32位地址默认个用户的虚存空间是4G,但一个进程很难想象会用完这4G),但还是会占内存,但是采用多级分页的话,那么不需要的页表项就不进行分配,从而也就节省了内存,但是相反一个进程真的用完了4G的虚存,那么他需要的目录项和页表项占的内存就多了目录项这一部分了。
1.4linux内核源代码中C语言代码
Linux内核的主体是由GNU的C语言编写,CNU为此提供了编译器gcc,而gcc从C 语言中吸收了inline和const,其实GNU的C和C 是合为一体的,gcc既是C的编译器也是C 的编译器,所以linux中很多C语言代码自然就有C 风格在里面,所以需要一点C 基础。但这不是问题关键,关键在学习linux中C语言设计思想。
1常见的宏定义对简单函数的实现
#define DUMP_WRITE(addr,nr) \ do{ memcpy(bufp,addr,nr);bufp =nr} while(0)
2使用结构体封装多个队列
3使用宏定义与函数实现简单初始化
1.5linux内核源代码中的汇编语言代码
汇编语言有两套格式,在dos/windows领域中采用的汇编语言都是由intel定义的指令格式,也就是我们教材里面的汇编语言格式。另外一种就是UNIX领域使用的AT&T定义的格式,所以在linux内核中所使用的汇编格式是AT&T。尽管两种汇编语言指令不一样,但是指令的风格很类似,所以提供了一种互相学习的条件。而且AT&T汇编同样适用于gcc编译器,所以在c语言中可以嵌入式汇编语句,所以看懂linux内核代码,需要AT&T汇编基础以及嵌入式汇编基础。这里不详细介绍,后面在进程切换一节中借助一段内核中用来实现内存空间切换的汇编代码来介绍一下嵌入式AT&T汇编。
详细参见:需要相关资料的可以后台私信,资料,可MF领取 欢迎