内核简介

news/2025/3/18 3:27:11/文章来源:https://www.cnblogs.com/solicit/p/18342021

Linux内核基础

楔子

这部分的内容首先要回忆一下计算机的基础知识,基本的计算机结构包括CPU(算数逻辑单元ALU、控制单元CU)、存储器、输入和输出。CPU和其它设备是通过总线连接的。CPU执行的基础被称为指令集,CPU执行存储器存取指令时:CPU发出存取信号,然后就从存储器存取数据。存取器通过中断机制通知CPU存取完毕。引入中断机制的意义是,让CPU不必等IO的完毕,而转去执行其它指令。

计算机系统内核

内核的作用:

  • 资源管理
  • 提供基础库

传统意义上的内核实现有两种方式:

  • 微内核结构:只有最基础的功能由中央内核实现,其它的功能都由一些其它进程实现。
  • 宏内核结构;宏内核还包括有文件系统、内存管理、设备驱动程序功能。Linux内核属于宏内核。

虚拟地址空间

内存区域是通过指针寻址的,CPU字长决定了能够管理的地址空间的最大长度。现代计算机支持64位的字长,所以其管理的最大虚拟内存空间大小为 264B,实际可寻址的区域小于这个值。Linux将虚拟地址空间划分为两个部分:

  • 内核空间,TASK_SIZE~264保留给内核专用,用户进程无法访问。
  • 用户空间,从0~TASK_SIZE是用户空间范围

用户进程执行系统调用时,会发生用户状态到内核状态的切换,切换到内核空间后,由内核进程去执行相应的任务。每个进程都认为它占有全部的用户空间。

页表

虚拟地址空间和物理地址空间之间映射的问题是通过页表来实现的。物理地址和虚拟地址都被划分为页。进程A和进程B都拥有同样大小的虚拟地址空间,但是他们需要访问的资源不同,也就是需要访问的物理地址不同,所有只需要将其需要的访问的虚拟页映射到真实物理页即可。物理页经常被称为页帧,页一般指虚拟地址空间的页。

页表的设计

每个页表项数据结构中包含虚拟地址页以及与其相对应的页帧。如果只有一层,假如每页都是1KB,那么1GB就需要保存100个页表项,那么此时会很耗内存,所以实际设计方式中采用层次设计原理。Linux采用了四层页表:

  • 全局页目录(Page Global Directory, PGD)
  • 中间页目录(Page Middle Directory, PMD)
  • 页表数组(Page Table Entry, PTE)

然后进行层级查询即可,此时不需要使用的虚拟地址空间,就不会有中间页目录、页表数组等。避免只用一个数组项保存数据而占用大量的内存。

层级设计存在的另一个问题是必须通过多层转换才能够访问到物理地址。所以内核有两种加速的方式:

  • MMU(内存管理单元)优化内存访问操作
  • 保存到TLB(Translation Lookaside Buffer)(CPU缓冲区)转移后备缓冲区将频繁使用的地址存储在其中,避免直接查询页表,节约时间。

物理内存的分配

  • 伙伴系统:内存分配中经常需要分配连续的页
  • slab缓冲:本质上用于更小的分配内存单元(从页中分配)

页面交换和页面回收

页面交换是通过缺页异常实现的。页面回收其实就是页面回写,将数据写入到硬盘中。

外设

  • 块设备:可以随机访问数据,典型的就是硬盘,数据的读写只能以块(一般为512B)的倍数读写,按块读写。
  • 字符设备:顺序读取,通常不支持随机存取。按字符/字节读写数据。

缓存

从低速块设备读取数据暂存在内存中,一般缓存也是按页组织的,称为页缓存。

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

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

相关文章

logback下日志输出前处理操作——以日志脱敏为例

使用lockback 目前Java Spring服务在打印日志时一般使用slf4j和logback这种组合,其基本原理图如下具体的:大多数会先定义一个loackback-dev.xml文件,而后使用<appender>标签定义输出格式 <appender name="file" class="ch.qos.logback.core.rolling…

边分治维护强连通分量(CF1989F,P5163)

这里的边分治和树上的点分治边分治不一样,是维护强连通分量用的,每条边有一个出现时间,通过将每条边按连通关系分流重新排列,从而维护每个时间点整张图的连通性。具体的,这个算法是维护这样的一类问题: n 个点,m 条边按时间顺序依次加入,每加入一条边,你需要回答一些问…

使用 C# 和 ONNX 來玩转Phi-3 SLM

LLM 席卷世界刷新 AI 的认知之后,由于 LLM 需要的硬件要求实在太高,很难在普通设备上运行,因此 SLM 逐漸受到重視,Phi-3 SLM 是由 Microsoft 所开发的模型,可以在你的电脑、手机等设备来运行,小型语言模型 (SLM) 和 ONNX 的结合改变了 AI 互操作性的游戏规则。让我们展…

到底什么是@RestController

@RestController是Spring框架的一个注解,通常用于标识一个类是RESTful服务的Controller。 @RestController经常用来处理HTTP请求,是SpringMVC中用于构建RESTful Web服务的注解,是@Controller注解的变体 通过@RestController注解,SpringMVC可以识别出这个类是一个控制器这个…

【已解决】戴尔 Inspiron 5457 和 5557 启动报错:Invalid configuration information - please run SETUP program.

场景 我使用的是戴尔15-5557的笔记本电脑,在某次开机的时候系统提示:Invalid configuration information - please run SETUP program.虽然的点击Continue可以正常进入系统,但是每次开机都要来上这么一下真的很烦人,于是想着解决一下。 试错过程 1. BIOS调整刚开始以为是自…

6-3使用GPU训练模型

当参数迭代过程成为训练时间的主要瓶颈时,我们通常的方法是应用GPU来进行加速。深度学习的训练过程常常非常耗时,一个模型训练几个小时是家常便饭,训练几天也是常有的事情,有时候甚至要训练几十天。 训练过程的耗时主要来自于两个部分,一部分来自数据准备,另一部分来自参…

从 0 开始安装和运行 Cangjie (仓颉)

在 Windows 上运行你的第一个仓颉应用程序标准方法 参照 配置开发环境 的描述,下载 Cangjie for DevEco Studio 插件 DevEco Studio NEXT Developer Beta2-Cangjie Plugin(5.0.3.500)。然后在 DevEco Studio NEXT Developer Beta2 中从本地磁盘安装插件,选择下载好的 "d…

启动静态文件中间件

在启动项 Program.cs 文件中添加//app.UseStaticFiles(); // 启动静态文件中间件,默认访问wwwroot app.UseStaticFiles(new StaticFileOptions() {//修改默认访问地址为MyStaticFiles文件FileProvider = new PhysicalFileProvider(Path.Combine(builder.Environment.ContentRoo…

变异系数在fNIRS数据分析中有效性讨论

问题变异系数又称CV,它是无量纲的,定义为概率分布离散程度的归一化程度。在概率论中常常用来作为比较两组数据离散程度的指标,其在fNIRS信号这类连续信号中常常用来检测通道的信号质量好坏,阈值包括0.1、0.15和0.25等,阈值越大越宽松,当某个通道的CV值超过设定的阈值时判…

使用python对Excel表格某个区域保存为图片

实际工作中,我们经常会把表格某个区域(如:A1:F5)或某个图形保存为图片,如何用python自动做到这一点?不知屏幕前的小伙伴有没有遇到过类似的需求,此刻脑海里有木有一丢丢思路。python操作excel的第三方库有很多,个个都有各自的绝招和擅长的应用场景,简单罗列一下:pye…

位段 -- 内存布局详解-浅谈C语言

目录位段的介绍位段使用示例:位段的内存分配Example内存分配解析: ## 位段 位段的介绍位段(二进制位):就是按位存储位段(bit-field)是C语言中的一种特殊数据类型,它允许将一个字节分成几个部分,并为每个部分指定特定的位数,以便在内存中存储和访问这些部分。 其中位段相…