《Linux内核设计与实现》 第一二章学习笔记
《Linux内核设计与实现》 第一二章学习笔记
第一章 Linux内核简介
1.1 Unix的历史
Unix的特点
- Unix很简洁,所提供的系统调用都有很明确的设计目的。
- Unix中一切皆文件,对数据和设备的操作都是通过一套相同的系统调用接口进行的。
- Unix内核和相关的系统工具都是用C语言编写成的。
- Unix进程创建非常迅速。
- Unix提供了一套简单而稳定的进程间通信原语。
Unix现在已经发展为一个支持抢占式多任务、多线程、虚拟内存、换页、动态链接和TCP/IP网络的现代化操作系统。
1.2追寻Linus足迹:Linux简介
- Linux是类Unix系统,但它不是Unix,尽管Linux借鉴了Unix的许多设计并且实现了Unix的API。
- Linux是一个非商业化的产品,这是它最让人感兴趣的特征。
- Linux用途广泛,包含的东西也名目繁多。
1.3操作系统和内核简介
操作系统是计算机完成基本功能和系统管理的核心,内核是操作系统的核心。在系统中运行的应用程序通过系统调用来与内核通信。
内核提供的服务主要有:
- 中断服务程序,负责响应响应中断
- 调度程序,负责管理多个进程从而分配处理器轮转时间
- 内存管理程序,管理进程地址空间
- 网络、进程间通信等系统服务
1.4Linux内核和传统Unix内核比较
Linux是类Unix系统,但不是Unix,也没有直接使用Unix的源代码。Linux内核是自由公开的软件,开源。Linux是单内核,但汲取了微内核的精华:模块化设计、抢占式内核、支持内核线程以及动态装载内核模块的能力。
1.5Linux内核版本

1.6Linux内核开发者社区
1.7小结
第二章
2.1获取内核源码
2.1.1使用Git
使用Git来获取最新版本源代码:
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
更新到Linux的最新分支:
$ git pull
2.1.2安装内核源代码
解压并安装内核源代码:
$ tar xvjf linux-x.y.z.tar.bz2/gz
2.1.3使用补丁
使用补丁:
$ patch -p1 < ../patch-x.y.z
2.2内核源码树


2.3编译内核
2.3.1配置内核
Linux中可以配置的选项其前缀均为CONFIG。
配置项二选一:yes 或 no
配置项三选一:yes 、no 或 module(以模块形式生成,为独立代码段)
简化内核配置工具:
字符界面下的Linux工具:逐一遍历所有的配置项,要求用户逐一选择,耗时长。
$ make config
基于ncurse库编制的图形界面工具:
$ make menuconfig
基于gtk+的图形工具:
$ make gconfig
基于默认配置为体系结构创建一个配置:
$ make defconfig
验证和更新配置:
make oldconfig
一旦内核配置好,就可以利用一个简单的命令来编译它。
$ make
2.3.2减少编译的垃圾信息
尽量减少垃圾信息的方法:对输出进行重定向。
$ make > .. /detritus 将输出信息重定向到这个文件目录 $ make > /dev/null 把无用的输出信息重定向到永无返回值的黑洞/dev/null
2.3.3衍生多个编译作业
$ make jn n为要衍生出的作业数,每个处理器可以衍生出1或2个作业,16核时n可取32
2.3.4安装新内核
$ make modules_install
2.4内核开发的特点
2.4.1无libc库抑或无标准头文件
大部分常用的C库函数在内核中都已经得到实现,只要包含<linux/string.h>文件就可以使用它们。
2.4.2GNU C
内联函数
内联函数的工作模式:函数会在它所调用的位置上展开,可以消除函数调用和返回所带来的开销(寄存器存储和恢复)。但是代码会变长,占用更多的内存空间或者缓存指令。
定义一个内联函数的时候需要使用static作为关键字并用inline限定,并且必须在使用之间就定义好。
static inline void wolf(unsigned long tail_size)
内联汇编
gcc编译器支持在C函数中嵌入汇编指令。通常使用asm()指令嵌入汇编代码。
分支声明
对于条件选择语句,在一个条件经常出现或很少出现的时候,编译器可以根据这条指令对条件分支进行选择优化。并将其封装成宏,如likely()和unlikely()。
将一个选择标记成绝少发生的分支:
/error绝大多数时间都会为0/ if(unlikely(error)){ ... }
将一个分支标记为通常为真的分支:
/success通常都不会为0/ if(likely(success)){ ... }
2.4.3没有内存保护机制
内核中发生内存错误会导致oops。访问非法地址或引用空指针可能会造成死机。
内核中所有的内存都不分页。每使用一个字节,物理内存就减少一个字节。
2.4.4不要轻易在内核中使用浮点数
2.4.5容积小而固定的栈
2.4.6同步和开发
- Linux是抢占式多任务操作系统。
- Linux内核支持对称处理器系统(SMP)。
- 中断是异步到来的,完全不考虑当前正在执行的代码。
- Linux内核可以抢占。
2.4.7可移植性的重要性
2.5小结
在探索的征途中,最重要的是阅读和修改内核源代码,只有通过实际的阅读和实践词汇理解内核。
《Linux内核设计与实现》 第一二章学习笔记的更多相关文章
- 《java编程思想(第四版)》第一二章学习笔记
目录 一.Introduction 1.抽象过程 2.面向对象语言(包括Java)的五个基本特性 3.每个对象都提供服务 4.public.private.protected三者的区别 5.Java的 ...
- 《Linux内核设计与实现》第一、二章学习笔记
<Linux内核设计与实现>第一.二章学习笔记 姓名:王玮怡 学号:20135116 第一章 Linux内核简介 一.关于Unix ——一个支持抢占式多任务.多线程.虚拟内存.换页.动态 ...
- 《Linux内核设计与实现》第四周读书笔记——第五章
<Linux内核设计与实现>第四周读书笔记--第五章 20135301张忻 估算学习时间:共1.5小时 读书:1.0 代码:0 作业:0 博客:0.5 实际学习时间:共2.0小时 读书:1 ...
- LINUX内核设计与实现第三周读书笔记
LINUX内核设计与实现第三周读书笔记 第一章 LINUX内核简介 1.1 Unix的历史 1969年的夏天,贝尔实验室的程序员们在一台PDR-7型机上实现了Unix这个全新的操作系统. 1973年, ...
- 《Linux内核设计与实现》Chapter 3 读书笔记
<Linux内核设计与实现>Chapter 3 读书笔记 进程管理是所有操作系统的心脏所在. 一.进程 1.进程就是处于执行期的程序以及它所包含的资源的总称. 2.线程是在进程中活动的对象 ...
- 《Linux内核设计与实现》Chapter 1 读书笔记
<Linux内核设计与实现>Chapter 1 读书笔记 一.Unix的特点 Unix从Multics中产生,是一个强大.健壮和稳定的操作系统. 特点 1.很简洁 2.在Unix系统中,所 ...
- 《Linux内核设计与实现》Chapter 2 读书笔记
<Linux内核设计与实现>Chapter 2 读书笔记 一.获取内核源码 1.使用Git 我们曾经在以前的学习中使用过Git方法 $ git clone git://git.kernel ...
- 《Linux内核设计与实现》Chapter 5 读书笔记
<Linux内核设计与实现>Chapter 5 读书笔记 在现代操作系统中,内核提供了用户进程与内核进行交互的一组接口,这些接口的作用是: 使应用程序受限地访问硬件设备 提供创建新进程与已 ...
- 《Linux内核设计与实现》Chapter 18 读书笔记
<Linux内核设计与实现>Chapter 18 读书笔记 一.准备开始 一个bug 一个藏匿bug的内核版本 知道这个bug最早出现在哪个内核版本中. 相关内核代码的知识和运气 想要成功 ...
随机推荐
- 4.8 Sublime Text3 中配置 Python环境 --之下Sublime配置Python环境
返回总目录 目录: 1.没有配置之前 2.安装Package Control插件 3.安装其他库: 4.配置其他操作: (一)没有配置之前: 我们试着运行以下,会效果怎么样? 1.首先选择Python ...
- Spring消息中间件ActiveMQ
1:下载ActiveMQ (apache-activemq-5.15.6) 2:下载后的结构如下 3:启动activeMQ 可以通过cmd控制台的方式,也可以通过注册services服务启动的方式 3 ...
- python五十九课——正则表达式的拓展内容
演示正则表达式的拓展内容:函数:finditer(regex,string,[flags=0]):参数:和match.search.findall一样理解功能:将所有匹配的数据封装为一个一个的matc ...
- centos7下安装docker(3.3创建镜像--修改dockerfile)
1.我们在制作dockerfile的时候可能有些命令无法执行,导致镜像无法创建成功,这时我们可以修改dockerfile,从而达到我们的目的 查看Dockerfile内容 创建新的镜像,失败 Dock ...
- $Matrix-Tree$定理-理论
$Matrix-Tree$ 矩阵的行列式 这个东西看了好久才明白 _ (:з」∠)_ 时间不够可以直接跳到第六段. 看到这种新定义,第一反应还是去翻百度百科: 但是这个讲解真的让人很迷惑...关键就是 ...
- usb-cam (2)摄像机标定
http://blog.csdn.net/heyijia0327/article/details/43538695 官方也给出了单目的标定教程和双目视觉的标定教程.本教程基于usb_cam pack ...
- WIN10+ VS2013 配置Opencv2413 64位
VS2013 配置Opencv2413 64位 系统变量 Path: F:\2biancheng_tool\Opencv2413\opencv\build\x64\vc12\bin 用户变量:添加 ...
- attribute与parameter区别(转)
文章转自http://blog.csdn.net/saygoodbyetoyou/article/details/9006001 request.getParameter取得Web客户端到web服务端 ...
- eaeyui-combobox实现组合查询(即实现多个值得搜索)
2015年9月1日,今天要实现下拉框的组合查询功能,即可以再下拉框中选择多个值,输入框中每个值之间有逗号隔开,传到后台,由split函数将其分割开,组合成数组,在由sql查询. 实现的效果是: 当时在 ...
- 认识ASP.NET Windows身份认证
本文摘自:细说ASP.NET Windows身份认证 Forms身份认证虽然使用广泛,不过,如果是在 Windows Active Directory 的环境中使用ASP.NET, 那么使用Windo ...