第一章:Linux内核简介

一、Unix和linux

Unix是一个强大、健壮和稳定的操作系统。

1.Unix内核特点

  1. 十分简洁:仅提供几百个系统调用并且有明确的目的;
  2. 在Unix中,大部分东西都被(或者正致力于)被当做文件对待;
  3. Unix内核即相关系统工具软件都是用C语言编写的,这使得系统有着强大的可移植性;
  4. Unix进程创建非常迅速,目标在于一次执行保质保量地完成一个任务

2.Linux与Unix异同

  • Linux是基于Unix的类系统,比如它也实现了Unix的API;
  • 但它不同于Unix,没有利用Unix内核源代码;
  • Linux是非商业的产品,任何人都可以参与到它的开发中
  • Unix内核与Linux内核的比较
  • Unix内核是一个不可分割的静态可执行库,通常需要硬件系统提供页机制(MMU)以管理内存;
  • Linux支持动态加载内核模块,并且是可抢占的。

.Linux系统的基础是内核、C库以及工具集和系统的基本工具。

二、操作系统和内核简介

操作系统是指在整个系统中负责完成最基本功能和系统管理的那些部分。

  • 内核
  • 设备驱动程序
  • 启动引导程序
  • 命令行shell或者其他种类的用户界面
  • 基本的文件管理工具和系统工具

内核独立于普通应用程序,一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限。
这种系统态和被保护起来的内存空间,统称为内核空间。
在系统中运行的应用程序通过系统调用来与内核通信。

内核分类

  1. 单内核(比如大多数Unix及Linux)
  2. 把内核整体上作为一个大的单独的过程来实现,同时运行在一个单独的地址空间上
  3. 简单,性能高
  4. 微内核(比如Windows NT)
  5. 微内核的功能被划分为多个独立的功能,每个过程叫做一个服务器;便于处理内核间通信,还使用了IPC机制;

应用程序完成其工作的基本行为方式是:

应用程序通过系统调用界面陷入内核。

处理器的活动必然其下三者之一:

  • 运行于用户空间,执行用户进程
  • 运行于内核空间,处于进程上下文,代表某个特定的进程执行
  • 运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断

第二章 从内核出发

1.源代码管理

  1. 使用Git
  2. Git作为版本控制系统来管理Linux内核源代码;
  3. 下载并更新最新版本:
  4. git clone git://[网址]
  5. 内核源代码一般安装在/usr/src/linux目录下,这个源码树并不能用于开发
  6. 源代码树
  7. 有很多目录值得被注意:
  8. arch:特定体系结构的源代码;
  9. include:内核头文件;
  10. kernel:像调度程序这样的核心子系统。

2、内核源码树

3.编译内核

  1. 目的:将自己需要的功能编译进内核
  2. 步骤:
  3. 配置内核
  4. 前提:可以配置的各种变量都以CONFIG_前缀表示。有二选一(yes or no)和三选一(还有一个选项是module,即选定该配置项但编译的时候以模块形式生成); 【我个人的理解就是,对类似于驱动程序这样需要模块化也就是较为独立地完成功能而不一定随时都要开启的程序代码需要此选项】
  5. 方式:
  6. make config【这个在做实验的时候遇到过,应该属于那种傻瓜似的逐一遍历(适用于系统比较简单的情况)】
  7. make menuconfig
  8. make gconfig
  9. 后续:
  10. 配置选项CONFIGIKCONFIGPROC把完整的压缩的配置文件放在/proc/config.gz下面,这样编译新的内核的时候就可以直接拷贝使用了
  11. 衍生多个编译作业
  12. 一般每个处理器都会衍生1——2个作业,改善处理器的利用率
  13. make -j32 > /dev/null【以16核处理器为例】
  14. 安装新内核
  15. 以root身份运行 make modules_install即可
  16. 所有已编译的模块都会安装到lib/modules下
  17. 内核开发时既不能访问C库也不能访问标准的C头文件
    应对:include/linux文件夹中包含了所需的内核头文件。
  18. 内核编程时必须使用GNU C

4.内核开发的特点

内联函数:
函数会在所调用的位置上展开。
定义时,需要使用static作为关键字,用inline限定它。
内联函数必须在使用之前就定义好,一般在头文件中定义。
内核中优先使用内联函数而不是宏。

内联汇编:
通常使用asm()指令嵌入汇编代码,用volatile表示不优化

  1. 分支声明:
    unlikely(x) - x很少出现,绝少发生,通常为假
    likely(y) - y经常出现,通常为真
  2. 内核编程时缺乏像用户空间那样的内存保护机制
    内核中内存不分页。
  3. 内核编程时难以执行浮点运算
  4. 内核给每个进程只有一个很小的定长堆栈
  5. 由于内核支持异步中断、抢占和SMP,必须时刻注意同步和并发
    SMP:对称多处理系统。
    常用的解决竞争的方法:自旋锁和信号量。
  6. 要考虑可移植性的重要性
    诸如保持字节序,64位对其,不假定字长和页面长度等。

总结:这两章内容比较少,还是容易去理解的,因为有娄老师的上学期的教授,各方面就像在复习学过的知识一样。作者也写得很有风趣,有种比较平易近人的感觉。

linux内核设计与实现一书阅读整理 之第一二章整合的更多相关文章

  1. linux内核设计与实现一书阅读整理 之第三章

    chapter 3 进程管理 3.1 进程 进程就是处于执行期的程序. 进程就是正在执行的程序代码的实时结果. 内核调度的对象是线程而并非进程. 在现代操作系统中,进程提供两种虚拟机制: 虚拟处理器 ...

  2. linux内核设计与实现一书阅读整理 之第五章

    CHAPTER 5 系统调用 5.1 与内核通信 系统调用在用户空间进程和硬件设备之间添加了一个中间层,该层主要作用有三个: 为用户空间提供了一种硬件的抽象接口 系统调用保证了系统的稳定和安全 每个进 ...

  3. linux内核设计与实现一书阅读整理 之第十八章

    CHAPTER 18 调试 18.1 准备开始 需要的是准备是: - 一个bug - 一个藏匿bug的内核版本 - 相关内核代码的知识和运气 重点: 想要成功的进行调试,就取决于是否能让这些错误重现. ...

  4. 《Linux内核设计与实现》CHAPTER17阅读梳理

    <Linux内核设计与实现>CHAPTER17阅读梳理 [学习时间:3.5hours] [学习内容:设备类型,模块,内核对象,sysfs] 个人思考部分见[]标出的部分 一.课堂讲解整理& ...

  5. 《Linux内核设计与实现》CHAPTER4阅读梳理

    <Linux内核设计与实现>CHAPTER4阅读梳理 [学习时间:3hours] [学习内容:多任务:进程调度策略:Linux中进程调度的关键问题:抢占] 个人思考部分见[]标出的部分 一 ...

  6. 《Linux内核设计与实现》CHAPTER18阅读梳理

    <Linux内核设计与实现>CHAPTER18阅读梳理 [学习时间:2hours] [学习内容:bug的来源分析:bug调试途径] 一.bug来源 1.内核中的bug 内核中的bug表现得 ...

  7. 《Linux内核设计与实现》CHAPTER5阅读梳理

    <Linux内核设计与实现>CHAPTER5阅读梳理 [学习时间:2.5hours] [学习内容:系统调用的概念.功能及实现:系统调用的创建和使用方法] CHAPTER5 系统调用 1.系 ...

  8. 《Linux内核设计与实现》第四周读书笔记——第五章

    <Linux内核设计与实现>第四周读书笔记--第五章 20135301张忻 估算学习时间:共1.5小时 读书:1.0 代码:0 作业:0 博客:0.5 实际学习时间:共2.0小时 读书:1 ...

  9. 《Linux内核设计与实现》CHAPTER13阅读梳理

    <Linux内核设计与实现>第13章阅读总结 [edited by 5216lwr] 一.虚拟文件系统概述 1.虚拟文件系统 (也称作虚拟文件交换或VF)作为内核子系统,为用户空间程序提供 ...

随机推荐

  1. C# VS,连接到oracle 报要升级到8.多少版本的错

    1:确定服务器的oracle版本 2:本地的客户端版本要和服务器一致 3:操作系统位数要一致

  2. 网络基础知识-bps、Bps、pps的区别

    在计算机科学中,bit是表示信息的最小单位,叫做二进制位:一般用0和1表示.Byte叫做字节,由8个位(8bit)组成一个字节(1Byte),用于表示计算机中的一个字符.bit(比特)与Byte(字节 ...

  3. const与readonly常量

    const与readonly常量 const与readonly都是用来定义常量,但是它们有什么区别呢? 下面我们来简要的说明一下: const修饰的常量是编译时常量,如:public const St ...

  4. UTF-8编码下'\u7528\u6237'转换为中文汉字'用户'

    UTF-8编码下'\u7528\u6237'转换为中文'用户' 一.前言 有过多次,在开发项目中遇见设置文件编码格式为UTF-8,但是打开该文件出现类似\u7528这样的数据,看也看不懂,也不是平常见 ...

  5. CDQ分治_占坑

    准备系统地学习一波CDQ分治,持续更新中... 首先,CDQ分治也还是分治的一种,只不过普通分治是独立的解决两个子问题,而CDQ分治还要计算第一个子问题对于第二个的影响. CDQ分治几乎都是用来解决多 ...

  6. Hyperledger中的共识机制

    Hyperledger Consensus 共识过程 Hyperlydger中建立共识的过程由以下两个独立的过程构成: Ordering of transactions (交易排序) Validati ...

  7. Tempter of the Bone HDU 1010(DFS+剪枝)

    Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. However, ...

  8. .net组件和com组件&托管代码和非托管代码

    com组件和.net组件: COM组件是非托管对象,可以不需要.NET框架而直接运行,.NET框架组件是托管对象,必须有.NET框架的支撑才能运行. COM组件有独立的类型库文件,而.NET组件是通过 ...

  9. MyEclipse快捷方式

    选择你要注释的那一行或多行代码,按Ctrl+/即可,取消注释也是选中之后按Ctrl+/即可. 如果你想使用的快捷键的注释是的话,那么你的快捷键是ctrl+shift+/我以前都是手动注释的,直接打// ...

  10. sql高级主题资料(网络复制)

    SQL Server 常用高级语法笔记   自从用了EF后很少写sql和存储过程了,今天需要写个比较复杂的报告,翻出了之前的笔记做参考,感觉这个笔记还是很有用的,因此发出来和大家分享. 1.case. ...