Linux 内核概述 - Linux Kernel

时间:2021-07-19 16:34:21

Linux 内核学习笔记整理。

Unix

unix 已有40历史,但计算机科学家仍认为其是现存操作系统中最大和最优秀的系统,它已成为一种传奇的存在,历经时间的考验却依然声名不坠。

1973 年,在用 C 语言重写了 Unix 系统后,大量的Unix衍生版本开始出现,许多公司把 unix 移植到新的机型上,开发者们都按照自己的方式不断增强系统的功能。Unix 系统设计简洁并在发布时提供源代码,所以许多团体都对其进行了进一步的开发。加州大学伯克利分校便是其中影响最大的一个。在BSD基础上,很多厂商也推出了自己的unix ,如 SunOS、HP-UX 等。1991 年,linus 在Internet 上发布了它的 Unix 。从此 linux 便起航了,Linux很快吸引了众多开发者、黑客对其代码进行修改和完善,由于其开源性,Linux 迅速成为多人合作的开源项目。

操作系统与内核

操作系统包括内核、设备驱动程序、启动引导程序、命令行shell、基本系统工具等部分。内核是操作系统的真正核心,负责硬件设备管理、分配系统资源等任务。内核一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限,这种系统态和被保护起来的空间统称为内核空间。应用程序在用户空间只能看到允许它们访问的部分系统资源、只能使用某些特定的系统功能,无法直接访问硬件、也不能访问内核划给别人的内存范围,还有一些其他的限制。应用程序通过 系统调用 与内核通信,让内核代其完成不同的任务。

内核还负责管理系统的硬件设备。当硬件设备想要和系统通信的时候,它会发出一个异步的中断信号以打断处理器执行,继而打断内核执行。中断通常对应着一个中断号,内核通过中断号查找相应的中断服务程序,并调用这个程序响应和处理中断。中断服务程序在一个与所有进程都无关的、专门处理中断的上下文中运行,以保证中断服务程序能在第一时间响应和处理中断请求并快速退出。

单内核与微内核

操作系统的内核可分为两大阵营:单内核和微内核。单内核就是把它从整体上作为一个大的过程来实现,同时也运行在一个单独的地址空间上,其特点是高性能。微内核并不作为一个单独的大过程来实现,其根据功能不同划分成多个独立的过程,其特点是各过程独立运行,避免了一个模块出现问题后祸及另一个。其相比单内核设计多了模块间的通信机制等环节,而单内核却没有这些消息传递的开销。所以,大部分基于微内核的系统都让大部分或全部功能过程全部运行在内核,如此便可以直接调用函数,消除频繁的上下文切换。windowNT、Mach就是微内核的典型实例。Linux 是单内核,但是其汲取了微内核的精华部分。Linux是模块化的、多线程的以及内核本身可调度的操作系统。

内核版本号

主版本号.副版本号.修订版本号

副版本号反映了该内核是一个稳定版本还是一个处于开发中的版本:如果该数字是偶数,那么此版本就是稳定版;如果是奇数,那么他就是开发版。

获取源码

官网地址:www.kernel.org

仓库地址:git.kernel.org

编译内核

由于从未配置过内核,所以使用缺省配置编译内核,据说这个默认配置是 Linus 本人的配置。

$make defconfig 

如果要减少编译过程中的输出信息,可以使用下列命令

$make > .. /detritus

如此一来,如果你要查看编译信息,可查看该文件。当然你也可以直接 $make > /dev/null 把无用信息重定向。

安装内核

% make modules_install

上面命令可以把所有已编译的模块安装到正确的主目录。编译时会在内核代码根目录生成一个 system.map 文件,这是一个符号对照表。

内核开发

内核开发对性能的要求非常高。内核开发不能访问 C 库,也不能访问标准的 C 头文件。内核开发必须使用 GNU C,对内核来说完整的 C 库(甚至是一个子集)太大且太低效了。但大部分常用的 C 库函数在内核中都已经得到了实现。Linux 的内核混合使用了 C 语言和汇编语言,在靠近底层或对执行时间要求严格的地方,一般使用的都是汇编语言。GCC 支持使用 asm() 指令在 C 中嵌入汇报代码。

条件分支优化

对于条件选择语句,在经常条件经常出现或极少出现的时候,编译前可根据分支声明语句对条件分支进行优化。示例:

/* 把一个条件标记成极少发生的分支。 */
if (unlikely(err)){
    ...
}

这里一定要确保是否当前条件在绝大多数都会成立,如果你判断正确,那么程序性能将得到答复提升,否则,反而会降低性能。

没有内存保护机制

如果用户程序试图进行一次非法的内存访问,内核会发现这个错误,并结束这个进程。然而如果内核自己非法访问了内存,那后果就很难控制了,因为没有其他的任何东西可以对内核进行监控。还有一点,内核中的内存都不分页。

扩展

内核拥有整个系统的最高权限,关于内核开发的特别注意事项还有很多,可以到更专业一点的文章中了解。