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

最新文章

  1. Eclipse调试按钮消失问题
  2. win live
  3. HP Web Tours分析
  4. POJ 2828-Buy Tickets(线段树)
  5. 《Linear Algebra and Its Applications》-chaper1-线性方程组- 线性变换
  6. [Twisted] Protocols协议和Protocol Factories 协议工厂
  7. 代理服务器基本知识普及代理IP使用方法!
  8. 左移运算符&lt;&lt;
  9. SQLServer2008R2 发布订阅及相关问题解决办法
  10. EDM模板编写踩坑指南(非响应式,纯table有源码)
  11. 输入法设置,SublimeTest,putty掉线
  12. 从零开始学Python 三(网络爬虫)
  13. Mysql 关键字的优先级 分组 多表联查
  14. jetbrains全系列可用例:IDEA、WebStorm、phpstorm、clion等激活到2099
  15. PAT基础6-3
  16. JS中JSON.parse和eval的异同
  17. Bayesian generalized linear model (GLM) | 贝叶斯广义线性回归实例
  18. Java课程设计(2019版)
  19. css3中的相关单位
  20. 关于Tomcat控制台乱码解决办法___ 解决 IntelliJ IDEA Tomcat 控制台中文输出乱码问题

热门文章

  1. PyQt5--QFileDiaglog
  2. Java实现XML和JavaBean互转 - XStream
  3. WMS - resource info
  4. 洛谷P1803
  5. ATP学姐的模拟赛
  6. android 实现mqtt消息推送,以及不停断线重连的问题解决
  7. Kubernetes1.91(K8s)安装部署过程(四)--Master节点安装
  8. servlet3.0
  9. day32
  10. 关于CAN总线的被动错误标志的问题?