Linux内核体系结构简析

1.Linux内核

        

1.1 Linux内核的任务

  1. 从技术层面讲,内核是硬件和软件之间的一个中间层,作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。
  2. 从应用程序的角度讲,应用程序与硬件没有联系,只与内核有联系,内核是应用程序知道的层次中的最底层。在实际工作中内核抽象出了相关的细节。
  3. 从资源管理的角度讲,内核是一个资源管理程序。负责将可用的共享资源(如CPU时间,磁盘空间,网络连接等)分配到各个系统进程。
  4. 从系统层面将,内核相当于是一个库,提供了一组面向系统的命令。系统调用相对于应用程序来说,就像调用普通函数一样。

1.2 Linux系统层次结构

                       

  1. Linux系统结构中位于最上层的是用户(或应用程序)空间。这是用户应用程序执行的地方。用户空间之下的是内核空间,Linux内核正是位于此。
            1)GNU C Library(glibc)也在此。提供了 连接内核的系统调用接口,还提供了在用户空间应用程序和内核之间进行转换的机制
            2)内核和用户空间的应用程序使用的是不同的保护地址空间。每个用户空间的进程都使用自己的虚拟地址空间(进程是资源分配的独立单位),而内核则占用单独的地址空间。
  2. Linux内核可进一步分为3层,最上面的是系统调用接口,它实现了一些基本功能,例如:read,write。系统调用接口之下是内核代码,可以更加精确地定义为独立于体系机构的内核代码(Linux所支持的所有处理器体系结构所通用的)。在这些代码之下是依赖于体系结构的代码,构成了BSP(Board Support Package)的部分——是嵌入式系统开发中的核心组件,充当硬件与操作系统之间的桥梁。它提供底层硬件驱动、配置及接口。
  3. 内核被划分为多个子系统。Linux也可以看作是一个整体,因为它会将所有这些基本服务都集成在内核中。这与微内核的体系结构不同,后者会提供一些基本的服务,例如通信,I/O,内存和进程管理等

2. Linux内核体系结构

       Linux内核的主要组件是:系统调用接口,进程管理,内存管理,虚拟文件系统,网络堆栈,设备驱动程序,硬件架构的相关代码。

2.1 系统调用接口(SCI,system call interface)

       该层提供了某些机制执行从用户空间到内核的函数调用。该接口依赖于体系结构,甚至在相同的处理器族内也是如此。SCI层实际是一个非常有用的函数调用多路复用和多路分解服务。

2.2 进程管理(PM, process management)

  1. 进程管理的重点是进程的执行。在Linux并不区分线程和进程,代表了单独的处理器虚拟化(线程代码、数据、堆栈和CPU寄存器)。内核通过SCI提供了一个应用程序编程接口(API)来创建一个新进程(fork, exec 或 Portable Operating System Interface),停止进程(kill, exit)。并在它们之间进行通信和同步(signal)
  2. 进程管理还包括处理活动进程之间共享CPU的需求。内核实现了一种新型的调度算法,不管有多少个线程正在竞争CPU,这种算法都可以在固定时间内进行操作——O(1)调度程序,这个名字就表示它调度多个线程所使用的时间和调度一个线程所使用的时间是相同的。同样也可以支持多处理器。

2.3 内存管理(MM, memory management)

       内核所管理的另外一个重要资源是内存。内存是按照所谓的内存页方式进行管理的(大部分体系来说都是 4KB)。Linux包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。Linux的内存管理不止4KB缓冲区,而是对4KB缓冲区提供一种抽象,如 Slab分配器 ——通过​​分层管理​​(伙伴系统 + Slab)和​​对象重用​​,高效解决了小内存块的分配问题。这种内存管理的方式使用4KB缓冲区为基数,然后从中分配结构并跟踪内存页使用情况。这样就允许根据系统需要来动态调整内存使用 (页面交换算法)

2.4 虚拟文件系统(VFS,virtual file system)

       虚拟文件系统是Linux内核中文件系统的通用的接口抽象。VFS在SCI和内核所支持的文件系统之间提供了一个交换层

2.5 网络堆栈

网络堆栈在设计上遵循模拟协议本身的分层体系结构,如IP协议是传输协议TCP下面的核心网络层协议。TCP之上的协议是 socket层,通过SCI进行调用,socket层网络子系统的标准API,它为各种网络协议提供了一个用户接口。从原始帧访问到IP协议数据单元(PDU),再到UDP,socket层提供了一种标准化的方式进行管理连接,并在各个终点之间移动数据。

2.6 设备驱动程序(大部分代码)

设备驱动程序是用于管理硬件设备并与之交互的核心组件。它们充当用户空间与硬件之间的桥梁,使应用程序无需直接操作底层硬件即可使用设备功能。

2.7 依赖体系结构的代码

3. Linux驱动的paltform机制

       Linux的paltform机制将本身的资源注册进内核,由内核统一管理,在驱动程序中使用这些资源时通过platform_device提供的标准接口进行申请并使用。这样提供了驱动和资源管理的独立性,并且拥有较好的可移植性和安全性。
       platform机制分为以下三个步骤:
       1)总线注册阶段
                内核启动初始化main.c文件中的kernal_init()→do_basic_setup()→driver_init()→platform_bus_init()→bus_register(&platform_bus_type),由此注册了一条platform总线(虚拟总线,platform_bus)。
        2)驱动注册阶段
                Platform_driver_register()→driver_register()→bus_add_driver()→driver_attach()→bus_for_each_dev(),对在每个挂在虚拟的platform bus的设备作__deriver_attach()→driver_probe_device(),判断drv→bus→match()是否执行成功,此时通过指针执行platform_match→strncmp(pdev→name,drv→name,BUS_ID_SIZE),如果相符就调用really_probe(实际就是执行相应设备的platform_driver→probe(platform_device)。)开始真正的探测,如果probe成功,则绑定设备到该驱动。
        从上面可以看出,platform机制最后还是调用了bus_register(),device_add(),driver_register()这三个关键的函数。
        关键结构体: 

struct platform_device {const char* name;   //设备名称,要与platform_driver的name一样,这样总线才能匹配成功u32 id;   //id号,插入总线下相同name的设备编号(一个驱动可以有多个设备),如果只有一个设备填-1struct device dev;  //内嵌的具体的device结构体,其中成员platform_data,是个void *类型,可以给平台driver提供各种数据(比如:GPIO引脚等等)u32 num_resources;      //资源数量,struct resource  * resource;    //资源结构体,保存设备的信息
};
struct resource {resource_size_t start;                    //起始资源,如果是地址的话,必须是物理地址resource_size_t end;                      //结束资源,如果是地址的话,必须是物理地址const char *name;                         //资源名unsigned long flags;                      //资源的标志//比如IORESOURCE_MEM,表示地址资源, IORESOURCE_IRQ表示中断引脚... ...struct resource *parent, *sibling, *child;   //资源拓扑指针父、兄、子,可以构成链表
};
  • 涉及到的函数如下(在dev设备的入口出口函数中用到)

int platform_device_register(struct platform_device * pdev);//注册dev设备
int platform_device_unregister(struct platform_device * pdev);//注销dev设备

                platform机制的好处:

                1. 提供了platform_bus_type类型的总线,把那些不是总线型的soc设备都添加到这条虚拟总线上。使得,总线——设备——驱动的模式可以得到普及。

                2. 提供了platform_device和platform_driver类型的数据结构,将传统的device和driver数据结构嵌入其中,并且加入resource成员,以便于和Open Firmware这种动态传递设备的新型bootloader和kernal接轨。

参考引用:linux_kernel_wiki/文章/Linux内核架构和工作原理.md at main · 0voice/linux_kernel_wiki

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/907887.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python爬虫:Ruia的详细使用(一个基于asyncio和aiohttp的异步爬虫框架)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Ruia概述1.1 Ruia介绍1.2 Ruia特点1.3 安装Ruia1.4 使用案例二、基本使用2.1 Request 请求2.2 Response - 响应2.3 Item - 数据提取2.4 Field 提取数据2.5 Spider - 爬虫类2.6 Middleware - 中间件三、高级功能3.1 …

网络攻防技术二:密码学分析

文章目录 一、传统密码分析方法1、根据明文、密文等信息的掌握情况分类 2、从密码分析途径分类二、密码旁路分析1、概念2、旁路分析方法三、现代密码系统1、对称密码(单密钥)2、公开密码(成对密钥) 四、典型对称密码(单…

Linux --TCP协议实现简单的网络通信(中英翻译)

一、什么是TCP协议 1.1 、TCP是传输层的协议,TCP需要连接,TCP是一种可靠性传输协议,TCP是面向字节流的传输协议; 二、TCPserver端的搭建 2.1、我们最终好实现的效果是 客户端在任何时候都能连接到服务端,然后向服务…

pc端小卡片功能-原生JavaScript金融信息与节日日历

代码如下 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>金融信息与节日日历</title><…

C语言——获取变量所在地址(uint8和uint32的区别)

前言&#xff1a; 1.使用uint8 *的原因 在C语言中&#xff0c;获取或操作一个4字节地址&#xff08;指针&#xff09;时使用uint8_t*&#xff08;即unsigned char*&#xff09;而不是uint32_t*&#xff0c;主要基于以下关键原因&#xff1a; 1.1. 避免违反严格别名规则&…

Python----目标检测(《YOLOv3:AnIncrementalImprovement》和YOLO-V3的原理与网络结构)

一、《YOLOv3:AnIncrementalImprovement》 1.1、基本信息 标题&#xff1a;YOLOv3: An Incremental Improvement 作者&#xff1a;Joseph Redmon, Ali Farhadi 机构&#xff1a;华盛顿大学&#xff08;University of Washington&#xff09; 发表时间&#xff1a;2018年 代…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Form Wave(表单label波动效果)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— FormWave组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ &#x1f3af; 组件目标 构建一个美观、动态的登录表单&#xff0…

【数据结构】--二叉树--堆(上)

一、树的概念和结构 概念&#xff1a; 树是一种非线性的数据结构&#xff0c;他是由n(n>0)个有限结点组成一个具有层次关系的集合。其叫做树&#xff0c;是因为他倒过来看就和一棵树差不多&#xff0c;其实际上是根在上&#xff0c;树枝在下的。 树的特点&#xff1a; 1…

linux有效裁剪视频的方式(基于ffmpeg,不改变分辨率,帧率,视频质量,不需要三方软件)

就是在Linux上使用OBS Studio录制一个讲座或者其他视频&#xff0c;可能总有些时候会多录制一段时间&#xff0c;但是如果使用剪映或者PR这样的工具在导出的时候总需要烦恼导出的格式和参数&#xff0c;比如剪映就不支持mkv格式的导出&#xff0c;导出成mp4格式的视频就会变得很…

SystemVerilog—Interface语法(一)

SystemVerilog中的接口&#xff08;interface&#xff09;是一种用于封装多模块间通信信号和协议的复合结构&#xff0c;可显著提升代码复用性和维护效率。其核心语法和功能如下&#xff1a; 一、接口的基本定义 1. 声明语法 接口通过interface关键字定义&#xff0c;支持信…

android binder(四)binder驱动详解

ref&#xff1a; Android10.0 Binder通信原理(五)-Binder驱动分析_binder: 1203:1453 ioctl 40046210 77004d93f4 return-CSDN博客 https://juejin.cn/post/7214342319347712057#heading-0 第6课第1节_Binder系统_驱动情景分析_数据结构_哔哩哔哩_bilibili

QT/c++航空返修数据智能分析系统

简介 1、区分普通用户和管理员 2、界面精美 3、功能丰富 4、使用cppjieba分词分析数据 5、支持数据导入导出 6、echarts展示图表 效果展示 演示链接 源码获取 int main(){ //非白嫖 printf("&#x1f4e1;:%S","joyfelic"); return 0; }

ToolsSet之:数值提取及批处理

ToolsSet是微软商店中的一款包含数十种实用工具数百种细分功能的工具集合应用&#xff0c;应用基本功能介绍可以查看以下文章&#xff1a; Windows应用ToolsSet介绍https://blog.csdn.net/BinField/article/details/145898264 ToolsSet中Number菜单下的Numeric Batch是一个数…

Ubuntu20.04 LTS 升级Ubuntu22.04LTS 依赖错误 系统崩溃重装 Ubuntu22.04 LTS

服务器系统为PowerEdge R740 BIOS Version 2.10.2 DELL EMC 1、关机 开机时连续按键盘F2 2、System Setup选择第一个 System BIOS 3、System BIOS Setting 选择 Boot Setting 4、System BIOS Setting-Boot Setting 选择 BIOS Boot Settings 5、重启 开启时连续按键盘F11 …

(javaSE)Java数组进阶:数组初始化 数组访问 数组中的jvm 空指针异常

数组的基础 什么是数组呢? 数组指的是一种容器,可以用来存储同种数据类型的多个值 数组的初始化 初始化&#xff1a;就是在内存中,为数组容器开辟空间,并将数据存入容器中的过程。 数组初始化的两种方式&#xff1a;静态初始化&#xff0c;动态初始化 数组的静态初始化 初始化…

支持向量机(SVM)例题

对于图中所示的线性可分的20个样本数据&#xff0c;利用支持向量机进行预测分类&#xff0c;有三个支持向量 A ( 0 , 2 ) A\left(0, 2\right) A(0,2)、 B ( 2 , 0 ) B\left(2, 0\right) B(2,0) 和 C ( − 1 , − 1 ) C\left(-1, -1\right) C(−1,−1)。 求支持向量机分类器的线…

UE特效Niagara性能分析

开启Niagara调试器 开启显示概览 界面显示 &#x1f7e9; 上方绿色面板&#xff1a;Niagara DebugHud 这是 HUD&#xff08;调试视图&#xff09; 模式下的性能统计显示&#xff0c;内容如下&#xff1a; 项目含义SystemFilter: ShockWave_01当前选中的 Niagara 粒子系统名称…

碳中和新路径:铁电液晶屏如何破解高性能与节能矛盾?

一、显示技术困局&#xff1a;当 “高刷” 遭遇 “高耗” 在元宇宙、电竞产业蓬勃发展的当下&#xff0c;显示设备的刷新率与能耗成为行业痛点。传统液晶受 “边缘场效应” 制约&#xff0c;刷新率长期停滞在 300Hz 以下&#xff0c;动态画面拖影问题显著&#xff1b;同时&…

Vue3+SpringBoot全栈开发:从零实现增删改查与分页功能

前言 在现代化Web应用开发中&#xff0c;前后端分离架构已成为主流。本文将详细介绍如何使用Vue3作为前端框架&#xff0c;SpringBoot作为后端框架&#xff0c;实现一套完整的增删改查(CRUD)功能&#xff0c;包含分页查询、条件筛选等企业级特性。 技术栈介绍 前端&#xff1…

IBM 与嘉士伯(Carlsberg)携手推进 SAP S/4HANA 数字化转型,打造啤酒行业新范式

在啤酒酿造拥有悠久传统的同时&#xff0c;嘉士伯也在积极拥抱前沿技术&#xff0c;迈出数字化转型的坚实步伐。2025年&#xff0c;嘉士伯宣布与 IBM 建立多年的合作伙伴关系&#xff0c;在其西欧业务中全面部署 SAP S/4HANA&#xff0c;旨在提升企业的运营效率、敏捷性和创新能…