linux内核设计与实现一书阅读整理 之第一二章整合
第一章:Linux内核简介
一、Unix和linux
Unix是一个强大、健壮和稳定的操作系统。
1.Unix内核特点
- 十分简洁:仅提供几百个系统调用并且有明确的目的;
- 在Unix中,大部分东西都被(或者正致力于)被当做文件对待;
- Unix内核即相关系统工具软件都是用C语言编写的,这使得系统有着强大的可移植性;
- Unix进程创建非常迅速,目标在于一次执行保质保量地完成一个任务
2.Linux与Unix异同
- Linux是基于Unix的类系统,比如它也实现了Unix的API;
- 但它不同于Unix,没有利用Unix内核源代码;
- Linux是非商业的产品,任何人都可以参与到它的开发中
- Unix内核与Linux内核的比较
- Unix内核是一个不可分割的静态可执行库,通常需要硬件系统提供页机制(MMU)以管理内存;
- Linux支持动态加载内核模块,并且是可抢占的。
.Linux系统的基础是内核、C库以及工具集和系统的基本工具。
二、操作系统和内核简介
操作系统是指在整个系统中负责完成最基本功能和系统管理的那些部分。
- 内核
- 设备驱动程序
- 启动引导程序
- 命令行shell或者其他种类的用户界面
- 基本的文件管理工具和系统工具
内核独立于普通应用程序,一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限。
这种系统态和被保护起来的内存空间,统称为内核空间。
在系统中运行的应用程序通过系统调用来与内核通信。
内核分类
- 单内核(比如大多数Unix及Linux)
- 把内核整体上作为一个大的单独的过程来实现,同时运行在一个单独的地址空间上
- 简单,性能高
- 微内核(比如Windows NT)
- 微内核的功能被划分为多个独立的功能,每个过程叫做一个服务器;便于处理内核间通信,还使用了IPC机制;
应用程序完成其工作的基本行为方式是:
应用程序通过系统调用界面陷入内核。
处理器的活动必然其下三者之一:
- 运行于用户空间,执行用户进程
- 运行于内核空间,处于进程上下文,代表某个特定的进程执行
- 运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断
第二章 从内核出发
1.源代码管理
- 使用Git
- Git作为版本控制系统来管理Linux内核源代码;
- 下载并更新最新版本:
- git clone git://[网址]
- 内核源代码一般安装在/usr/src/linux目录下,这个源码树并不能用于开发
- 源代码树
- 有很多目录值得被注意:
- arch:特定体系结构的源代码;
- include:内核头文件;
- kernel:像调度程序这样的核心子系统。
2、内核源码树


3.编译内核
- 目的:将自己需要的功能编译进内核
- 步骤:
- 配置内核
- 前提:可以配置的各种变量都以CONFIG_前缀表示。有二选一(yes or no)和三选一(还有一个选项是module,即选定该配置项但编译的时候以模块形式生成); 【我个人的理解就是,对类似于驱动程序这样需要模块化也就是较为独立地完成功能而不一定随时都要开启的程序代码需要此选项】
- 方式:
- make config【这个在做实验的时候遇到过,应该属于那种傻瓜似的逐一遍历(适用于系统比较简单的情况)】
- make menuconfig
- make gconfig
- 后续:
- 配置选项CONFIGIKCONFIGPROC把完整的压缩的配置文件放在/proc/config.gz下面,这样编译新的内核的时候就可以直接拷贝使用了
- 衍生多个编译作业
- 一般每个处理器都会衍生1——2个作业,改善处理器的利用率
- make -j32 > /dev/null【以16核处理器为例】
- 安装新内核
- 以root身份运行 make modules_install即可
- 所有已编译的模块都会安装到lib/modules下
- 内核开发时既不能访问C库也不能访问标准的C头文件
应对:include/linux文件夹中包含了所需的内核头文件。 - 内核编程时必须使用GNU C
4.内核开发的特点
内联函数:
函数会在所调用的位置上展开。
定义时,需要使用static作为关键字,用inline限定它。
内联函数必须在使用之前就定义好,一般在头文件中定义。
内核中优先使用内联函数而不是宏。
内联汇编:
通常使用asm()指令嵌入汇编代码,用volatile表示不优化
- 分支声明:
unlikely(x) - x很少出现,绝少发生,通常为假
likely(y) - y经常出现,通常为真 - 内核编程时缺乏像用户空间那样的内存保护机制
内核中内存不分页。 - 内核编程时难以执行浮点运算
- 内核给每个进程只有一个很小的定长堆栈
- 由于内核支持异步中断、抢占和SMP,必须时刻注意同步和并发
SMP:对称多处理系统。
常用的解决竞争的方法:自旋锁和信号量。 - 要考虑可移植性的重要性
诸如保持字节序,64位对其,不假定字长和页面长度等。
总结:这两章内容比较少,还是容易去理解的,因为有娄老师的上学期的教授,各方面就像在复习学过的知识一样。作者也写得很有风趣,有种比较平易近人的感觉。
linux内核设计与实现一书阅读整理 之第一二章整合的更多相关文章
- linux内核设计与实现一书阅读整理 之第三章
chapter 3 进程管理 3.1 进程 进程就是处于执行期的程序. 进程就是正在执行的程序代码的实时结果. 内核调度的对象是线程而并非进程. 在现代操作系统中,进程提供两种虚拟机制: 虚拟处理器 ...
- linux内核设计与实现一书阅读整理 之第五章
CHAPTER 5 系统调用 5.1 与内核通信 系统调用在用户空间进程和硬件设备之间添加了一个中间层,该层主要作用有三个: 为用户空间提供了一种硬件的抽象接口 系统调用保证了系统的稳定和安全 每个进 ...
- linux内核设计与实现一书阅读整理 之第十八章
CHAPTER 18 调试 18.1 准备开始 需要的是准备是: - 一个bug - 一个藏匿bug的内核版本 - 相关内核代码的知识和运气 重点: 想要成功的进行调试,就取决于是否能让这些错误重现. ...
- 《Linux内核设计与实现》CHAPTER17阅读梳理
<Linux内核设计与实现>CHAPTER17阅读梳理 [学习时间:3.5hours] [学习内容:设备类型,模块,内核对象,sysfs] 个人思考部分见[]标出的部分 一.课堂讲解整理& ...
- 《Linux内核设计与实现》CHAPTER4阅读梳理
<Linux内核设计与实现>CHAPTER4阅读梳理 [学习时间:3hours] [学习内容:多任务:进程调度策略:Linux中进程调度的关键问题:抢占] 个人思考部分见[]标出的部分 一 ...
- 《Linux内核设计与实现》CHAPTER18阅读梳理
<Linux内核设计与实现>CHAPTER18阅读梳理 [学习时间:2hours] [学习内容:bug的来源分析:bug调试途径] 一.bug来源 1.内核中的bug 内核中的bug表现得 ...
- 《Linux内核设计与实现》CHAPTER5阅读梳理
<Linux内核设计与实现>CHAPTER5阅读梳理 [学习时间:2.5hours] [学习内容:系统调用的概念.功能及实现:系统调用的创建和使用方法] CHAPTER5 系统调用 1.系 ...
- 《Linux内核设计与实现》第四周读书笔记——第五章
<Linux内核设计与实现>第四周读书笔记--第五章 20135301张忻 估算学习时间:共1.5小时 读书:1.0 代码:0 作业:0 博客:0.5 实际学习时间:共2.0小时 读书:1 ...
- 《Linux内核设计与实现》CHAPTER13阅读梳理
<Linux内核设计与实现>第13章阅读总结 [edited by 5216lwr] 一.虚拟文件系统概述 1.虚拟文件系统 (也称作虚拟文件交换或VF)作为内核子系统,为用户空间程序提供 ...
随机推荐
- 探究linux设备驱动模型之——platform虚拟总线(一)
说在前面的话 : 设备驱动模型系列的文章主要依据的内核版本是2.6.32的,因为我装的Linux系统差不多就是这个版本的(实际上我用的fedora 14的内核版本是2.6.35.13的.) ...
- Java的Graphics类进行绘图的方法详解
Graphics类提供基本绘图方法,Graphics2D类提供更强大的绘图能力. Graphics类提供基本的几何图形绘制方法,主要有:画线段.画矩形.画圆.画带颜色的图形.画椭圆.画圆弧.画多边形等 ...
- this指向问题(箭头函数没有this)
全局环境下,指向windows console.log(this.document === document); // true 函数上下文调用 function f1(){ return this; ...
- html5新特性localStorage和sessionStorage
HTML5 提供了两种在客户端存储数据的新方法: localStorage: (1)它的生命周期是永久的,关闭页面或浏览器之后localStorage中的数据也不会消失. (2)它的容量大小是5M作用 ...
- 【springmvc+mybatis项目实战】杰信商贸-7.生产厂家新增
我们要实现新的功能,就是生产厂家的新增先来回顾一下系统架构图我们数据库这边已经建好表了,接下来要做的就是mapper映射 编辑FactoryMapper.xml文件,加入“添加”的逻辑配置代码块 &l ...
- python-生成器、迭代器、装饰器
目录 动态语言和静态语言 __slots__ 生成器 迭代器 闭包 装饰器 动态语言和静态语言 动态语言可以在运行的过程中修改代码,例如python在运行的过程中给已创建好的类添加属性和方法. 静态语 ...
- OpenLDAP编译安装及配置
原文发表于cu:2016-06-20 参考文档: 原理:http://seanlook.com/2015/01/15/openldap_introduction/ 官方文档: http://www.o ...
- 第一次作业(homework-01)成绩公布
已收到博客名.github名的同学得分列表: 学号后三位 成绩(0-10) 215 8082 0132 5184 5027 7194 9.5157 7074 8195 6222 8158 6128 8 ...
- sprint2 团队贡献分
团队名:在考虑 团队贡献分: 102 杨晶晶:17 106 邹育萍:18 114 纪焓:16 116 黄敏鹏:28 117 郑培轩:26 138 曾昱霖:15 最新项目的github地址: https ...
- Scrum立会报告+燃尽图(十月十九日总第十次):
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2246 项目地址:https://git.coding.net/zhang ...