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

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

一、获取内核源码

1.使用Git

我们曾经在以前的学习中使用过Git方法

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git  更新分支到Linux的最新分支
$ git pull 

可以获取并随时保持与内核官方的代码树一致

2.安装内核源代码

压缩形式为bzip2
$ tar xvjf linux-x.y.z.tar.bz2 

压缩形式为zip 
$ tar xvzf linux-x.y.z.tar.gz

如果使用git获取和管理内核源代码,就不需要下载压缩文件,运行git clone命令,git就会下载解压最新的源代码。

内核源代码一般安装在/usr/src/linux目录下,不要将其用于开发。不要以root身份对内核进行修改。

使用补丁

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

二、内核源码树

三、编译内核

目的:把自己需要的特定功能和驱动程序编译进内核。

1.配置内核

①可以配置的各种变量都以CONFIG_前缀表示。
  • 二选一

    • yes
    • no
  • 三选一
    • yes
    • no
    • module
    • module指该配置项被选定了,但实现代码以模块的形式生成

      配置选项也可以是字符串或整数

②配置工具

  $ make config 最简单的一种字符界面下的命令行工具;
    $ make menuconfig 基于ncurse库的图形界面工具;
    $ make gconfig 基于gtk+的图形工具;
    $ make defconfig 基于默认的配置为个人体系结构创建一个配置;
    $ make oldconfig 验证和更新配置;

如果内核已经启用了CONFIG_IKCONFIG_PROC选项(把完整的压缩过的内核配置文件存放在/proc/config.gz下),可以从/proc下复制配置文件,并用它编译一个新内核。

    $ zcat /proc/config.gz > .config
    $ make oldconfig
  内核配置好了,就可以编译它啦
    $ make 

2.减少编译的垃圾信息

  • 如果想少看垃圾信息,却又不错过错误报告和警告信息,对输出重定向
    $ make > ../detritus
  • 把无用的输出信息重定向到永无返回值的黑洞/dev/null中
    $ make > /dev/null

3.衍生多个编译作业

  • 以多个作业编译内核
    $ make -jn (n:要衍生出的作业数)
  • 16核处理器
    $ make -j32 > /dev/null

4.安装新内核

  以root身份运行

  • $ make modules_install

  所有已编译的模块都会安装到lib/modules下

四、内核开发的特点

1.内核编程时不能访问C库和标准C头文件


  • 基本头文件位于内核源代码顶级目录下的include/linux文件夹中
  • 体系结构相关头文件:内核源代码树的arch/<architecture>/include/asm目录下

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

  • 内联函数:函数会在所调用的位置上展开,用static作关键字,用inline限定它。

    • 优点:消除函数调用和返回的开销
    • 缺点:代码会变长,占用更多的内存空间或指令缓存。
  • 内联汇编:通常使用asm()指令嵌入汇编代码
    • unsigned int low, high;
    • asm volatile("rdtsc" : "=a" (low), "=d" (high)); //low 和 high 分别包含64位时间戳的低32位和高32位 
  • 分支声明
    •  if (unlikely(error)) {
              /* ... */
          }
      
      • x很少出现,绝少发生,通常为假
    • if (likely(success)) {
               /* ... */
          }
      
      • y经常出现,通常为真

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

  • 在内核中,不该访问非法的内存地址,引用空指针,否则内核会over;
  • 内核中的内存不分页:每用掉一个字节,物理内存都减少一个;

4. 内核编程时难以执行浮点运算

  • 与用户空间进程不同,内核不完美支持浮点操作

5. 内核给每个进程只有一个很小的定长堆栈

  • 对于不用的体系结构,内核栈的大小不一样并都是固定的;

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

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

时间: 2024-12-14 18:40:49

《Linux内核设计与实现》Chapter 2 读书笔记的相关文章

《Linux内核设计与实现》 Chapter4 读书笔记

<Linux内核设计与实现> Chapter4 读书笔记 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统. 一.多任务 多任务操作系统就是能同时并发地交互执行多个进程的操作系统. 多任务系统可以划分为两类: 非抢占式多任务 进程会一直执行直到自己主动停止运行 抢占式多任务 Linux/Unix使用的是抢占式的方式:强制的挂起进程的动作就叫做抢占. 像所有unix的变体和许多其他现代操作系统一样,Linux提

《Linux内核设计与实现》Chapter 5 读书笔记

<Linux内核设计与实现>Chapter 5 读书笔记 在现代操作系统中,内核提供了用户进程与内核进行交互的一组接口,这些接口的作用是: 使应用程序受限地访问硬件设备 提供创建新进程与已有进程进行通信的机制 提供申请操作系统其他资源的能力 一.与内核通信 1.系统调用的作用 系统调用在用户空间进程和硬件设备之间添加了一个中间层,作用是: 为用户空间提供了一种硬件抽象接口: 系统调用保证了系统的稳定和安全,即可以避免应用程序不正确地使用硬件设备,窃取其他进程的资源: 每个进程都运行在虚拟系统中

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

<Linux内核设计与实现>Chapter 3 读书笔记 进程管理是所有操作系统的心脏所在. 一.进程 1.进程就是处于执行期的程序以及它所包含的资源的总称. 2.线程是在进程中活动的对象. 3.进程提供两种虚拟机制:虚拟处理器和虚拟内存. 4.内核调度的对象是线程,而不是进程. 二.进程描述符及任务结构 内核把进程的列表存放在叫做任务队列的双向循环链表中.链表中的每一项都是类型为task_struct的进程描述符结构,该结构定义在<linux/sched.h>文件中. 1.分配进

读书笔记2013-2 Linux内核设计与实现A

<Linux内核设计与实现> 简介 这本书不是想Linux源码剖析那样一行行分析Linux源代码的书,而是从Linux历史,Linux哲学,Linux设计原理和原则,计算机硬件相关知识,编译安装内核实战等多方面多角度讲述和Linux相关的方方面面.从中学到的更多的不单内核的源代码,而是Linux的哲学.建议所有从事Linux相关工作的猿都要读一下,读完之后,很多东西都变得容易理解,知其然,知其所以然.如果没有读过<深入理解计算机>类似的图书,建议和<深入理解计算机>一起

【读书笔记】《Linux内核设计与实现》内核同步介绍&内核同步方法

简要做个笔记,以备忘. 需同步的原因是,我们并发访问了共享资源.我们将访问或操作共享资源的代码段称"临界区",如果两个执行线程处于同一临界区中同时执行,称"竞争条件".这里术语执行线程指任何正在执行的代码实例,如一个在内核执行的进程.一个中断处理程序或一个内核线程. 举个简单例子,i++操作.该操作可以转换为下面的机器指令序列: 1.得到当前变量i的值,并保存到一个寄存器. 2.将寄存器的值加1. 3.将i的新值写回到内存中. 当两个线程同时进入这个临界区,若i初值

Linux内核设计与实现 读书笔记 转

Linux内核设计与实现  读书笔记: http://www.cnblogs.com/wang_yb/tag/linux-kernel/ <深入理解LINUX内存管理> http://blog.csdn.net/yrj/article/category/718110 Linux内存管理和性能学习笔记(一) :内存测量与堆内存 第一篇 内存的测量 2.1. 系统当前可用内存 # cat /proc/meminfoMemTotal:        8063544 kBMemFree:       

《Linux内核设计与实现》读书笔记(十一)- 定时器和时间管理

系统中有很多与时间相关的程序(比如定期执行的任务,某一时间执行的任务,推迟一段时间执行的任务),因此,时间的管理对于linux来说非常重要. 主要内容: 系统时间 定时器 定时器相关概念 定时器执行流程 实现程序延迟的方法 定时器和延迟的例子 1. 系统时间 系统中管理的时间有2种:实际时间和定时器. 1.1  实际时间 实际时间就是现实中钟表上显示的时间,其实内核中并不常用这个时间,主要是用户空间的程序有时需要获取当前时间, 所以内核中也管理着这个时间. 实际时间的获取是在开机后,内核初始化时

《Linux内核设计与实现》读书笔记——第一二章

<Linux内核设计与实现>读书笔记——第一二章 第一章 Linux内核简介 1.1 Unix的历史 简洁:仅提供系统调用并有一个非常明确的设计目的. 抽象:Unix中绝大部分东西都被当做文件,这种抽象使对数据和对设备的操作是通过一套相同的系统调用接口来进行的(open().read().write().lseek().close()). 可移植:使用C语言编写,使其在各种硬件体系架构面前都具备令人惊异的移植能力. 进程创建迅速:有独特的fork()系统调用,一次执行保质保量地完成一个任务.简

《Linux内核设计与实现》读书笔记(八)- 中断下半部的处理

在前一章也提到过,之所以中断会分成上下两部分,是由于中断对时限的要求非常高,需要尽快的响应硬件. 主要内容: 中断下半部处理 实现中断下半部的机制 总结中断下半部的实现 中断实现示例 1. 中断下半部处理 那么对于一个中断,如何划分上下两部分呢?哪些处理放在上半部,哪些处理放在下半部? 这里有一些经验可供借鉴: 如果一个任务对时间十分敏感,将其放在上半部 如果一个任务和硬件有关,将其放在上半部 如果一个任务要保证不被其他中断打断,将其放在上半部 其他所有任务,考虑放在下半部 2. 实现中断下半部