第 1 章 Linux 内核简介
linux是类unix系统,因此书籍一开头说明了unix的开发历程。unix强大的根本原因在于:
- unix很简洁,有明确设计目的,系统调用精简
- 所有东西都被当作文件对待
- unix内核和相关系统工具是c语言编写,具有良好的移植能力
- unix进程创建速度快,并且有fork系统调用
- unix有简单且稳定的进程间通信原语
至今,unix已经是一个支持抢占式多任务、多线程、虚拟内存、换页、动态链接和TCP/IP网络的现代化操作系统。
Linus Torvalds苦于不能随心所欲使用unix系统。借用unix的设计理念开发了自己的操作系统linux,使用了GPL证书作为限制条款,收到了众多用户的喜爱,不断的修改和完善至今。
操作系统的定义
指的在整个系统中负责最基础的功能和系统管理的那部分。包括内核、设备驱动程序、启动引导程序、shell或者其他种类的用户界面、基本的文件管理工具和系统工具。
操作系统的核心是内核。包括管理硬件设备、分配系统资源等。通常内核由
- 负责响应中断的中断服务程序
- 负责管理多个进程的调度程序
- 负责管理进程地址空间的内存管理程序
- 网络、进程间通信等系统服务
组成。内核独立于普通应用程序,系统态(内和态)。应用程序在用户空间执行,不直接访问硬件,用户态。
应用程序通过系统调用与内核通信。
应用程序执行系统调用:内核运行在进程上下文中。
中断—》 中断号—》中断服务程序(中断上下文,与所有进程无关,保证中断及时响应)
处理器一定处于下列三者之一:
- 运行于用户空间,执行用户进程
- 运行于内核空间,处于进程上下文,代表某个特定的进程执行
- 运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定中断。
即使处理器空闲,内核就运行空进程,处于进程上下文,但运行于内核空间。
linux内核与unix内核的比较
unix内核都是一个不可分割的静态可执行库。运行在单独的地址空间。需要硬件系统提供页机制(MMU)以管理内存。
单内核与微内核设计比较
单内核:把内核从整体上作为一个单独的大过程来实现,运行在单独的地址空间。因此通常以静态二进制文件的形式存在于磁盘中。所有内核服务都在这样一个大的地址空间中运行。内核之间的通信很简单,处于同一地址空间,直接调用函数就行。(大多数unix系统)
微内核:被划分成多个独立过程,每个过程叫做一个服务器。所有服务器保持独立并运行在各自的地址空间上。因此不能直接调用函数,而需要通过消息传递来通信。进程间通信(IPC)机制互通消息,互换服务。避免一个的失效影响另一个。模块化允许服务器换入换出。
微内核缺点:
IPC机制开销多于直接调用函数,涉及内核空间与用户空间的上下文切换,因此消息传递需要一定的周期。(因此大部分都将系统服务位于内核,消除频繁的上下文切换)
linux是一个单内核。也就是说linux内核运行在单独的内核地址空间。不过linux也吸取了微内核的精华:模块化设计、抢占式内核、支持内核线程以及动态装载内核模块的能力了。
区别:
- linux支持动态加载内核模块
- linux支持对称多处理(SMP)机制
- linux内核可以抢占(preemptive)
- linux不区分线程和一般的进程
- linux提供面向对象的设备模型、热拔插事件
第 2 章 从内核出发
这一章主要介绍了内核源码获取、编译、以及配置安装的过程。内核开发需要注意的几点是:
- 无libc库或者标准头文件
- GNU C
- 没有内存保护机制(重要)
- 不要轻易使用浮点数
- 容积小而固定大小的栈(4kb/8kb)
- 同步和并发(包括抢占式、多处理器、中断是异步的)
- 可移植性(字节序、64位对齐、页面长度等)