第一章 Linux内核简介

1. Unix的历史

  • Unⅸ虽然已经使用了40年,但计算机科学家仍然认为它是现存操作系统中最强大和最优秀的系统。

  • Unix强大的根本原因:

    1. 简洁
    2. 在Unix中所有的东西都被当做文件对待
    3. Unix的内核和相关的系统工具软件是用C语言编写的——正是这个特点使得Unix在各种硬件体系架构面前都具备令人惊异的移植能力
    4. Unix的进程创建非常迅速,并且有一个非常独特的fork()系统调用
    5. Unix提供了一套非常简单但又很稳定的进程间通讯元语,使得Unix的程序把目标放在一次执行保质保量的完成一个任务上

2 追寻Linus足迹:Linux简介

  • Linux是类Unix系统,但它不是Unix

  • Linux是一个非商业化的产品,和该系统的大部分一样,Linux内核也是自由(公开)软件

3 操作系统和内核简介

处理器在任何指定时间点上的活动范围可以概括为下列三者之一:

  • 运行于内核空间,处于进程上下文,代表某个特定的进程执行。

  • 运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断。

  • 运行于用户空间,执行用户进程。

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

Linux内核和传统Unix系统之间存在一些差异:
1. Linux支持动态加载内核模块。
2. Linux支持对称多处理(SMP)机制
3. Linux内核可以抢占。
4. Linux内核并不区分线程和其他的一般进程
5. Linux提供具有设备类的面向对象的设备模型、热插播事件以及sysfs

5 Linux内核版本

Kernel版本命名规则:

6 Linux内核开发者社区

这个社区重要论坛是Linux kernel mailing list(lkml)

第二章 从内核出发

2.1 获取内核源码

2.1.1 使用Git

2.1.2 安装内核源代码

  • 如果压缩形式是bzip2,则运行:

$ tar xvjf linux-x.y.z.tar.bz2

  • 如果压缩形式是GNU的zip,则运行

$ tar xvzf linux-x.y.z.tar.gz

  • 解压后的源代码位于linux-x.y.z.目录下。

  • 何处安装源码:内核源码一般安装在/usr/src/linux目录下。

2.1.3 使用补丁

  • 要应用增量补丁,从你的内部源码树开始,只是运行:

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

  • 一般说来,一个给定版本的内核补丁总是打在前一个版本上

2.2 内核源码树

2.3 编译内核

2.3.1 配置内核

  • 可以配置的各种选项,以CONFIG_FEATURE形式表示,其前缀为CONFIG。

  • 这些配置项要么是二选一,要么是三选一。二选一就是yes或no。比如说CONFIG_PREEMPT就是二选一,表示内核抢占功能是否开启。三选一可以是yes、no或module。Module意味着该配置项被选定了,但编译的时候这部分功能的实现代码是以模块(一种可以动态安装的独立代码段)的形式生成。在三选一的情况下,显然yes选项表示把代码编译进主内核映像中,而不是作为一个模块。驱动程序一般都用三选一的配置项。

2.3.2 减少编译的垃圾信息

  • 我利用命令来对输出进行重定向

    make >../detritus

  • 一旦需要查看编译的输出信息,可以查看这个文件。不过,因为错误和警告都会在屏幕上显示,所以你需要看这个文件的可能性不大。事实上,我只不过敲入如下命令

    $ make > /dev/null

    这就把无用的输出信息重定向到永无返回值的黑洞/dev/null。

2.3.3 衍生多个编译作业

• 为了以多个作业编译内核,使用以下命令: $ make -jn • 这里,n是要衍生的作业数,在实际中,每个处理器上一般衍生一个或者两个作业。例如,在一个双处理器上,可以输入如下命令: $ make –j4

2.3.4 安装新内核

• 以root身份,只要运行: % make modules_install 就可以把所有已编译的模块安装到正确的主目录/lib下。

2.4 内核开发的特点

  • Linux内核编程与用户空间内应用程序开发的差异

    1.Linux内核编程时不能访问C库

    2.Linux内核编程时必须使用GNU C

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

    4.Linux内核编程时浮点数很难使用。

    5.内核只有一个很小的定长堆栈。

    6.由于内核支持异步中断、抢占式和SMP,因此必须时刻注意同步和并发。

    7.要考虑可移植性的重要性。

2.4.1 无libc库抑或无标准头文件

  • 在所有没有实现的函数中,最著名的就数printf()函数了。内核代码虽然无法调用printf(),但它可以调用printk()函数。

2.4.2 GUNC

  • 内核开发者使用的C语言涵盖了ISO C995标准和GNU C扩展特性。

    1. 内联(inline)函数
    2. 内联汇编
    3. 分支声明

2.4.3 没有内存保护机制

  • 如果一个用户程序试图进行一次非法的内存访问,内核会发现这个错误,发送 SIGSEGV,并结束整个进程。

  • 内核中发生的内存错误会导致oops,这是内核中出现的最常见的一类错误。

  • 内核中的内存都不分页。

2.4.4 不要轻易在内核中使用浮点数

  • 在执行浮点指令时到底会做些什么,因体系结构不同,内核的选择也不同,但是,内核通常捕获陷阱并做相应处理。

  • 和用户空间进程不同,内核并不能完美地支持浮点操作,因为它本身不能陷入。

2.4.5 容积小而固定的栈

  • 内核栈的准确大小随体系结构而变。在x86上,栈的大小在编译时配置,可以是4KB也可以是8KB。

  • 从历史上说,内核栈的大小是两页,这就意味着,32位机的内核栈是8KB,而64位机是16KB,这是固定不变的。

2.4.6 同步和并发

  • Linux是抢占多任务操作系统。内核的进程调度程序即兴对进程进行调度和重新调度。内核必须对这些任务同步。

  • Linux内核支持多处理器系统。

  • 中断是异步到来的,完全不顾及当前正在执行的代码。

  • Linux内核可以抢占。

2.4.7 可移植性的重要性

  • Linux是一个可移植的操作系统,

  • 必须把体系结构相关的代码从内核代码树的特定目录中适当地分离出来。

《Linux内核设计与实现》 第三周 读书笔记的更多相关文章

  1. LINUX内核设计与实现第三周读书笔记

    LINUX内核设计与实现第三周读书笔记 第一章 LINUX内核简介 1.1 Unix的历史 1969年的夏天,贝尔实验室的程序员们在一台PDR-7型机上实现了Unix这个全新的操作系统. 1973年, ...

  2. Linux内核设计与实现第十周读书笔记

    第十七章 设备与模块 关于设备驱动与设备管理,我们讨论四种内核成分. 设备类型 模块 内核对象 sysfs 17.1设备类型 在Linux以及所有Unix系统中,设备被分为以下三种类型: 块设备,块设 ...

  3. Linux内核设计与实现第八周读书笔记

    第四章 进程调度 进程在操作系统看来是程序的运行态表现形式. 4.1多任务 多任务操作系统就是能同时并发地交互执行多个进程的操作系统. 多任务操作系统会使多个进程处于堵塞或者睡眠状态.这些任务尽管位于 ...

  4. Linux内核设计与实现第六周读书笔记

    第三章 进程管理 3.1 进程 进程是处于执行期的代码.通常进程还要包含其他资源,像打开的文件.挂起的信号.内核的内部数据.处理器状态.一个或多个具有内存映射的内存地址空间及一个或多个执行线程,当然还 ...

  5. Linux内核设计与实现第五周读书笔记

    第十八章 调试 18.1准备开始 需要的只是: 一个确定的bug.大部分bug通常都不是行为可靠而且定义明确的. 一个藏匿bug的内核版本. 相关的内核代码的知识和运气. 18.2内核中的bug 内核 ...

  6. linux内核设计与实现第七周读书笔记

    第七章 链接 链接(linking)是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或被拷贝)到存储并执行.链接可以执行于编译时(compile time),也就是在源代 ...

  7. 《Linux内核设计与实现》Chapter 3 读书笔记

    <Linux内核设计与实现>Chapter 3 读书笔记 进程管理是所有操作系统的心脏所在. 一.进程 1.进程就是处于执行期的程序以及它所包含的资源的总称. 2.线程是在进程中活动的对象 ...

  8. 《Linux内核设计与实现》第四周读书笔记——第五章

    <Linux内核设计与实现>第四周读书笔记--第五章 20135301张忻 估算学习时间:共1.5小时 读书:1.0 代码:0 作业:0 博客:0.5 实际学习时间:共2.0小时 读书:1 ...

  9. 《Linux内核设计与实现》Chapter 1 读书笔记

    <Linux内核设计与实现>Chapter 1 读书笔记 一.Unix的特点 Unix从Multics中产生,是一个强大.健壮和稳定的操作系统. 特点 1.很简洁 2.在Unix系统中,所 ...

  10. 《Linux内核设计与实现》Chapter 2 读书笔记

    <Linux内核设计与实现>Chapter 2 读书笔记 一.获取内核源码 1.使用Git 我们曾经在以前的学习中使用过Git方法 $ git clone git://git.kernel ...

随机推荐

  1. 团队作业——Alpha冲刺 11/12

    团队作业--Alpha冲刺 冲刺任务安排 杨光海天 今日任务:预览界面布局实现,并留下交互接口 明日任务:预览界面中自定义保存的实现 郭剑南 今日任务:尝试解决Python编写程序无法在Android ...

  2. spark任务调度和资源分配

    Spark调度模式 FIFO和FAIR     Spark中的调度模式主要有两种:FIFO和FAIR.    默认情况下Spark的调度模式是FIFO(先进先出),谁先提交谁先执行,后面的任务需要等待 ...

  3. [工具]iperf测试带宽

    之前被要求测试网卡带宽能力,发现了iperf这个工具,记录下来防止遗忘. iperf是个开源跨平台测试带宽工具,windows.linux.macOS--都支持,安装也挺方便. 1.安装 地址:htt ...

  4. Redis系列五:redis键管理和redis数据库管理

    一.redis键管理 1 键重命名 rename oldKey newkey //格式rename oldKey newKey //若oldKey之前存在则被覆盖set name james :set ...

  5. 1207. [HNOI2004]打鼹鼠【线性DP】

    Description 鼹鼠是一种很喜欢挖洞的动物,但每过一定的时间,它还是喜欢把头探出到地面上来透透气的.根据这个特点阿Q编写了一个打鼹鼠的游戏:在一个n*n的网格中,在某些时刻鼹鼠会在某一个网格探 ...

  6. 《阿里巴巴 Java 开发手册》划重点!

    [强制]小数类型为 decimal,禁止使用 float 和 double. 说明:float 和 double 在存储的时候,存在精度损失的问题,很可能在值的比较时,得到不 正确的结果.如果存储的数 ...

  7. 2.3.3 Button(按钮)与ImageButton(图像按钮)

    本节引言: 今天给大家介绍的Android基本控件中的两个按钮控件, Button普通按钮 ImageButton图像按钮: 其实ImageButton和Button的用法基本类似,至于与图片相关的则 ...

  8. docker swarm英文文档学习-6-添加节点到集群

    Join nodes to a swarm添加节点到集群 当你第一次创建集群时,你将单个Docker引擎置于集群模式中.为了充分利用群体模式,可以在集群中添加节点: 添加工作节点可以增加容量.当你将服 ...

  9. CentOS7下账号与用户

    /etc/passwd用户记录文件,文件记录着ID和账号与一般身份用户的对应关系 用户至少会有2个ID,用户ID(UserID简UID)和用户组ID(GroupID简GID). /etc/group用 ...

  10. jsp二(指令)

    一.jsp动作标签: 1)<jsp:forward> 请求转发 相当于之前的request.getRequestDispatcher(..).forward(..); <!--jsp ...