Unix

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

1973 年,在用 C 语言重写了 Unix 系统后,大量的 Unix 衍生版本开始出现,许多公司把 Unix 移植到新的机型上,开发者们都按照自己的方式不断增强系统的功能。 Unix 系统设计简洁并在发布时提供源代码,所以许多团体都对其进行了进一步的开发。加州大学伯克利分校便是其中影响最大的一个。 在 BSD 基础上,很多厂商也推出了自己的 Unix ,如 SunOS、HP-UX 等。1991 Linux 在 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)){
    ...
}

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

没有内存保护机制

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

扩展

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