linux2.6 内存管理?如何查看linux内核源代码
一、linux内核源码目录在哪linux内核源码
如何查看linux内核源代码?
一般在Linux系统中的/usr/src/linux*.*.*(*.*.*代表的是内核版本,如2.4.23)目录下就是内核源代码(如果没有类似目录,是因为还没安装内核代码)。另外还可从互连网上免费**。注意,不要总到去**,好使用它的镜像站点**。请在里找一个合适的**点,再到pub/linux/kernel/v2.6/目录下去**2.4.23内核。
代码目录结构
在阅读源码之前,还应知道Linux内核源码的整体分布情况。现代的*作系统一般由进程管理、内存管理、文件系统、驱动程序和网络等组成。Linux内核源码的各个目录大致与此相对应,其组成如下(假设相对于Linux-2.4.23目录):
1.arch目录包括了所有和体系结构相关的核心代码。它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是IntelCPU及与之相兼容体系结构的子目录。PC机一般都基于此目录。
2.include目录包括编译核心所需要的大部分头文件,例如与平台无关的头文件在include/linux子目录下。
3.init目录包含核心的初始化代码(不是系统的引导代码),有main.c和Version.c两个文件。这是研究核心如何工作的好起点。
4.mm目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于arch/*/mm目录下。
5.drivers目录中是系统中所有的设备驱动程序。它又进一步划分成几类设备驱动,每一种有对应的子目录,如声卡的驱动对应于drivers/sound。
6.ipc目录包含了核心进程间的通信代码。
7.modules目录存放了已建好的、可动态加载的模块。
8.fs目录存放Linux支持的文件系统代码。不同的文件系统有不同的子目录对应,如ext3文件系统对应的就是ext3子目录。
Kernel内核管理的核心代码放在这里。同时与处理器结构相关代码都放在arch/*/kernel目录下。
9目录里是核心的网络部分代码,其每个子目录对应于网络的一个方面。
10.lib目录包含了核心的库代码,不过与处理器结构相关的库代码被放在arch/*/lib/目录下。
11.scripts目录包含用于配置核心的脚本文件。
12.documentation目录下是一些文档,是对每个目录作用的具体说明。
一般在每个目录下都有一个.depend文件和一个Makefile文件。这两个文件都是编译时使用的辅助文件。仔细阅读这两个文件对弄清各个文件之间的联系和依托关系很有帮助。另外有的目录下还有Readme文件,它是对该目录下文件的一些说明,同样有利于对内核源码的理解。
在阅读方法或顺序上,有纵向与横向之分。所谓纵向就是顺着程序的执行顺序逐步进行;所谓横向,就是按模块进行。它们经常结合在一起进行。对于Linux启动的代码可顺着Linux的启动顺序一步步来阅读;对于像内存管理部分,可以单独拿出来进行阅读分析。实际上这是一个反复的过程,不可能读一遍就理解。
二、Linux性能度量标准
1) CPU使用率:每个处理器的整体使用率。如果在一段持续时间内CPU的使用率超过80%,则处理器可能有瓶颈。
2)用户进程消耗CPU的时间:CPU花费在用户进程的百分比,包括nice time。较高值的user time通常是有利的,因为系统在执行实际的工作。
3)内核*作消耗CPU的时间:CPU花费在内核*作的百分比,包括IRQ和softirq时间。较高和持续的system time值指出在网络和驱动程序堆栈中的瓶颈。一个系统通常应保持花在内核*作上的时间尽可能的少。
4)等待: CPU花费在等待(由于一个I/O*作发生等待)上的时间总量,像是阻塞值。一个系统不应该花费太多时间等待(因为I/O*作)否则应该检查各自的I/O子系统性能。
5) CPU空闲时间:系统空闲等待任务的CPU百分比。
6) Nice消耗CPU时间:CPU花费在re-nicing进程(更改进程的执行顺序和优先级)上的时间百分比。
7)平均负载:load average不是一个百分比,而是以下总和的滚动平均值:
•队列中等待处理的进程数。
•等待不可中断任务被完成的进程数。
也就是说,TASK_RUNNING和TASK_UNINTERRUPTIBLE进程数的总和的平均值。如果进程请求CPU时间而被阻塞,load average会增加。另一方面,如果每个进程得到直接访问CPU的时间,它们没有在CPU周期丢失,则负载将减小。
8)可运行的进程:已经准备好执行的进程数。在一段持续的时间内,这个值不应该超过物理处理器数量的10倍。否则处理器可能是瓶颈。
9)阻塞的进程:不被执行的进程数,因为要等待I/O*作结束。阻塞的进程数能反映出是否有I/O瓶颈。
10)上下文切换:在系统上发生线程之间切换的数量。大量上下文切换如果与大量中断相关,则可能是驱动程序或应用程序出现问题。上下文切换通常是不利的,因为每一次上下文切换都会导致CPU缓存被刷新,但是有些上下文切换是必要的。
11)中断:中断包含硬中断与软中断。硬中断对系统性能有更加不利的影响。较高的中断值表明可能有软件瓶颈,可能是在内核中,也可能是一个驱动程序出现瓶颈。记住,中断还包括CPU时钟引起的中断。
1)空闲内存:对比大多数其他*作系统,在Linux中不应该只关注空闲(free)内存的值。 Linux内核分配大部分未使用的内存作为文件系统缓存,所以从已使用的(used)内存中减去缓冲(buffer)和缓存(cache)的内存数量,来确定(有效的)空闲(free)内存。
2)使用的swap:已使用的swap空间的数量。swap空间的使用只能告诉你Linux管理内存真的有效。Swap In/Out是一个识别内存瓶颈的可靠手段。在一段持续的时间内每秒200到300以上的分页值,表明可能有内存瓶颈。
3)缓冲与缓存:缓冲被分配作为文件系统和块设备缓存。
4) SIab:内核使用的内存数。注意内核的分页不能移出到磁盘。
5)活跃与非活跃内存:关于活跃使用的系统内存信息。非活跃内存可能是kswapd守护进程swap out到磁盘的候选者。
1) I/O等待:CPU等待一个I/O*作的发生所花费时间。较高和持续的值很多时候可能表明存在一个I/O瓶颈。
2)平均队列长度:未完成的I/O请求数量。一般情况下,一个磁盘有2到3个队列是佳的,较高的值可能表明有一个磁盘I/O瓶颈。
3)平均等待时间:服务一个I/O请求所测量的平均时间,以毫秒为单位。等待时间是由实际的I/O*作和它在I/O队列中等待的时间组成的。
4)每秒传输:每秒钟多少个I/O*作被执行(读和写)。该指标要结合每秒kB值,以帮助确定系统的平均传输大小。平均传输大小一般应该与你的磁盘子系统使用的条带大小相匹配。
5)每秒读取/写入块的数量:每秒读和写的块数,在2.6内核中块为1024B。早期的内核可能会报告不同的块大小,从512B到4KB。
6)每秒读取/写入的字节:从块设备读取和写入(读和写到块设备)的字节数,表示从块设备(到块设备)传输的实际数据量。
1)接收和发送的数据包:网络接口接收和发送数据包的数量。
2)接收和发送的字节:网络接口接收和发送的字节数。
3)每秒钟的冲突数量。
三、如何查看linux内核源代码
一般在Linux系统中的/usr/src/linux*.*.*(*.*.*代表的是内核版本,如2.4.23)目录下就是内核源代码(如果没有类似目录,是因为还没安装内核代码)。另外还可从互连网上免费**。注意,不要总到去**,好使用它的镜像站点**。请在mirrors/里找一个合适的**点,再到pub/linux/kernel/v2.6/目录下去**2.4.23内核。
代码目录结构
在阅读源码之前,还应知道Linux内核源码的整体分布情况。现代的*作系统一般由进程管理、内存管理、文件系统、驱动程序和网络等组成。Linux内核源码的各个目录大致与此相对应,其组成如下(假设相对于Linux-2.4.23目录):
1.arch目录包括了所有和体系结构相关的核心代码。它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是IntelCPU及与之相兼容体系结构的子目录。PC机一般都基于此目录。
2.include目录包括编译核心所需要的大部分头文件,例如与平台无关的头文件在include/linux子目录下。
3.init目录包含核心的初始化代码(不是系统的引导代码),有main.c和Version.c两个文件。这是研究核心如何工作的好起点。
4.mm目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于arch/*/mm目录下。
5.drivers目录中是系统中所有的设备驱动程序。它又进一步划分成几类设备驱动,每一种有对应的子目录,如声卡的驱动对应于drivers/sound。
6.ipc目录包含了核心进程间的通信代码。
7.modules目录存放了已建好的、可动态加载的模块。
8.fs目录存放Linux支持的文件系统代码。不同的文件系统有不同的子目录对应,如ext3文件系统对应的就是ext3子目录。
Kernel内核管理的核心代码放在这里。同时与处理器结构相关代码都放在arch/*/kernel目录下。
9目录里是核心的网络部分代码,其每个子目录对应于网络的一个方面。
10.lib目录包含了核心的库代码,不过与处理器结构相关的库代码被放在arch/*/lib/目录下。
11.scripts目录包含用于配置核心的脚本文件。
12.documentation目录下是一些文档,是对每个目录作用的具体说明。
一般在每个目录下都有一个.depend文件和一个Makefile文件。这两个文件都是编译时使用的辅助文件。仔细阅读这两个文件对弄清各个文件之间的联系和依托关系很有帮助。另外有的目录下还有Readme文件,它是对该目录下文件的一些说明,同样有利于对内核源码的理解。
在阅读方法或顺序上,有纵向与横向之分。所谓纵向就是顺着程序的执行顺序逐步进行;所谓横向,就是按模块进行。它们经常结合在一起进行。对于Linux启动的代码可顺着Linux的启动顺序一步步来阅读;对于像内存管理部分,可以单独拿出来进行阅读分析。实际上这是一个反复的过程,不可能读一遍就理解。