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第二章读书笔记的更多相关文章

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

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

  2. 2013337朱荟潼 Linux第二章读书笔记——从内核出发

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

  3. linux第二次读书笔记

    <Linux内核设计与实现>读书笔记 第五章 系统调用   第五章系统调用 系统调用是用户进程与内核进行交互的接口.为了保护系统稳定可靠,避免应用程序恣意忘形. 5.1与内核通信 系统调用 ...

  4. 20135320赵瀚青LINUX第一章读书笔记

    第一章-Linux内核简介 Unix的历史 依旧被认为是最强大和最优秀的系统 由一个失败的操作系统Multics中产生 被移植到PDP-11型机中 由其他组织进一步开发 重写了虚拟内存系统,最终官方版 ...

  5. 《Ansible自动化运维:技术与佳实践》第二章读书笔记

    Ansible 安装与配置 本章主要讲的是 Ansible 安装与基本配置,主要包含以下内容: Ansible 环境准备 安装 Ansible 配置运行环境 Ansible 环境准备 从 GitHub ...

  6. Android深度探索--HAL与驱动开发----第二章读书笔记

    1. 底层开发工具包括: JDk6或者以上版本:Eclipse3.4或以上版本:ADT(用于开发Android应用程序),CDT(用于开发AndroidNDK程序):Android SDK:Andro ...

  7. Linux第一章读书笔记

    一.Linux历史 Unix强大的根本原因: 1.简洁,仅仅提供几百个系统调用并且有一个非常明确的设计目的 2.文件对待所有东西,通过一套相同的系统调用接口来进行对数据和设备的操作 3.由于用C语言编 ...

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

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

  9. 《深入理解JVM》第二章读书笔记

    Java内存区域与内存溢出异常 运行时数据区域 JVM执行java程序的时候有一个运行时数据区,每个区域有自己的作用,了解这些区域有助于我们理解JVM.JVM运行时数据区如图所示: 程序计数器 该区域 ...

随机推荐

  1. 记录使用git submodule时踩的坑

    在使用git子模块的时候踩了一个坑 在使用git submodule updata --init --recursive命令,即递归更新子模块并初始化时碰到了一个问题: 经过一段不短时间的排查,发现问 ...

  2. Sublime Test 3 搭建C++11编译环境(Windows)

    0. 我的环境: Windows 8.1,Sublime Test 3 - Build 3126,CodeBlocks 16.01. 1. 下载Sublime Test 3,以及安装Package和各 ...

  3. python第四十课——构造函数

    1.动态给对象添加属性: 在对象创建完毕后,单独为其添加需要的属性:可以理解为:私人定制 [注意]: 添加的属性只有此对象能够使用,别的对象如果用了,直接报错; 2.构造函数/构造方法/构造器: 格式 ...

  4. Spark项目之电商用户行为分析大数据平台之(八)需求分析

    1.按条件筛选session 搜索过某些关键词的用户.访问时间在某个时间段内的用户.年龄在某个范围内的用户.职业在某个范围内的用户.所在某个城市的用户,发起的session.找到对应的这些用户的ses ...

  5. 哪些地方会出现css阻塞,哪些地方会出现js阻塞?

    Js的阻塞特性: 所有浏览器在下载JS的时候,会阻止一切其他活动,比如其他资源的下载,内容的呈现等等.直到JS下载.解析.执行完毕后才开始继续并行下载其他资源并呈现内容.为了提高用户体验,新一代浏览器 ...

  6. <数据结构与算法分析>读书笔记--实现泛型构件pre-Java5

    面向对象的一个重要目标是对代码重用的支持.支持这个目标的一个重要的机制就是泛型机制:如果除去对象的基本类型外,实现的方法是相同的,那么我们就可以用泛型实现来描述这种基本的功能. 1.使用Object表 ...

  7. ubuntu16.04之sudo问题

    问题描述: 我通过useradd test创建了test用户,并通过mkdir test创建了该用户对应的目录,再通过chown -R test /home/test将该目录及其子目录权限授予给tes ...

  8. Kubernetes1.91(K8s)安装部署过程(七)--coredns安装

    为了是集群内的服务能使用dns进行服务解析,集群内需要使用dns服务器,可以按照kube官方dns,即kubedns或者其他的dns,比如coredns, 本例中按照的为coredns,按照简单,编辑 ...

  9. 安装的 Linux 软件包有多少?

    导读 你有没有想过你的 Linux 系统上安装了几千个软件包? 是的,我说的是“千”. 即使是相当一般的 Linux 系统也可能安装了上千个软件包. 有很多方法可以获得这些包到底是什么包的详细信息. ...

  10. php初进一个项目组,使用几个函数帮忙熟悉流程

    初进一个项目组的时候,可能对他的框架啊神马不熟悉的.有时候类里又有各种魔术方法的使用,IDE还跳转不过去对象的方法.这时候很多php内置函数就可以帮上些忙了. 1. instanceof 2. get ...