《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. 要考虑可移植的重要性

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

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

    <Linux内核设计与实现> Chapter4 读书笔记 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子 ...

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

    第5章系统调用 5.1与内核通信 主要作用: 为用户控件提供了一种硬件的抽象接口. 保证了系统稳定性与安全性. 为用户空间&系统提供公共接口. 5.2API.POSIX和C库 一般情况,应用程 ...

  3. 《Linux内核分析》第六周 读书笔记

    <Linux内核设计与实现>CHAPTER3阅读梳理 [学习时间:3hours] [学习内容:进程的描述:进程的生命周期(包括创建.终结)] 一.进程(任务)描述 1.进程是处于执行期的程 ...

  4. linux内核分析 1、2章读书笔记

    一.linux历史 20世纪60年代,MIT开发分时操作系统(Compatible TIme-Sharing System),支持30台终端访问主机: 1965年,Bell实验室.MIT.GE(通用电 ...

  5. 《Linux内核分析》第七周 读书笔记

    <深入理解计算机系统>CHAPTER7阅读梳理 [学习时间:3hours] [学习内容:链接需要的代码&数据:链接机制:链接生成的目标文件] 一.链接概述 1.链接 定义:链接是将 ...

  6. 《Linux内核设计》第17章学习笔记

  7. 《linux内核》课本第五章读书笔记

  8. 《Linux内核设计与实现》课本第一章&第二章学习笔记

    <Linux内核设计与实现>课本学习笔记 By20135203齐岳 一.Linux内核简介 Unix内核的特点 Unix很简洁,所提供的系统调用都有很明确的设计目的. Unix中一切皆文件 ...

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

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

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

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

随机推荐

  1. 【Hibernate步步为营】--核心对象+持久对象全析(一)

    引言         上篇博客对Hibernate进行了基本的解析.并分析了它的一些特性. Hibernate可以如此的流行也是由于它有诸多长处,不论什么事物都有两面性.Hibernate尽管流行.可 ...

  2. javascript:void(0)的问题

    最近看了好几个关于<a>标签和javascript:void(0)的帖子,谨记于此,以资查阅. 注:以下代码未经全面测试,但每一种方法可能会出现的情况都基本做了说明. 在做页面时,如果想做 ...

  3. google浏览器window.onbeforeunload方法兼容问题

    window.onbeforeunload方法在IE内核浏览器是有效的,但是在google浏览器中并不兼容,请教给位怎么在google浏览器中兼容window.onbeforeunload方法 采纳的 ...

  4. Docker技术入门与实战 第二版-学习笔记-8-网络功能network-3-容器访问控制和自定义网桥

    1)容器访问控制 容器的访问控制,主要通过 Linux 上的 iptables防火墙来进行管理和实现. iptables是 Linux 上默认的防火墙软件,在大部分发行版中都自带. 容器访问外部网络 ...

  5. python之生成随机测验试卷

    自己又开始懒散的态度生活,所以几乎有两个月没有更博了. 项目:美国各州首府地理考试,为防止作弊,35份试卷,50道题随机次序,生成独一无二的试卷. 基本想法: 1.将各州首府的地方和首府写入列表,以K ...

  6. Android 一s个相对完整的自动升级功能实现代码

    由于项目的需要最近做了一个关于Android自动升级的功能,下面将贴出Android手机客户端的完整代码.这段代码参考别的代码居多,由于不满足需求,所以自己仅仅改了一些需要变动的内容,其他功能都是按照 ...

  7. 微信小程序开发 [07] 写在后面的话

    写在后面的话基本算是吐槽了,在学完小程序的课程之后,我用博客园的api,写了个闪存的小程序,本来兴致勃勃甚至这篇是准备写"我的第一个小程序发布啦",然而并没有. 不是说我偷懒了没写 ...

  8. 20155217《网络对抗》Exp04 恶意代码分析

    20155217<网络对抗>Exp04 恶意代码分析 实践内容 使用schtasks指令监控系统运行 使用sysmon工具监控系统运行 使用virscan分析恶意软件 使用systrace ...

  9. 20155302《网络对抗》Exp9 Web安全基础

    20155302<网络对抗>Exp9 Web安全基础 实验内容 本实践的目标理解常用网络攻击技术的基本原理.Webgoat实践下相关实验. 实验过程 1.webgoat的安装启动 使用自己 ...

  10. java maven项目迁移时缺失jar包 或者 maven jar包缺失时的解决方案

    这样弄完,jar包就都下载好了,就不缺失了. 从GitHub上checkout一个项目下来,导入idea后发现加载依赖奇慢无比,所以临时把网络调成FQ的代理,结果会发现idea会停止之前的下载,那怎么 ...