转载自蜗窝科技

Linux内核的整体架构​www.wowotech.net

作者:wowo发布于:2014-2-21 13:23 分类:Linux内核分析


0. 转载者说在前面的话

转载目的:

  • 能够让更多的小伙伴发现优质的文章
  • 对原文进行重新排版梳理替换,让文章更优质
  • 本人目前还没能力总结出这样的文章,因此先转载一些自认为优质的文章,供大家享用。等我有所感悟之后,总结出更清晰明了的文章,供大家学习交流,共同进步。

友情提示:

如果大家是我这样的小白的话,这一系列对内核中设备模型的结构体的分析,及其之间千丝万缕的联系以及内核概念等关键点会比较难理解,不要阅读一次就妄想掌握。

巨幅拼图:

图片转载自

https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.amazon.cn%2Fdp%2FB00A3KHG22&psig=AOvVaw09a9EJ2gzEzmEiMIj_JdEt&ust=1580781614371000&source=images&cd=vfe&ved=0CAIQjRxqFwoTCIitz8-ktOcCFQAAAAAdAAAAABAD​www.google.com

愚认为内核架构的学习可以类似巨幅拼图,不要因为拼凑出局部图案就沾沾自喜,局部图案是微不足道的。“局部图案”之间的多次比对,互相组合,才可以真正定位“局部图案”,才可以对内核架构有比较清晰的理解。

以上为个人愚见,仅供参考!!!

封面图转载自

https://makelinux.github.io/kernel/map/​makelinux.github.io


1. 前言

本文是“Linux内核分析”系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统。之后,会介绍Linux内核源文件的目录结构,并和各个软件子系统对应。

注:本文和其它的“Linux内核分析”文章都基于如下约定:

  • 内核版本为Linux 3.10.29(该版本是一个long term的版本,会被Linux社区持续维护至少2年),可以从下面的链接获取:https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.10.29.tar.xz
  • 鉴于嵌入式系统大多使用ARM处理器,因此涉及到体系结构部分的内容,都以ARM为分析对象

转载者注:2.6、4.x、5.x版本的源代码基本都可以,没必要拘泥于作者的代码版本。

2. Linux内核的核心功能

如下图所示,Linux内核只是Linux操作系统一部分。对下,它管理系统的所有硬件设备;对上,它通过系统调用,向Library Routine(例如C库)或者其它应用程序提供接口。

因此,其核心功能就是:管理硬件设备,供应用程序使用。而现代计算机(无论是PC还是嵌入式系统)的标准组成,就是CPU、Memory(内存和外存)、输入输出设备、网络设备和其它的外围设备。所以为了管理这些设备,Linux内核提出了如下的架构。

3. Linux内核的整体架构

3.1 整体架构和子系统划分

上图说明了Linux内核的整体架构。根据内核的核心功能,Linux内核提出了5个子系统,分别负责如下的功能:

  1. Process Scheduler也称作进程管理、进程调度。负责管理CPU资源,以便让各个进程可以以尽量公平的方式访问CPU。
  2. Memory Manager,内存管理。负责管理Memory(内存)资源,以便让各个进程可以安全地共享机器的内存资源。另外,内存管理会提供虚拟内存的机制,该机制可以让进程使用多于系统可用Memory的内存,不用的内存会通过文件系统保存在外部非易失存储器中,需要使用的时候,再取回到内存中。
  3. VFS(Virtual File System),虚拟文件系统。Linux内核将不同功能的外部设备,例如Disk设备(硬盘、磁盘、NAND Flash、Nor Flash等)、输入输出设备、显示设备等等,抽象为可以通过统一的文件操作接口(open、close、read、write等)来访问。这就是Linux系统“一切皆是文件”的体现(其实Linux做的并不彻底,因为CPU、内存、网络等还不是文件,如果真的需要一切皆是文件,还得看贝尔实验室正在开发的"Plan 9”的)。
  4. Network,网络子系统。负责管理系统的网络设备,并实现多种多样的网络标准。
  5. IPC(Inter-Process Communication),进程间通信。IPC不管理任何的硬件,它主要负责Linux系统中进程之间的通信。

3.2 进程调度(Process Scheduler)

进程调度是Linux内核中最重要的子系统,它主要提供对CPU的访问控制。因为在计算机中,CPU资源是有限的,而众多的应用程序都要使用CPU资源,所以需要“进程调度子系统”对CPU进行调度管理。

进程调度子系统包括4个子模块(见下图),它们的功能如下:

  1. Scheduling Policy实现进程调度的策略,它决定哪个(或哪几个)进程将拥有CPU。
  2. Architecture-specific Schedulers体系结构相关的部分,用于将对不同CPU的控制,抽象为统一的接口。这些控制主要在suspend和resume进程时使用,牵涉到CPU的寄存器访问、汇编指令操作等。
  3. Architecture-independent Scheduler体系结构无关的部分。它会和“Scheduling Policy模块”沟通,决定接下来要执行哪个进程,然后通过“Architecture-specific Schedulers模块”resume指定的进程。
  4. System Call Interface,系统调用接口。进程调度子系统通过系统调用接口,将需要提供给用户空间的接口开放出去,同时屏蔽掉不需要用户空间程序关心的细节。

3.3 内存管理(Memory Manager, MM)

内存管理同样是Linux内核中最重要的子系统,它主要提供对内存资源的访问控制。Linux系统会在硬件物理内存和进程所使用的内存(称作虚拟内存)之间建立一种映射关系,这种映射是以进程为单位,因而不同的进程可以使用相同的虚拟内存,而这些相同的虚拟内存,可以映射到不同的物理内存上。

内存管理子系统包括3个子模块(见下图),它们的功能如下:

  1. Architecture Specific Managers,体系结构相关部分。提供用于访问硬件Memory的虚拟接口。
  2. Architecture Independent Manager,体系结构无关部分。提供所有的内存管理机制,包括:以进程为单位的memory mapping;虚拟内存的Swapping。
  3. System Call Interface,系统调用接口。通过该接口,向用户空间程序应用程序提供内存的分配、释放,文件的map等功能。

3.4 虚拟文件系统(Virtual Filesystem, VFS)

传统意义上的文件系统,是一种存储和组织计算机数据的方法。它用易懂、人性化的方法(文件和目录结构),抽象计算机磁盘、硬盘等设备上冰冷的数据块,从而使对它们的查找和访问变得容易。因而文件系统的实质,就是“存储和组织数据的方法”,文件系统的表现形式,就是“从某个设备中读取数据和向某个设备写入数据”。

随着计算机技术的进步,存储和组织数据的方法也是在不断进步的,从而导致有多种类型的文件系统,例如FAT、FAT32、NTFS、EXT2、EXT3等等。而为了兼容,操作系统或者内核,要以相同的表现形式,同时支持多种类型的文件系统,这就延伸出了虚拟文件系统(VFS)的概念。VFS的功能就是管理各种各样的文件系统,屏蔽它们的差异,以统一的方式,为用户程序提供访问文件的接口。

我们可以从磁盘、硬盘、NAND Flash等设备中读取或写入数据,因而最初的文件系统都是构建在这些设备之上的。这个概念也可以推广到其它的硬件设备,例如内存、显示器(LCD)、键盘、串口等等。我们对硬件设备的访问控制,也可以归纳为读取或者写入数据,因而可以用统一的文件操作接口访问。Linux内核就是这样做的,除了传统的磁盘文件系统之外,它还抽象出了设备文件系统、内存文件系统等等。这些逻辑,都是由VFS子系统实现。

VFS子系统包括6个子模块(见下图),它们的功能如下:

  1. Device Drivers,设备驱动,用于控制所有的外部设备及控制器。由于存在大量不能相互兼容的硬件设备(特别是嵌入式产品),所以也有非常多的设备驱动。因此,Linux内核中将近一半的Source Code都是设备驱动,大多数的Linux底层工程师(特别是国内的企业)都是在编写或者维护设备驱动,而无暇估计其它内容(它们恰恰是Linux内核的精髓所在)。
  2. Device Independent Interface, 该模块定义了描述硬件设备的统一方式(统一设备模型),所有的设备驱动都遵守这个定义,可以降低开发的难度。同时可以用一致的形势向上提供接口。
  3. Logical Systems,每一种文件系统,都会对应一个Logical System(逻辑文件系统),它会实现具体的文件系统逻辑。
  4. System Independent Interface,该模块负责以统一的接口(快设备和字符设备)表示硬件设备和逻辑文件系统,这样上层软件就不再关心具体的硬件形态了。
  5. System Call Interface,系统调用接口,向用户空间提供访问文件系统和硬件设备的统一的接口。

3.5 网络子系统(Net)

网络子系统在Linux内核中主要负责管理各种网络设备,并实现各种网络协议栈,最终实现通过网络连接其它系统的功能。在Linux内核中,网络子系统几乎是自成体系,它包括5个子模块(见下图),它们的功能如下:

  1. Network Device Drivers,网络设备的驱动,和VFS子系统中的设备驱动是一样的。
  2. Device Independent Interface,和VFS子系统中的是一样的。
  3. Network Protocols,实现各种网络传输协议,例如IP, TCP, UDP等等。
  4. Protocol Independent Interface,屏蔽不同的硬件设备和网络协议,以相同的格式提供接口(socket)。
  5. System Call interface,系统调用接口,向用户空间提供访问网络设备的统一的接口。

至于IPC子系统,由于功能比较单纯,这里就不再描述了。

4. Linux内核源代码的目录结构

Linux内核源代码包括三个主要部分:

  1. 内核核心代码,包括第3章所描述的各个子系统和子模块,以及其它的支撑子系统,例如电源管理、Linux初始化等
  2. 其它非核心代码,例如库文件(因为Linux内核是一个自包含的内核,即内核不依赖其它的任何软件,自己就可以编译通过)、固件集合、KVM(虚拟机技术)等
  3. 编译脚本、配置文件、帮助文档、版权说明等辅助性文件

下图示使用ls命令看到的内核源代码的顶层目录结构,具体描述如下。

  • include, 内核头文件,需要提供给外部模块(例如用户空间代码)使用。
  • kernel, Linux内核的核心代码,包含了3.2小节所描述的进程调度子系统,以及和进程调度相关的模块。
  • mm,内存管理子系统。
  • fs, VFS子系统。
  • net,不包括网络设备驱动的网络子系统。
  • ipc, IPC(进程间通信)子系统。
  • arch,体系结构相关的代码,例如arm, x86等等。
    arch//mach,具体的machine/board相关的代码。
    arch//include/asm , 体系结构相关的头文件。
    arch//boot/dts ,设备树(Device Tree)文件。
  • init,Linux系统启动初始化相关的代码。
  • block, 提供块设备的层次
  • sound,音频相关的驱动及子系统,可以看作“音频子系统”。
  • drivers, 设备驱动(在Linux kernel 3.10中,设备驱动占了49.4的代码量)。
  • lib, 实现需要在内核中使用的库函数,例如CRC、FIFO、list、MD5等。
  • crypto, 加密、解密相关的库函数。
  • security, 提供安全特性(SELinux)。
  • virt, 提供虚拟机技术(KVM等)的支持。
  • usr, 用于生成initramfs的代码。
  • firmware, 保存用于驱动第三方设备的固件。
  • samples, 一些示例代码。
  • tools, 一些常用工具,如性能剖析、自测试等。
  • Kconfig, Kbuild, Makefile, scripts, 用于内核编译的配置文件、脚本等。
  • COPYING, 版权声明。MAINTAINERS ,维护者名单。CREDITS, Linux主要的贡献者名单。REPORTING-BUGS, Bug上报的指南。
  • Documentation, README, 帮助、说明文档。

5. 附录

第3章各个子系统的架构图,拷贝自如下的网页:http://oss.org.cn/ossdocs/linux/kernel/a1/index.html


欢迎大家关注我的微信公众号——小白仓库 原创经验资料分享:包含但不仅限于FPGA、ARM、RISC-V、Linux、LabVIEW等软硬件开发,另外分享生活中的趣事以及感悟。目的是建立一个平台记录学习过的知识,并分享出来自认为有用的与感兴趣的道友相互交流进步。

linux 哪个进程在使用串口_Linux内核的整体架构相关推荐

  1. 蜗蜗 Linux内核芬妮下,Linux内核的整体架构

    作者:蜗蜗 发布于:2014-2-21 13:23 分类:Linux内核分析 1. 前言 本文是"Linux内核分析"系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内 ...

  2. Linux内核的整体架构介绍

    1. 前言 本文是"Linux内核分析"系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统.之后,会介绍Linux内核源文件的 ...

  3. 一文看懂Linux内核的整体架构

    1. 前言 本文是"Linux内核分析"系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统.之后,会介绍Linux内核源文件的 ...

  4. 【Linux】Linux内核的整体架构简介

    文章目录 0.前言 1.Linux 内核的核心功能 2.Linux内核的整体架构 3.Linux源代码目录结构 参考 0.前言 本文是笔者学习Linux系统的记录性文章故引用和参考较多,参考文章见文末 ...

  5. linux c++ 获取当前时间毫秒_Linux内核中的形形色色的“钟表”,你了解多少?

    如果Linux也是一个普通人的话,那么她的手腕上应该有十几块手表,包括:CLOCK_REALTIME.CLOCK_MONOTONIC.CLOCK_PROCESS_CPUTIME_ID.CLOCK_TH ...

  6. c主线程如何等待子线程结束 linux_使用互斥量进行同步 - Linux C进程与多线程入门_Linux编程_Linux公社-Linux系统门户网站...

    互斥 简单地理解就是,一个线程进入工作区后,如果有其他线程想要进入工作区,它就会进入等待状态,要等待工作区内的线程结束后才可以进入. 基本函数 (1) pthread_mutex_init函数 原型: ...

  7. Linux内核功能及架构

    简介   Linux内核的作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址.Linux进程采用层次结构,每个进程都依赖于一个父进程.内核启动 init 程序作为第 ...

  8. linux 编程 调度,Linux的进程线程及调度

    搜索热词 本文为宋宝华<Linux的进程.线程以及调度>学习笔记. 1 进程概念 1.1 进程与线程的定义 操作系统中的经典定义: 进程:资源分配单位. 线程:调度单位. 操作系统中用PC ...

  9. Linux设备驱动开发详解【三】_Linux 内核及内核编程

    本文简介 由于 Linux 驱动编程本质属于 Linux 内核编程,因此有必要掌握 Linux 内核及内核编程的基础知识.         3.1-3.2 节讲解 Linux 内核的演变及 Linux ...

最新文章

  1. CTF-PWN环境搭建
  2. ecshop 2.7.x 去版权 lengze.com
  3. C++ Multisets
  4. (转)程序员的十层楼11层(上帝)
  5. 云上自动化 vs 云上编排
  6. 记一次工作中的小坑(关于celery)
  7. Windows解除网速限制,Windows性能提升,性能优化
  8. (转)当你惊讶于才的胜利 它早已“入侵”投资界
  9. 编写c#程序,修改文件后缀名
  10. 20201022-成信大-C语言程序设计-20201学期《C语言程序设计B》C-trainingExercises15
  11. c语言怎么让程序停止3秒,c语言暂停语句1秒
  12. 微信拍一拍怎么撤回(无法撤回原因是这样的)
  13. 阿里巴巴给我们的启示--个人评论
  14. Discuz论坛升级攻略及踩坑处理
  15. linux添加五笔输入法,在Ubuntu16.04中为fctix小企鹅增加五笔输入法
  16. 使用poi将数据库数据表中的数据导出成excel
  17. 外贸怎么找客户之土耳其进出口海关数据
  18. 参加全国大学生智能汽车竞赛,快来申请沁恒RISC-V MCU!
  19. 双精度浮点数的输入输出
  20. OpenGLES---点精灵

热门文章

  1. ARM 之十二 Cortex-M 内核异常处理、异常定位方法、在线调试、Keil MDK-ARM 的使用
  2. 临时变量不能作为非const引用
  3. C++ 重载机制实现原理
  4. mysql的二级分区_分布式数据库一级分区和二级分区
  5. 手机内置摄像头接线图解_苹果手机,二手价格如何?
  6. 电压3.3V的ESD静电保护器件型号大全
  7. oracle备库重启后失去连接,关于dataguard备库宕机后重启后的问题
  8. html 抓取 post 请求,javascript – 获取HTML Form Post方法的返回值
  9. wps右键新建里面没有word和excel_wps常用的基本操作方法
  10. node+Mysql,数据库时区显示正确,查询时却显示另一个时区