导航:首页 > 操作系统 > linux内核存储

linux内核存储

发布时间:2025-07-14 10:31:21

linux内核存放的位置是在/usr/src/kernels下还是/boot/vmlinuz下

1、是在/boot目录下
2、/usr/src目录一般是系统内核代码目录
3、你看/boot/grub/grub.conf文件,kernel那行是vmlinuz...,就是代表内核的名字
4、Linux是一个一体化内核(monolithic kernel)系统。“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。一个内核不是一套完整的操作系统。一套基于Linux内核的完整操作系统叫作Linux操作系统,或是GNU/Linux。设备驱动程序可以完全访问硬件。Linux内的设备驱动程序可以方便地以模块化(molarize)的形式设置,并在系统运行期间可直接装载或卸载。

Ⅱ Linux 内核的内存管理 - 概念

Concepts overview — The Linux Kernel documentation

Linux中的内存管理是一个复杂的系统,经过多年的发展,它包含越来越多的功能,以支持从 MMU-less microcontrollers 到 supercomputers 的各种系统。
没有MMU内存管理的系统被称为 nommu ,它值得写一份专门的文档进行描述。
尽管有些概念是相同的,这里我们假设MMU可用,CPU可以将虚拟地址转换为物理地址。

计算机系统中的物理内存是有限资源,即便支持内存热插拔,其可以安装的内存也有限的。物理内存不一定必须是连续的;它可以作为一组不同的地址范围被访问。此外,不同的CPU架构,甚至同架构的不同实现对如何定义这些地址范围都是不同的。

这使得直接处理物理内存异常复杂,为了避免这种复杂性,开发了 虚拟内存 (virtual memory) 的概念。

虚拟内存从应用软件中抽象出物理内存的细节,只允许在物理内存中保留需要的信息 (demand paging) ,并提供一种机制来保护和控制进程之间的数据共享。

通过虚拟内存,每次内存访问都访问一个 虚拟地址 。当CPU对从系统内存读取(或写入)的指令进行解码时,它将该指令中编码的虚拟地址转换为内存控制器可以理解的物理地址。

物理内存被切分为 页帧 page frames 页 pages 。页的大小是基于架构的。一些架构允许从几个支持的值中选择页大小;此选择在内核编译时设置到内核配置。

每个物理内存页都可以映射为一个或多个 虚拟页(virtual pages) 。映射关系描述在 页表(page tables) 中,页表将程序使用的虚拟地址转换为物理内存地址。页表以层次结构组织。

最底层的表包含软件使用的实际内存页的物理地址。较高层的表包含较低层表页的物理地址。顶层表的指针驻留在寄存器中。
当CPU进行地址转换的时候,它使用寄存器访问顶级页表。

虚拟地址的高位,用于顶级页表的条目索引。然后,通过该条目访问下级,下级的虚拟地址位又作为其下下级页表的索引。虚拟地址的最低位定义实际页内的偏移量。

地址转换需要多次内存访问,而内存访问相对于CPU速度来说比较慢。为了避免在地址转换上花费宝贵的处理器周期,CPU维护着一个称为 TLB (Translation Lookaside Buffer)的用于地址转换缓存(cache)。通常TLB是非常稀缺的资源,需要大内存工作应用程序会因为TLB未命中而影响性能。

很多现代CPU架构允许页表的高层直接映射到内存页。例如,x86架构,可以通过二级、三级页表的条目映射2M甚至1G内存页。在Linux中,这些内存页称为 大页 (Huge) 。大页的使用显着降低了TLB的压力,提高了TLB命中率,从而提高了系统的整体性能。

Linux提供两种机制开启使用大页映射物理内存。

第一个是 HugeTLB 文件系统,即 hugetlbfs 。它是一个伪文件系统,使用RAM作为其存储。在此文件系统中创建的文件,数据驻留在内存中,并使用大页进行映射。
关于 HugeTLB Pages

另一个被称为 THP (Transparent HugePages) ,后出的开启大页映射物理内存的机制。
hugetlbfs 不同,hugetlbfs要求用户和/或系统管理员配置系统内存的哪些部分应该并可以被大页映射;THP透明地管理这些映射并获取名称。
关于 Transparent Hugepage Support

通常,硬件对不同物理内存范围的访问方式有所限制。某些情况下,设备不能对所有可寻址内存执行DMA。在其他情况下,物理内存的大小超过虚拟内存的最大可寻址大小,需要采取特殊措施来访问部分内存。还有些情况,物理内存的尺寸超过了虚拟内存的最大可寻址尺寸,需要采取特殊措施来访问部分内存。

Linux根据内存页的使用情况,将其组合为多个 zones 。比如, ZONE_DMA 包含设备用于DMA的内存, ZONE_HIGHMEM 包含未永久映射到内核地址空间的内存, ZONE_NORMAL 包含正常寻址内存页。
内存zones的实际层次架构取决于硬件,因为并非所有架构都定义了所有的zones,不同平台对DMA的要求也不同。

多处理器机器很多基于 NUMA (Non-Uniform Memory Access system - 非统一内存访问系统 )架构。 在这样的系统中,根据与处理器的“距离”,内存被安排成具有不同访问延迟的 banks 。每个 bank 被称为一个 node ,Linux为每个 node 构造一个独立的内存管理子系统。 Node 有自己的zones集合、free&used页面列表,以及各种统计计数器。
What is NUMA?
NUMA Memory Policy

物理内存易失,将数据放入内存的常见情况是读取文件。读取文件时,数据会放入 页面缓存(page cache) ,可以在再次读取时避免耗时的磁盘访问。同样,写文件时,数据也会被放入 页面缓存 ,并最终进入存储设备。被写入的页被标记为 脏页(dirty page) ,当Linux决定将其重用时,它会将更新的数据同步到设备上的文件。

匿名内存 anonymous memory 匿名映射 anonymous mappings 表示没有后置文件系统的内存。这些映射是为程序的stack和heap隐式创建的,或调用mmap(2)显式创建的。通常,匿名映射只定义允许程序访问的虚拟内存区域。读,会创建一个页表条目,该条目引用一个填充有零的特殊物理页。写,则分配一个常规物理页来保存写入数据。该页将被标记为脏页,如果内核决定重用该页,则脏页将被交换出去 swapped out

纵贯整个系统生命周期,物理页可用于存储不同类型的数据。它可以是内核内部数据结构、设备驱动DMA缓冲区、读取自文件系统的数据、用户空间进程分配的内存等。
根据内存页使用情况,Linux内存管理会区别处理。可以随时释放的页面称为 可回收(reclaimable) 页面,因为它们把数据缓存到了其他地方(比如,硬盘),或者被swap out到硬盘上。
可回收页最值得注意的是 页面缓存 匿名页面

在大多数情况下,存放内部内核数据的页,和用作DMA缓冲区的页无法重用,它们将保持现状直到用户释放。这样的被称为 不可回收页(unreclaimable)
然而,在特定情况下,即便是内核数据结构占用的页面也会被回收。
例如,文件系统元数据的缓存(in-memory)可以从存储设备中重新读取,因此,当系统存在内存压力时,可以从主内存中丢弃它们。

释放可回收物理内存页并重新调整其用途的过程称为 (surprise!) reclaim
Linux支持异步或同步回收页,取决于系统的状态。
当系统负载不高时,大部分内存是空闲的,可以立即从空闲页得到分配。
当系统负载提升后,空闲页减少,当达到某个阈值( low watermark )时,内存分配请求将唤醒 kswapd 守护进程。它将以异步的方式扫描内存页。如果内存页中的数据在其他地方也有,则释放这些内存页;或者退出内存到后置存储设备(关联 脏页 )。

随着内存使用量进一步增加,并达到另一个阈值- min watermark -将触发回收。这种情况下,分配将暂停,直到回收到足够的内存页。

当系统运行时,任务分配并释放内存,内存变得碎片化。
虽然使用虚拟内存可以将分散的物理页表示为虚拟连续范围,但有时需要分配大的连续的物理内存。这种需求可能会提升。例如,当设备驱动需要一个大的DMA缓冲区时,或当THP分配一个大页时。
内存地址压缩(compaction ) 解决了碎片问题。
该机制将占用的页从内存zone的下部移动到上部的空闲页。压缩扫描完成后,zone开始处的空闲页就并在一起了,分配较大的连续物理内存就可行了。

reclaim 类似, compaction 可以在 kcompactd守护进程中异步进行,也可以作为内存分配请求的结果同步进行。

在存在负载的机器上,内存可能会耗尽,内核无法回收到足够的内存以继续运行。
为了保障系统的其余部分,引入了 OOM killer

OOM killer 选择牺牲一个任务来保障系统的总体健康。选定的任务被killed,以期望在它退出后释放足够的内存以继续正常的操作。

Ⅲ linux内核主要由哪几个部分组成

Linux内核作为一个一体化系统,提供了硬件抽象层、磁盘及文件系统控制、多任务等核心功能。它并不是一个完整的操作系统,而是构成GNU/Linux系统的内核部分。设备驱动程序在Linux系统中可以完全访问硬件,并以模块化形式设置,方便在系统运行期间直接装载或卸载。

Linux内核的主要组成部分包括存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化和系统调用等。这些组件共同协作,确保了系统的稳定运行。

内核版本号采用三种不同的方式表示。第一种方式用于1.0版本之前,数字从0.01开始递增,直至1.0。第二种方式用于1.0之后到2.6,数字由A.B.C构成,A代表主版本号,B代表次主版本号,C代表较小的末版本号。只有在内核发生很大变化时,A才发生变化。通过数字B可以判断Linux的稳定性,偶数的B代表稳定版,奇数的B代表开发版。C代表一些bug修复、安全更新、新特性和驱动的次数。

第三种方式从2004年2.6.0版本开始,采用“时间驱动”的方式。3.0版本之前,版本号为A.B.C.D,七年里,前两个数字A.B即“2.6”保持不变,C随着新版本的发布而增加,D代表bug修复、安全更新、添加新特性和驱动的次数。3.0版本之后,版本号为A.B.C,B随着新版本的发布而增加,C代表bug修复、安全更新、新特性和驱动的次数。

采用第三种方式后,不再使用偶数代表稳定版,奇数代表开发版的命名方式。例如,3.7.0代表的是稳定版!

Ⅳ Linux内核:内存管理——多级页表

多级页表相较于一级页表在存储空间上更具优势,主要因为以下几点

  1. 减少内存占用

    • 分级存储:多级页表通过将页表分为多个级别,只有真正需要的页表才保留在内存中,其他不需要的页表则不被存储,从而大大节省了内存空间。
    • 稀疏映射:对于大多数进程,其虚拟地址空间中的页面并非全部被使用。多级页表通过顶级页表为真正有用的低级页表提供索引,将页表的存储空间降至最低。
  2. 优化存储需求

    • 降低页表项数量:对于一个运行的进程,其虚拟地址空间中只有被当前使用或即将使用的页面被映射到内存中,这极大地减少了对页表的存储需求。
    • 利用“在/不在”位:多级页表中的顶级页表大部分表项的“在/不在”位被设为0,当访问这些表项时,系统会引发页面失效,提示页表中没有对应页帧,进一步减少了不必要的页表占用。
  3. 提高内存管理效率

    • 层次化设计:多级页表的层次化设计不仅解决了页表存储空间的问题,还为内存管理带来了更大的灵活性和效率。
    • 性能优化:通过减少内存中的页表项数量,多级页表优化了地址映射的性能,使得系统在内存管理方面更加高效。

综上所述,多级页表通过其分级存储、稀疏映射以及层次化设计等特性,相较于一级页表在存储空间上具有显着优势,同时提高了内存管理的效率和灵活性。

阅读全文

与linux内核存储相关的资料

热点内容
为什么连接服务器没有应答 浏览:389
程序员为何被开除 浏览:864
手机论坛网站源码 浏览:589
快递柜锁控板源码 浏览:352
阿里巴巴农业云服务器 浏览:518
android多行注释的快捷键 浏览:866
java环境变量的作用 浏览:526
phpwebsocket扩展 浏览:17
会玩app怎么把猪头弄掉 浏览:93
战地3怎么换服务器地址 浏览:474
qq邮箱app怎么导出通讯录 浏览:704
命令女主身体 浏览:969
java的注释规范 浏览:862
华为mt40e怎么删app 浏览:91
java用到的技术 浏览:618
农行手机app怎么更新版本 浏览:538
初中生程序员职业生涯道路 浏览:930
linux部署常用命令 浏览:386
博途一直正在编译组态 浏览:433
安卓快手红包标志不见了怎么设置 浏览:315