第一章: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. JAVA Date、String、Calendar类型之间的转化

    1.Calendar 转化 String //获取当前时间的具体情况,如年,月,日,week,date,分,秒等 Calendar calendat = Calendar.getInstance(); ...

  2. 4星|《财经》2018年第13期:年轻人大多从大三和大四起开始就从QQ向微信转移

    <财经>2018年第13期 总第530期 旬刊 本期主要话题是快递业,其他我感兴趣的重要话题还有:香港9价HPV疫苗断供风波:华盛顿邮报被贝佐斯收购后这几年的变化:北京二中朝阳学校的划片风 ...

  3. Python20-Day02

    1.数据 数据为什么要分不同的类型 数据是用来表示状态的,不同的状态就应该用不同类型的数据表示: 数据类型 数字(整形,长整形,浮点型,复数),字符串,列表,元组,字典,集合 2.字符串 1.按索引取 ...

  4. 汉诺塔python实现

    下载汉诺塔ppt def move(n,A,B,C): if n == 1: print(A,'->',C) else: move(n-1,A,C,B) print(A,'->',C) m ...

  5. 02慕课网《vue.js2.5入门》——Vue中的组件,实现todolist

    TodoList功能开发 例子:输入字符,在列表中显示: 由于有v-for属性,<li>不会被渲染,它已经和数据绑定在一起,有数据来决定 input和button上都有事件监听器,inpu ...

  6. 线段树---成段更新hdu1698 Just a Hook

    hdu1698 Just a Hook 题意:O(-1) 思路:O(-1) 线段树功能:update:成段替换 (由于只query一次总区间,所以可以直接输出1结点的信息) 题意:给一组棍子染色,不同 ...

  7. 软工网络15团队作业4-DAY2

    每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 昨天已完成的工作. 张陈东芳:查看数据库的连接 吴敏烽:规范商品实体类 周汉麟:研究获取商品信息的方法 林振斌:研究获取商 ...

  8. PAT 甲级 1144 The Missing Number

    https://pintia.cn/problem-sets/994805342720868352/problems/994805343463260160 Given N integers, you ...

  9. jquery中on绑定click事件在苹果手机失效问题解决(巨坑啊)

    描述:用一个div写一个按钮,并给这个按钮添加一个点击事件,在安卓机器上一切正常,但是在苹果机型上会出现点击事件失效. <!DOCTYPE html> <html lang=&quo ...

  10. php缩略图

    /*引入文件Easyphpthumbnail.class.php 引用地址:http://www.itdaodan.com/article-detail-id-252.html */   class ...