热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

《Linux内核设计与实现》第一二章读书笔记

第一章Linux内核简介1.Unix简介(一)概念:支持抢占式多任务、多进程、虚拟内存、换页、动态链接和TCPIP网络的现代化操作系统。(二)Unix特点(层次化结构):Unix很简洁,仅提供几百

第一章 Linux内核简介

1.Unix简介

(一)概念:支持抢占式多任务、多进程、虚拟内存、换页、动态链接和TCP/IP网络的现代化操作系统。

(二)Unix特点(层次化结构):

  1. Unix很简洁,仅提供几百个系统调用并有非常明确的设计目的。
  2. 在Unix中,所有东西都当作文件对待,所以对数据和对设备的操作是通过相同的系统调用接口来进行;
  3. 移植能力强,Unix内核和相关系统工具软件是由C语言编成;
  4. 进程创建非常迅速,一次执行保质保量完成一个任务,并有独特的fork()系统调用;
  5. 提供简单有稳定的进程间通信元语,将简单程序方便的组合起来。

2.Linux简介:

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

3.操作系统与内核简介:

1.操作系统:整个系统中负责完成最基本功能和系统管理的部分。

2.内核(操作系统的内在核心,一般处于系统态):
由响应中断的中断服务程序;管理多个进程,分享处理器时间调度程序;管理进程地址空间的内存管理程序;网络、进程间通信等系统服务程序组成。

3.内核空间:系统态和被保护起来的内存空间

4.系统调用:应用程序与内核通信。应用程序通过系统调用界面陷入内核是应用程序完成工作的基本行为方式。

5.内核活动的范围:

(1)运行于用户空间,执行用户进程

(2)运行于内核空间,处于进程上下文,代表某个特定的进程执行

(3)运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断.

6.Unix内核通常需要硬件系统提供页机制(MMU)以管理内存,这样可以加强对内存空间的保护,并可以保证每个进程都运行于不同的虚地址空间上。

7.单内核与微内核比较:

(1)单内核——以单个静态二进制文件形式存放于磁盘中,所有内核服务在一个大内核地址空间上运行。

特点:内核可以直接调用函数,简单并性能高。但一个功能的崩溃会导致整个内核无法使用。

(2)微内核——内核按功能被划分成各个独立的过程。每个过程叫做一个服务器。所有服务器独立并运行在自己的地址空间上。

特点:通过消息传递处理为内核通信,采用进程间通信(IPC)机制。安全。一个服务器失效不会影响其他服务器。内核各个服务之间的调用涉及进程间的通信,比较复杂且效率低。

8.Linux内核总结:

为单内核,但具备微内核的一些特征:模块化设计、抢占式内核、支持内核线程、动态装载内核模块。同时避微内核设计上的性能缺陷:让所有事情运行在内核态,直接调用函数,无需消息传递。支持动态加载内核模块;支持对称多处理(SMP);内核可以抢占(preemptive),允许内核运行的任务有优先执行的能力;不区分线程和进程;提供具有设备类的面向对象的设备模型、热插拔事件,以及用户空间的设备文件系统(sysfs)。

内核版本(稳定的和处于开发中的):

第二章 从内核出发

一、获取内核源码

  1. 使用Git(管理内核源码的分布式控制系统)

    获取最新提交到Linus版本树的一个副本:
    $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

    下载代码后,更新自己的分支到最新分支:$ git pull

2.安装内核源代码

两种形式:GNU zip(gzip)和bzip2【默认和首选形式】。

压缩形式是bzip2,运行:$ tar xvjf linux-x.y.z.tar.bz2

压缩形式是GNU zip,运行:$ tar xvzf linux-x.y.z.tar.gz

参数详解:
-x 解开.tar格式的文件
-v 显示详细信息
-j 使用bzip2程序
-z 使用gzip程序
-f 使用归档文件

3.使用补丁

从内部源码树开始,运行 $ patch -p1 <../patch-x,y,z

二、内核源码结构

三、编译内核

1. 配置内核(关于make与config)

(1)配置形式:CONFIG_FEATURE

(2)配置项:二选一为yes或no,三选一为yes(把代码编译进主内核映像中)、no和module(该配置项被选定,但编译时功能的实现代码以模块的形式生成)。驱动程序一般用三选一。

(3)配置编译过程:

• make config:遍历所有配置项,并让用户选择

• make deconfig:基于默认的配置

• make oldconfig:先将/boot目录下的配置文件写进.config文件中,采用的是注释的形式写进新增加的功能。

• zcat /proc/config.gz > .config:配置选项CONFIG_IKCONFIG_PROC把完整的压缩过的内核配置文件存放在/
proc/config.gz中,再次编译时可以方便地克隆当前的配置。

• make:默认的Makefile自动化编译。

2.减少编译的垃圾信息

(1)将错误报告和警告信息重定向到文件中:$ make > ../detritus

(2)把无用的输出信息重定向到无返回值的/dev/null中:$ make > /dev/null

3.衍生多个编译作业

make程序能把编译过程拆分成多个并行的作业。其中每个作业独立并发地运行,有助于加快多处理器系统上的编译过程,也有利于改善处理器的利用率。默认情况下,make只衍生一个作业。

以多个作业编译内核:$ make –jn(n是要衍生出的作业数)

4.安装新内核

把所有已编译的模块安装到正确的主目录/lib/modules下:% make modules_install

编译时在内核代码树的根目录下创建一个System.map文件(符号对照表),用来将内核符号与它们的起始地址对应起来。

四、内核开发特点

1.无libc库抑或无标准头文件

(1)内核不能链接使用标准C函数库,因为太大且太低效了。

(2)内核源代码文件不能包含外部头文件。

(3)基本头文件位于内核源代码顶级目录下的include中

(4)体系结构相关头文件位于内核源代码树的arch/ /include/asm目录下

(5)printk()函数:把格式化好的字符串拷贝到内核日志缓冲区上,syslog程序可以通过读取该缓冲区来获取内核信息。Printk()允许通过制指定一个标志来设置优先级。

2.GNU C

(1)内联函数

——对时间要求比较高,本身长度比较短的函数
定义内联函数时,需要用static作为关键字,并用inline限定:
static inline void wolf(unsigned long tail_size);

注意:使用之前就要定义好内联函数,一般在头文件中定义。
为了类型安全和易读性,优先使用内联函数而不是复杂的宏。

(2)内联汇编

通常使用asm()嵌入汇编代码:

unsigned  int low, high;
asm volatile("rdtsc" : "=a" (low), "=d" (high));
/* low 和 high 分别包含64位时间戳的低32位和高32位 */

Linux内核混合使用了C语言和汇编语言,在偏近体系结构的底层或对执行时间严格要求的地方使用汇编语言。

(3)分支声明

对于条件选择语句,在一个条件经常/很少出现时,编译器可通过gcc内建的一条指令对条件分支选择进行优化。内核把这条指令封装成了宏。

 if (error) {
/* ... */
}
/* 如果error在绝大多数情况下为0(假) */
if (unlikely(error)) {
/* ... */
}

/* 如果success在绝大多数情况下不为0(真) */
if (likely(success)) {
/* ... */
}

3. 没有内存保护机制

(1)内核发现非法的内存访问会发送SIGSEGV信号并结束整个进程。但自己非法访问内存的风险很大。

(2)内核中的内存都不分页,所以每用掉一个字节,物理内存都减少一个

4. 不要在内核中轻易使用浮点数

若使用浮点数时,需要人工保存和恢复浮点寄存器及其他一些繁琐的操作。

5. 容积小而固定的栈

用户空间的栈可以动态增长。但内核栈的准确大小随体系结构而变,都是固定的。每个进程都有自己的栈。

6.同步和并发

• Linux是抢占多任务操作系统

• 内核支持对称多处理器系统(SMP)

• 中断是异步到来的

• Linux内核可以抢占
常用的解决竞争的办法是自旋锁和信号量

7.可移植性的重要性

Linux是可移植的操作系统,即大部分C代码与体系结构无关。因此,把与体系结构相关的代码从内核代码树的特定目录中适当地分离出来。

五、小结

内核有独一无二的特质,拥有整个系统的最高管理权,是操作系统的核心。书的前两章对内核做了简单的介绍。我认为虽然现在可能对其还不是很了解,但是通过学习应该会获得许多有用的知识。就像书中说的,最重要的是阅读和修改内核源代码,只有通过实际的阅读和实践才会理解内核。而内核源代码又可以免费获取,所以今后的学习一定要多动手多实践,利用起来有用的资源做高效的学习~


推荐阅读
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 突破MIUI14限制,自定义胶囊图标、大图标样式,支持任意APP
    本文介绍了如何突破MIUI14的限制,实现自定义胶囊图标和大图标样式,并支持任意APP。需要一定的动手能力和主题设计师账号权限或者会主题pojie。详细步骤包括应用包名获取、素材制作和封包获取等。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
author-avatar
轰炸籹厕所744
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有