1.获取内核源码

1.1Git

分布式的;下载和管理Linux内核源代码;

- 获取最新提交到版本树的一个副本
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
- 下载代码后,更新自己的分支到最新分支
$ git pull

1.2安装内核源代码

- 压缩形式为bzip2
运行:$ tar xvjf linux-x.y.z.tar.bz2
- 压缩形式为zip
运行:$ tar xvzf linux-x.y.z.tar.gz - 注释(xvjf、xvzf):
-x 解开;
-v 显示详细信息;
-j 使用bzip2程序;
-z 使用gzip程序;
-f 使用归档文件;

1.3使用补丁

- 从内部源码树开始
运行$ patch -p1 < ../patch-x,y,z

2.内核源码树

(详见书《Linux内核设计与实现》原书第3版 第11—12页表2-1内核源码树的根目录描述)

COPYIN:内核许可证;
CREDITS:内核代码的开发者列表;
MAINTAINTERS:维护者列表——负责维护内核子系统和驱动程序;
Makefile:是基本内核的Makefile;

3.编译内核

3.1配置内核(关于make与config)

- 配置选项(指定内核源码可以访问的值,一般以预处理宏的形式表示)
1.决定哪些文件编译进内核;通过预处理命令处理代码。
2.二选一:yes/no
3.三选一:yes(把代码编译进主内核映像中)/no/module(该配置项被选定了)【驱动程序一般是三选一】
4.可以是字符串或整数 - 配置工具:
$ make config 配置命令解释器,最简单的一个字符界面下的命令行工具;
$ make menuconfig 配置用户界面,基于ncurse库的图形界面工具;
$ make gconfig 基于gtk+的图形工具;
$ make defconfig 基于默认的配置为个人的体系结构创建一个配置;
$ make oldconfig 验证和更新配置;
- .config文件:配置项会被存放在内核代码树根目录下。
	$ zcat /proc/config.gz > .config 目前的内核已经启用了CONFIG_IKCONFIG_PROC选项,可以从/proc下复制文件;
$ make oldconfig 便以一个新内核;
$ make 编译该配置好的内核;

3.2减少编译的垃圾信息

	- 不看错误报告和警告信息,对输出重定向
$ make > ../detritus
- 把无用的输出信息重定向到永无返回值的黑洞/dev/null中
$ make > /dev/null

3.3衍生多个编译作业

- 以多个作业编译内核
$ make -jn (j:指定同时执行多任务;n:要衍生出的作业数)
- 16核处理器
$ make -j32 > /dev/null

3.4安装新内核

- 以root身份,运行,把所有已编译的模块安装到正确的主目录/lib/modules下。
% make modules_install
- System.map文件:编译时在内核代码树的根目录下创建的文件;是一个符号对照表;用来将内核符号与它们的起始地址对应起来;调试时,把内存地址转化为函数名和变量名,很有用。

4.内核开发的特点

4.1无libc库抑或标准头文件

主要原因:速度与大小。

4.1.1头文件

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

4.2GNU C

GCC是多种GNU编译器的集合。

4.2.1内联函数

- 定义一个内联函数,用static作关键字,用inline限定它。
static inline void wolf(unsigned long tail_size);

4.2.2内联汇编

- 用asm()指令嵌入汇编代码
unsigned int low, high;
asm volatile("rdtsc" : "=a" (low), "=d" (high)); //low 和 high 分别包含64位时间戳的低32位和高32位

4.2.3分支声明

- /* error在绝大多数情况下为0 */
if (unlikely(error)) {
/* ... */
} - /* success在通常不为0 */
if (likely(success)) {
/* ... */
} - 如果判断正确,性能会提升;如果搞错,性能反而下降。

4.3没有内存保护机制

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

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

与用户空间进程不同,内核不完美支持浮点操作,因为他本身不能陷入;

4.5容积小而固定的栈

用户空间的栈本身比较大,而且可以动态增长;
对于不用的体系结构,内核栈的大小不一样并都是固定的;

4.6同步和并发

- 内核易产生竞争条件,许多特性都要求能过并发地访问共享数据,就要求同步机制以保证不出现竞争条件,特别是:
• Linux是抢占多任务操作系统
• Linux内核支持对称多处理器系统(SMP)
• 中断异步到来
• Linux内核可以抢占
- 常用解决方法:自旋锁和信号量

4.7可移植性的重要性

Linux是可移植的操作系统。

5.小结

内核有独一无二的特质,拥有整个系统的最高管理权。

2013337朱荟潼 Linux第二章读书笔记——从内核出发的更多相关文章

  1. 2013337朱荟潼 Linux第一章读书笔记——Linux内核简介

    一.Unix历史 二.Linux足迹 类Linux系统.非商业化产品.用途广泛 三.操作系统和Linux内核简介 1.操作系统 (1)是指在整个最基本功能系统中负责完成最基本功能和系统管理的部分. ( ...

  2. 2013337朱荟潼 Linux第五章读书笔记——系统调用

    摘要: [20135337朱荟潼]原创作品转载请注明出处 第五章 系统调用 5.1 与内核通信 中间层 作用三个:1.为用户空间提供一种硬件的抽象接口:2.保证系统稳定和安全:3.除异常和陷入,是内核 ...

  3. 20135320赵瀚青LINUX第二章读书笔记

    第二章-从内核出发 获取内核代码 使用git 获取最新提交到版本树的一个副本 $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/tor ...

  4. 2013337朱荟潼 Linux第三章读书笔记——进程管理

    第三章 进程管理 总结 fork创造的子进程复制了父进程资源,包括内存及进程描述符的内容,资源的复制而不是指针的复制. vfork的行为更像一个线程(指没有自已独立的内存空间),更明显的是vfork的 ...

  5. 2013337朱荟潼 Linux第四章读书笔记——进程调度

    第4章 进程调度 0. 总结 调度:调度是一个平衡的过程.一方面,它要保证各个运行的进程能够最大限度的使用CP:另一方面,保证各个进程能公平的使用CPU. 调度功能:决定哪个进程运行以及进程运行多长时 ...

  6. 2013337朱荟潼 Linux&深入理解计算机系统第七章读书笔记——链接

    第七章--链接 0.总结 链接编译时可以采用静态链接或动态链接. 连接器主要任务:符号解析和重定位. 多个目标文件可定义相同的符号,可以被连接到一个单独的静态库. 链接器可以生成部分链接的可执行文件 ...

  7. 2013337朱荟潼 Linux第十八章读书笔记——调试

    第十八章 调试 0.总结 oops 内核的调试配置 用Git进行二分搜索 bug总会有,简洁描述发给LKML 1. 准备开始 在用户级的程序里,bug表现比较直接:在内核中却不清晰. 2. 内核中的b ...

  8. 20135337朱荟潼 Linux第二周学习总结——操作系统是如何工作的

    一.计算机是如何工作的--总结 三个法宝 存储程序计算机.函数调用堆栈.中断机制 二.堆栈 1.是c语言程序运行时必须的一个记录调用路径和参数的空间. 函数调用框架.传递参数.保存返回地址.提供局部变 ...

  9. Linux第二章读书笔记

    1.获取内核源码 1.1Git 分布式的:下载和管理Linux内核源代码: - 获取最新提交到版本树的一个副本 $ git clone git://git.kernel.org/pub/scm/lin ...

随机推荐

  1. 【Python】【unittest】unittest测试框架中setup,teardown与setupclass,teardownclass的区别

    # -*- coding:utf-8 -*- import unittest def runTest(testcaseclass,testcase=[]): suite = unittest.Test ...

  2. 金三银四求职季,前端面试题小梳理(HTML、CSS、JS)

    好久没写学习记录,最近太多事,又到一年求职季,都说金三银四求职季,自己也做一下最近学习的一些前端面试题梳理,还是个小白,写的不对请指正,不胜感激. HTML篇 html语义化 用语义化的代码标签书写, ...

  3. 2-7 R语言基础 数据框

    #数据框 > df <- data.frame(id=c(1,2,3,4),name=c("a","b","c","d ...

  4. 【转】使用程序修改系统(IE)代理设置

    文章都是发布在github再转到这边的,这边格式可能会乱掉.博客地址:benqy.com 这是本人在做的一个前端开发调试工具(HttpMock),功能是web服务器+http日记+http代理(类似f ...

  5. android 7.0拍照问题file:///storage/emulated/0/photo.jpeg exposed beyond app through ClipData.Item.getUri

    Android7.0调用相机时出现新的错误: android.os.FileUriExposedException: file:///storage/emulated/0/photo.jpeg exp ...

  6. 矿难让显卡压了那么多货咋办?NV如是说

    在苏州 GTC 开幕的几天前,英伟达刚刚遭遇了一次股价的腰斩. 近来加密货币的热度渐低,受到挖矿热潮照顾许多的英伟达「矿机」销量受到打击,甚至出现了严重的库存危机,加上近来刚刚发的 RTX20 系列显 ...

  7. P1522 牛的旅行 Cow Tours

    题目描述 农民 John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通.这样,Farmer John就有多个 ...

  8. tomcat-在cmd窗口启动Tomcat

    平时,一般使用tomcat/bin/startup.bat目录在windows环境启动Tomcat,或者使用IDE配置后启动. 下面来简单介绍下如果在cmd窗口直接输入命令启动Tomcat: 1.将t ...

  9. [Lydsy1805月赛]口算训练 BZOJ5358

    分析: 没想到这道题还能二分查找... 这题主席树的话,裸的很显然...我们将每一个数分解质因数,之后建一个可持久化权值线段树维护[L,R]区间内的每一种质因子的个数,分解质因数的话,可以选择用线筛, ...

  10. 20155301 Exp7 网络欺诈防范

    20155301 Exp7 网络欺诈防范 1.基础问题回答 (1)通常在什么场景下容易受到DNS spoof攻击 (2)在日常生活工作中如何防范以上两攻击方法 2.实践过程记录 简单应用SET工具建立 ...