Linux第一二章笔记
第一章 Linux内核简介
1. Unix内核的特点
- 简洁:仅提供系统调用并有一个非常明确的设计目的
- 抽象:几乎所有东西都被当做文件
- 可移植性:使用C语言编写,使得其在各种硬件体系架构面前都具备令人惊异的移植能力
- 进程:创建迅速,一次执行保质保量地完成一个任务;独特的fork系统调用
- 清晰的层次化结构:策略和机制分离的理念,简单的进程间通信元语把单一目的的程序方便地组合在一起
2. 关于Linux内核简介
- Linux是基于Unix的类Unix系统,设计思想相似,比如它也实现了Unix的API。但是Linux没有直接使用Unix的源代码,但它没有抛弃Unix的设计目标并且保证了应用程序编程接口的一致。
- Linux内核是自由公开软件。
- Linux系统的基础是内核、C库、工具集和系统的基本工具。
3. 操作系统和内核简介
- 操作系统是整个系统中负责完成最基本功能和系统管理的部分。包括内核、设备驱动程序、启动引导程序、命令行Shell或者其他种类的用户界面、基本的文件管理工具和系统工具。
- 内核是操作系统的核心。通常一个内核由负责响应中断的中断服务程序、负责管理多个进程从而分享处理器时间的调度程序、负责管理进程地址空间的内存管理程序和网络、进程之间通信等系统服务程序共同组成。
- 系统态:拥有受保护的内存空间和访问硬件设备的所有权限。(内核空间即这种系统态和被保护起来的内存空间)
- 用户态:执行普通用户程序时,系统以用户态进入用户空间执行。(应用程序在用户空间执行,只能看到允许它们使用的部分系统资源,并只使用某些特定的系统功能,不能直接访问系统硬件,也不能访问其他的内核划给别人的内存范围)
- 系统中运行的应用程序通过系统调用来与内核通信。(应用程序通过系统调用界面陷入内核,是应用程序完成工作的基本行为方式)
- 中断机制:一个异步的中断信号打断处理器的执行,继而打断内核的执行。中断通常对应一个中断号,内核通过中断号查找相应的中断服务程序,并调用这个程序响应和处理中断。
- 每个处理器在任何指定时间点上的活动必然是以下三者之一:
- 运行于用户空间,执行用户进程
- 运行于内核空间,处于进程上下文,代表某个特定的进程执行
- 运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断

4. Linux内核和传统Unix内核的比较
- 单内核
- 整个内核都在一个大内核地址空间上运行。
- 优点:简单、高效。所有内核都在一个大的地址空间上,所以内核各个功能之间的调用和调用函数类似,几乎没有性能开销。
- 缺点:一个功能的崩溃会导致整个内核无法使用。
- 微内核
- 内核按功能被划分成各个独立的过程。每个过程独立的运行在自己的地址空间上。
- 优点:安全。内核的各种服务独立运行,一种服务挂了不会影响其他服务。
- 缺点:内核各个服务之间的调用涉及进程间的通信,比较复杂且效率低。
- Linux内核设计
- · 基于单内核
- 具备微内核的一些特征:模块化设计、抢占式内核、支持内核线程、动态装载内核模块。
- 规避微内核设计上的性能缺陷:让所有事情运行在内核态,直接调用函数,无需消息传递。
- Linux内核特征
- - 支持动态加载内核模块
- 支持对称多处理(SMP)
- 内核可以抢占(preemptive),允许内核运行的任务有优先执行的能力
- 不区分线程和进程
5. Linux内核版本
Linux内核有两种:稳定的(具有工业级的强度,可以广泛应用和部署)、处于开发中的。
Linux命名机制(可用于区分稳定的和处于开发中的内核):
如果版本号是偶数,则内核是稳定版;如果是奇数,内核就是开发版。
第二章 从内核出发
一、获取内核源码
1. Git
git实际上是一种开源的分布式版本控制工具。 Linux作为一个开源的内核,其源代码也可以用git下载和管理
- 获取最新提交到版本树的一个副本
- $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
- 下载代码后,更新自己的分支到最新分支
- $ git pull
2.安装内核源代码
压缩形式为bzip2:$ tar xvjf linux-x.y.z.tar.bz2
压缩形式为zip:$ tar xvzf linux-x.y.z.tar.gz
关于参数:
-x 解开.tar格式的文件
-v 显示详细信息
-j 使用bzip2程序
-z 使用gzip程序
-f 使用归档文件
3. 使用补丁
从内部源码树开始,运行$ patch -p1 < ../patch-x,y,z
二、内核源码结构

三、编译内核
3.1 配置内核
配置项的二选一和三选一:
二选一:yes 或者 no
三选一:yes 或者 no 或者 module(module意味着该配置被选定了,以模块生成。驱动程序一般都用三选一的配置项)
字符页面的命令行工具:
make config
图形界面工具:
make menuconfig
基于默认配置为体系结构创建一个配置:
make defconfig
验证和更新配置:
make oldconfig
3.2 编译内核
编译内核:
make
重定向到该文件中:
make > .. /detritus
把无用的输出信息重定向到永无返回值的黑洞中:
make > /dev/null
3.3 安装新内核
将所有已编译的模块安装到正确的主目录/lib/modules下
make modules_install
四、内核开发特点
1. 无libc库/标准头文件
原因:(速度与大小)保证内核高效和简练。
内核源代码文件不能包含外部头文件。
基本头文件:内核源代码顶级目录下的include中
体系结构相关头文件:内核源代码树的arch/<architecture>/include/asm目录下
printk()函数:把格式化好的字符串拷贝到内核日志缓冲区上,syslog程序可以通过读取该缓冲区来获取内核信息。
2. 必须使用GNU C
什么是GNU?GNU是一种操作系统,GNU提供的C编译器就是我们之前使用的gcc。
(1)内联函数
static inline void wolf(unsigned long tail_size);
- static:关键字
- inline:用于限定关键字
内联函数:编译时在它被调用的地方展开。
优点:减少了函数调用的开销,性能较好。
缺点:频繁的使用内联函数也会使代码变长,从而在运行时占用更多的内存。
定义内联函数特点:时间要求高,本身长度较短的函数。
使用之前就要定义好内联函数,一般在头文件中定义。
为了类型安全和易读性,优先使用内联函数而不是复杂的宏。
(2)内联汇编
unsigned int low, high;
asm volatile("rdtsc" : "=a" (low), "=d" (high));
/* low 和 high 分别包含64位时间戳的低32位和高32位 */
- asm:嵌入汇编代码
- volatile:不优化
汇编语言用于偏近底层或对执行时间严格要求的地方。
(3)分支声明
/* 如果error在绝大多数情况下为0(假) */
if (unlikely(error)) {
/* ... */
}
/* 如果success在绝大多数情况下不为0(真) */
if (likely(success)) {
/* ... */
}
对于条件选择语句,在一个条件经常/很少出现时,编译器可通过gcc内建的一条指令对条件分支选择进行优化。
内核把这条指令封装成了宏。
3. 没有内存保护机制
内核自己非法访问内存的风险
内核中的内存都不分页:每用掉一个字节,物理内存都减少一个
4. 难以执行浮点运算
使用浮点数时,需要人工保存和恢复浮点寄存器及其他一些繁琐的操作。
不建议使用
5. 每个进程只有一个很小的定长堆栈
内核栈的大小是编译内核时决定的,对于不用的体系结构,内核栈的大小不一样,但都是固定的。(不像用户空间的栈可以动态增长)
6. 必须时刻注意同步和并发
原因:
Linux是抢占多任务操作系统
内核支持对称多处理器系统(SMP)
中断异步到来
内核可以抢占
常用解决方法:自旋锁和信号量
7. 考虑可移植性的重要性
需要保持的特点:大部分C语言代码与体系结构无关。
Linux第一二章笔记的更多相关文章
- 《Linux内核设计与实现》第一二章笔记
第一章 linux内核简介 每个处理器在任何时间点上的活动必然概括为下列三者: 运行于用户空间,执行用户进程 运行于内核空间,处于进程上下文,代表某个特定的进程执行 运行于内核空间,处于中断上下文,与 ...
- 《Linux内核设计与实现》 第一二章学习笔记
<Linux内核设计与实现> 第一二章学习笔记 第一章 Linux内核简介 1.1 Unix的历史 Unix的特点 Unix很简洁,所提供的系统调用都有很明确的设计目的. Unix中一切皆 ...
- 《Linux内核设计与实现》第一二章读书笔记
第一章 Linux内核简介 1.Unix简介 (一)概念:支持抢占式多任务.多进程.虚拟内存.换页.动态链接和TCP/IP网络的现代化操作系统. (二)Unix特点(层次化结构): Unix很简洁,仅 ...
- Linux内核分析第一二章读书笔记
linux读书笔记(1,2章) 标签(空格分隔): 20135328陈都 第一章 Linux内核简介 Unix的历史 Unix 虽然已经使用了40年,但计算机科学家仍然认为它是现存操作系统中最强大和最 ...
- linux 第三周读书笔记-----第一二章 20135334赵阳林
第一章 Linux内核简介 1.1 Unix的历史 由于Unix系统设计简洁并且在发布时提供源代码,所以许多其他组织和团体都对它进了进一步的开发. Unⅸ虽然已经使用了40年,但计算机科学家仍然认为它 ...
- linux内核设计与实现一书阅读整理 之第一二章整合
第一章:Linux内核简介 一.Unix和linux Unix是一个强大.健壮和稳定的操作系统. 1.Unix内核特点 十分简洁:仅提供几百个系统调用并且有明确的目的: 在Unix中,大部分东西都被( ...
- 《HALCON数字图像处理》第一、二章笔记
目录 第一章 绪论 1.1 图像和图像处理 1.1.1 图像 1.1.2 数字图像 1.1.3 图像处理及其发展过程 1.2 数字图像处理的步骤和方法 1.3 数字图像处理系统的硬件组成 1.4 数字 ...
- linux内核第一二章总结
1 Linux内核简介 1 Unix的历史 1.Unix演化版实现了任务管理.换页机制.TCP/IP等新的特性. 2.Unix的特点: Unix很简洁,仅仅提供几百个系统调用并且有一个非常明确的设计目 ...
- 《java编程思想(第四版)》第一二章学习笔记
目录 一.Introduction 1.抽象过程 2.面向对象语言(包括Java)的五个基本特性 3.每个对象都提供服务 4.public.private.protected三者的区别 5.Java的 ...
随机推荐
- H.264编码格式简单分析
H.264的重要性不再提了.本文主要记录一下H.264的编码格式.H.264官方文档:https://github.com/jiayayao/DataSheet/tree/master/encode- ...
- python中安装第三方模块
Python有两个封装了setuptools的包管理工具:easy_install和pip.目前官方推荐使用pip. 现在,让我们来安装一个第三方库——Python Imaging Library,这 ...
- #leetcode刷题之路34-在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置.你的算法时间复杂度必须是 O(log n) 级别.如果数组中不存在目标值,返回 [-1 ...
- php如何实现统计一个数字在排序数组中出现的次数(代码)
统计一个数字在排序数组中出现的次数. 博客 www.51msk.cn 1.有序的数组查找,使用二分法2.二分法查找第一次出现的位置,二分法查找最后一次出现的位置,end - start +1 left ...
- hadoop体系架构
1.1 Hadoop 概念:hadoop是一个由Apache基金会所开发的分布式系统基础架构.是根据google发表的GFS(Google File System)论文产生过来的. ...
- go学习笔记-环境安装
环境安装 环境安装 主要包含三个部分 运行环境及开发sdk 系统环境和路径配置 IDE配置 以mac环境为例,其他环境类似 运行环境及开发sdk 使用 brew 安装 brew install go ...
- WPF触控方面的技术点
一.基本的触控事件(原始触控) 二.复杂触控事件(操作)
- JavaWeb基础—HttpServletRequest
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中, 通过这个对象提供的方法,可以获得客户端请求的所有信息. ...
- JavaScript总结(八)
表单验证 表单验证是JavaScript最常用.最有用的功能之一.在表单内容提交之前进行验证,可以降低服务器处理器的压力,缩短用户等待的时间.表单校验中第一个要考虑的问题是:什么时候捕获表单的录入错误 ...
- 有哪些 Bootstrap 的学习案例?
bootstrap经典实用案例 bootstrap经典实用案例(非常详细),从菜鸟到高手的过程是艰辛的,你渴望救助.这本教程就是你无言的助手,默默的帮你到永远. 带奋斗一起飞翔,因为有了它,让我拥有理 ...