《Linux内核设计与实现》第一、二章学习笔记

第一章 Linux内核简介

1. Unix内核特点

  • 简洁:仅提供系统调用并有一个非常明确的设计目的。
  • 抽象:Unix中绝大部分东西都被当做文件,这种抽象使对数据和对设备的操作是通过一套相同的系统调用接口来进行的(open()、read()、write()、lseek()、close())。
  • 可移植:使用C语言编写,使其在各种硬件体系架构面前都具备令人惊异的移植能力。
  • 进程创建迅速:有独特的fork()系统调用,一次执行保质保量地完成一个任务。简单的进程间通信元语把单一目的的程序方便地组合在一起,这种策略和机制分离的理念确保了Unix系统具备清晰的层次化结构。
  • Unix已经发展成一个支持抢占式多任务、多线程、虚拟内存、换页、动态链接和TCP/IP网络的现代化操作系统。

2. Linux内核简介

  • Linux是基于Unix的类Unix系统,设计思想相似,比如它也实现了Unix的API。但是Linux没有直接使用Unix的源代码,但它没有抛弃Unix的设计目标并且保证了应用程序编程接口的一致。
  • Linux内核是自由公开软件。
  • Linux系统的基础是内核、C库、工具集和系统的基本工具。

3. 操作系统和内核简介

  • 操作系统是整个系统中负责完成最基本功能和系统管理的部分。包括内核、设备驱动程序、启动引导程序、命令行Shell或者其他种类的用户界面、基本的文件管理工具和系统工具。
  • 内核是操作系统的核心。通常一个内核由负责响应中断的中断服务程序、负责管理多个进程从而分享处理器时间的调度程序、负责管理进程地址空间的内存管理程序和网络、进程之间通信等系统服务程序共同组成。
  • 系统态:拥有受保护的内存空间和访问硬件设备的所有权限。(内核空间即这种系统态和被保护起来的内存空间)
  • 用户态:执行普通用户程序时,系统以用户态进入用户空间执行。(应用程序在用户空间执行,只能看到允许它们使用的部分系统资源,并只使用某些特定的系统功能,不能直接访问系统硬件,也不能访问其他的内核划给别人的内存范围)
  • 系统中运行的应用程序通过系统调用来与内核通信。(应用程序通过系统调用界面陷入内核,是应用程序完成工作的基本行为方式)
  • 中断机制:一个异步的中断信号打断处理器的执行,继而打断内核的执行。中断通常对应一个中断号,内核通过中断号查找相应的中断服务程序,并调用这个程序响应和处理中断。
  • 每个处理器在任何指定时间点上的活动必然是以下三者之一:
    • 运行于用户空间,执行用户进程
    • 运行于内核空间,处于进程上下文,代表某个特定的进程执行
    • 运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断

4. Linux内核和传统Unix内核的比较

操作系统分为单内核、微内核和外内核(主要用于科研系统)。Linux是一个单内核,即内核运行在单独的内核地址空间上。而且Linux吸取了微内核的精华——模块化设计、抢占式内核、支持内核线程以及动态装载内核模块的能力,避免了微内核设计上的性能损失的缺陷。

至今Linux是模块化的、多线程的以及内核本身可调度的操作系统。

Linux内核和传统Unix内核的差异:

  • Linux支持动态加载内核模块
  • Linux支持对称多处理(SMP)
  • Linux内核可以抢占,允许内核运行的任务有优先执行的能力
  • Linux不区分线程和进程
  • Linux提供具有设备类的面向对象的设备模型、热插拔事件,以及用户空间的设备文件系统

5. Linux内核版本

Linux内核有两种:稳定的(具有工业级的强度,可以广泛应用和部署)、处于开发中的。

Linux命名机制(可用于区分稳定的和处于开发中的内核):

如果版本号是偶数,则内核是稳定版;如果是奇数,内核就是开发版。

第二章 从内核出发

1. 获取内核源码

  • 使用Git

    git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
    git pull # 更新分支到Linux的最新分支
    
  • 安装内核源代码(如果使用git获取就不需要下载压缩文件。)

    tar xvjf linux-x.y.z.tar.bz2
    或者
    tar xvzf linux-x.y.z.tar.gz
    

注意:内核源代码一般安装在/usr/src/linux目录下,即使在安装新内核时,/usr/src/linux目录应当保证原封不动。

  • 使用补丁

    patch -p1 < ../patch-x.y.z
    

2. 内核源码树

3. 编译内核

3.1 配置内核

配置项的二选一和三选一:

二选一:yes 或者 no

三选一:yes 或者 no 或者 module(module意味着该配置被选定了,以模块生成。驱动程序一般都用三选一的配置项)

字符页面的命令行工具:
make config

图形界面工具:
make menuconfig

基于默认配置为体系结构创建一个配置:
make defconfig 

验证和更新配置:
make oldconfig

3.2 编译内核

编译内核:
make

重定向到该文件中:
make > .. /detritus

把无用的输出信息重定向到永无返回值的黑洞中:
make > /dev/null

3.3 安装新内核

将所有已编译的模块安装到正确的主目录/lib/modules下
make modules_install

4. 内核开发的特点

  • 内核开发时既不能访问C库也不能访问标准的C头文件 (解决方法:include/linux文件夹中包含了所需的内核头文件。)
  • 内核编程时必须使用GNU C

    • 内联函数: 函数会在所调用的位置上展开。 定义时,需要使用static作为关键字,用inline限定它。 内联函数必须在使用之前就定义好,一般在头文件中定义。 内核中优先使用内联函数而不是宏。

    • 内联汇编: 通常使用asm()指令嵌入汇编代码,用volatile表示不优化

    • 分支声明: unlikely(x) - x很少出现,绝少发生,通常为假 likely(y) - y经常出现,通常为真

  • 内核编程时缺乏像用户空间那样的内存保护机制

  • 内核编程时难以执行浮点运算
  • 内核给每个进程只有一个很小的定长堆栈
  • 由于内核支持异步中断、抢占和SMP(对称多处理系统),必须时刻注意同步和并发。(常用的解决竞争的方法:自旋锁和信号量)。
  • 要考虑可移植性的重要性(诸如保持字节序,64位对其,不假定字长和页面长度等。)

总结

教材一二章的内容基本上是讲关于Linux内核的发展、特点等小知识点,为今后的进一步学习夯实了基础。

posted on 2016-03-13 22:34  20135228  阅读(238)  评论(1编辑  收藏  举报

导航