Linux第二章读书笔记
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.内核源码树
……这个……还是看书吧
3.编译内核
3.1配置内核
- 配置选项(指定内核源码可以访问的值,一般以预处理宏的形式表示)
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库抑或标准头文件
主要原因:速度与大小。
头文件
- 基本头文件位于内核源代码顶级目录下的include中。
-体系结构相关头文件:内核源代码树的arch/<architecture>/include/asm目录下
4.2GNU C
GCC是多种GNU编译器的集合。
内联函数
- 定义一个内联函数,用static作关键字,用inline限定它。
static inline void wolf(unsigned long tail_size);
内联汇编
- 用asm()指令嵌入汇编代码
unsigned int low, high;
asm volatile("rdtsc" : "=a" (low), "=d" (high)); //low 和 high 分别包含64位时间戳的低32位和高32位
分支声明
- /* 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是可移植的操作系统。
Linux第二章读书笔记的更多相关文章
- 20135320赵瀚青LINUX第二章读书笔记
第二章-从内核出发 获取内核代码 使用git 获取最新提交到版本树的一个副本 $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/tor ...
- 2013337朱荟潼 Linux第二章读书笔记——从内核出发
1.获取内核源码 1.1Git 分布式的:下载和管理Linux内核源代码: - 获取最新提交到版本树的一个副本 $ git clone git://git.kernel.org/pub/scm/lin ...
- linux第二次读书笔记
<Linux内核设计与实现>读书笔记 第五章 系统调用 第五章系统调用 系统调用是用户进程与内核进行交互的接口.为了保护系统稳定可靠,避免应用程序恣意忘形. 5.1与内核通信 系统调用 ...
- 20135320赵瀚青LINUX第一章读书笔记
第一章-Linux内核简介 Unix的历史 依旧被认为是最强大和最优秀的系统 由一个失败的操作系统Multics中产生 被移植到PDP-11型机中 由其他组织进一步开发 重写了虚拟内存系统,最终官方版 ...
- 《Ansible自动化运维:技术与佳实践》第二章读书笔记
Ansible 安装与配置 本章主要讲的是 Ansible 安装与基本配置,主要包含以下内容: Ansible 环境准备 安装 Ansible 配置运行环境 Ansible 环境准备 从 GitHub ...
- Android深度探索--HAL与驱动开发----第二章读书笔记
1. 底层开发工具包括: JDk6或者以上版本:Eclipse3.4或以上版本:ADT(用于开发Android应用程序),CDT(用于开发AndroidNDK程序):Android SDK:Andro ...
- Linux第一章读书笔记
一.Linux历史 Unix强大的根本原因: 1.简洁,仅仅提供几百个系统调用并且有一个非常明确的设计目的 2.文件对待所有东西,通过一套相同的系统调用接口来进行对数据和设备的操作 3.由于用C语言编 ...
- 2013337朱荟潼 Linux第一章读书笔记——Linux内核简介
一.Unix历史 二.Linux足迹 类Linux系统.非商业化产品.用途广泛 三.操作系统和Linux内核简介 1.操作系统 (1)是指在整个最基本功能系统中负责完成最基本功能和系统管理的部分. ( ...
- 《深入理解JVM》第二章读书笔记
Java内存区域与内存溢出异常 运行时数据区域 JVM执行java程序的时候有一个运行时数据区,每个区域有自己的作用,了解这些区域有助于我们理解JVM.JVM运行时数据区如图所示: 程序计数器 该区域 ...
随机推荐
- [ML学习笔记] 回归分析(Regression Analysis)
[ML学习笔记] 回归分析(Regression Analysis) 回归分析:在一系列已知自变量与因变量之间相关关系的基础上,建立变量之间的回归方程,把回归方程作为算法模型,实现对新自变量得出因变量 ...
- 6.Solr4.10.3API使用(CURD)
转载请出自出处:http://www.cnblogs.com/hd3013779515/ 1.在工程中引入solr-solrj-4.10.3.jar <dependency> <gr ...
- React-Native开发笔记 持续更新
1.css单位转换px2dp 在做页面开发的时候习惯了用rem去做css单位,处理各种尺寸数据,到了React-Native里面做app开发时,rem就不好用了,这个时候就需要转换成另外一个单位,基本 ...
- vue组件-子组件向父组件传递数据-自定义事件
自定义事件 我们知道,父组件是使用 props 传递数据给子组件,但如果子组件要把数据传递回去,应该怎样做?那就是自定义事件!
- windows 下配置 Nginx 常见问题
因为最近的项目需要用到负载均衡,不用考虑,当然用大名鼎鼎的Nginx啦.至于Nginx的介绍,这里就不多说了,直接进入主题如何在Windows下配置. 我的系统是win7旗舰版的,到官网下载最新版本 ...
- web.xml配置遇到的问题
web.xml<listener> <listener-class>org.springframework.web.context.ContextLoad ...
- 十二生肖swift1.2
2015年八月的最后一个星期,暑假就快落幕,说起来觉得这个暑假挺后悔没去实习,就在项目组里这边打打酱油,这里做点修改,不过自学了一些mapnik,还有nodejs和django的基础开发,其实还是很喜 ...
- Xcode添加全局引用文件pch
Xcode6之前有PrefixHeader.pch文件在写项目的时候,大部分宏定义.头文件都导入在这个pch文件,虽然方便,但会增加Build的时间,所以Xcode6以及之后的版本去除了PrefixH ...
- python_基础语法
开始正式接触python的语法: 1. 2.
- 20155210 Exp5 MSF基础应用
Exp5 MSF基础应用 一个主动攻击实践,MS08-067 首先利用msfconsole启用msf终端 然后利用search MS08-067搜索漏洞,会显示相应漏洞模块 如图: 根据上图,我们输入 ...