第一章: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. javaweb(十四)——JSP原理

    一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...

  2. Java的Graphics类进行绘图的方法详解

    Graphics类提供基本绘图方法,Graphics2D类提供更强大的绘图能力. Graphics类提供基本的几何图形绘制方法,主要有:画线段.画矩形.画圆.画带颜色的图形.画椭圆.画圆弧.画多边形等 ...

  3. 180719-Quick-Task 动态脚本支持框架之使用介绍篇

    文章链接:https://liuyueyi.github.io/hexblog/2018/07/19/180719-Quick-Task-动态脚本支持框架之使用介绍篇/ Quick-Task 动态脚本 ...

  4. Jmeter接口测试(三)接口测试实践

    Jmeter 脚本编写一般分五个步骤: 1. 添加线程组 2. 添加 http 请求 3. 在 http 请求中写入接入 url.路径.请求方式和参数 4. 添加查看结果树 5. 调用接口.查看返回值 ...

  5. Jmeter直连postgresql数据库进行压测

    关于Jmeter直连数据库进行压测,网上有好多教程了,pg数据库的相对少一些,今天自己测试了下,还是挺简单的,有个别需要注意的地方.相较于Loadrunner这么全面庞大的压测工具,Jmeter在数据 ...

  6. Java EE JavaBean组件

    一.简介 JavaBean组件是一些可移植.可重用并可组装到应用程序中的Java类,类必须是具体的和公共的. 符合下列设计规则的任何Java类均是以JavaBean: 1.对数据类型“protype” ...

  7. 美国末日AI System设计分享

    引言 好久没有写博客了,这半年在游戏公司工作,过得比较充实,每天不是add feature就是debug,所以忽视了写博客.今天发一篇关于AI博客. 主要是最近看了一些关于"The Last ...

  8. CentOS7使用阿里源安装最新版Docker

    卸载已经安装的Docker sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker ...

  9. 1035 Password (20 分)(字符串)

    注意下单复数 #include<bits/stdc++.h> using namespace std; pair<string,string>pa; int main() { ...

  10. Centos7下安装Oracle11g r2

    我的centos7是在virtualbox下安装的,安装Oracle安装了好久好久,最开始的时候在网上找的两个文章,按照步骤装,有一篇写着装的时候有灰色的竖线,直接按space键或者鼠标右键close ...