649|7

219

帖子

1

TA的资源

一粒金砂(高级)

楼主
 

奔跑吧Linux内核+内存管理2 [复制链接]

《奔跑吧Linux内核》与从硬件角度看内存管理,这两者结合起来,为我们提供了一个全面而深入的视角来理解Linux内核中的内存管理机制以及它在硬件层面的实现。

首先,Linux内核作为操作系统的核心,负责管理计算机的硬件和软件资源。其中,内存管理是Linux内核的一个关键组成部分,它负责分配、回收、保护和共享物理内存(RAM)和虚拟内存。这种管理策略不仅确保了系统的稳定性和性能,还处理了诸如内存碎片、内存泄漏和内存溢出等问题。

从硬件角度看,内存管理涉及到处理器、内存和其他相关硬件组件的交互。处理器中的一个关键部件是内存管理单元(MMU),它负责将虚拟地址转换为物理地址。这种转换是内存管理中的一个核心环节,它确保了程序可以在不直接访问物理内存的情况下运行,从而提高了系统的安全性和灵活性。

在Linux内核中,内存管理通过一系列的数据结构和算法来实现。例如,页表是存储虚拟地址到物理地址映射的数据结构,而TLB(Translation Lookaside Buffer)则是一个缓存结构,用于加速地址转换过程。当处理器需要访问内存时,它首先会检查TLB中是否有相应的映射,从而避免了直接访问页表所带来的延迟。

 

 

分段机制的优点:

  1. 地址空间隔离:每个进程都有自己的虚拟地址空间,使得不同的进程之间不会相互干扰。

  2. 内存保护:由于进程只能访问其虚拟地址空间内的内存,因此操作系统可以防止一个进程访问或修改另一个进程的内存。

  3. 程序迁移性:程序只需要关注虚拟地址,使得程序可以更容易地在不同的操作系统和硬件平台上迁移。

  4. 动态内存分配:操作系统可以根据需要动态地为进程分配和释放内存段。

分段机制的缺点:

  1. 内存碎片:随着时间的推移,内存中可能会产生很多小的、无法使用的空闲区域,这被称为内存碎片。这些碎片可能不足以满足新进程的内存请求,即使总的可用内存量实际上足够。

  2. 共享内存困难:分段机制本身并不直接支持进程间共享内存。虽然可以通过一些额外的机制(如共享段)来实现,但这增加了复杂性。

  3. 外部碎片:由于段的长度可变,所以可能导致外部碎片,即内存中空闲区域的总和足够大,但单个空闲区域太小而无法满足请求。

虚拟内存的概念:

虚拟内存是操作系统为进程提供的一个统一的、连续的、私有的内存空间。这个空间的大小通常远大于物理内存的实际大小,它允许程序在比实际可用的物理内存更大的地址空间中运行。虚拟内存技术通过内存映射、分页、分段和交换等技术来实现。

分页与分段的区别:

分页和分段都是实现虚拟内存的技术,但它们有一些关键的区别:

  • 固定大小与可变大小:分页中的页面大小是固定的,而分段中的段大小是可变的。

  • 内存碎片:分页可以减少外部碎片,但可能增加内部碎片(由于固定大小的页面)。分段则可能导致外部碎片。

  • 共享与保护:分页本身不提供内存保护或共享机制,但可以通过页表项的标志位来实现。分段则更自然地支持内存保护和共享,因为每个段通常对应程序的一个逻辑部分。

分页机制是现代操作系统中广泛使用的内存管理技术。它通过将进程的虚拟地址空间划分为固定大小的页面,并将这些页面映射到物理内存中的页帧,实现了虚拟内存到物理内存的转换。这种转换过程离不开硬件的支持,特别是内存管理单元(MMU)的参与。

当CPU需要访问某个虚拟地址时,它会首先检查TLB(Translation Lookaside Buffer)中是否已经有该地址的映射。如果TLB命中,CPU可以直接获取物理地址并访问内存。如果TLB未命中,CPU则需要通过查询页表来获取物理地址。这个过程涉及多个步骤,包括确定使用哪个页表基地址寄存器、在一级页表中找到相应的页表项、在二级页表中找到最终的页表项,并计算出物理地址。

大页面的支持是现代处理器为了提高内存管理效率和应用程序性能而引入的特性。通过使用较大的页面大小,可以减少页表的大小和复杂性,降低内存管理的开销。然而,大页面的使用也需要权衡利弊,因为过大的页面可能会导致内部碎片问题,并限制内存管理的灵活性。

 

分页机制通过将进程的虚拟地址空间划分为固定大小的页面,并通过页表将这些页面映射到物理内存中的页帧,实现了对物理内存的细粒度管理。这种机制有效地提高了内存利用率,并允许操作系统更加灵活地管理内存资源。

在现代操作系统中,页面大小通常是固定的,如4KB。然而,随着内存容量的不断增加,特别是服务器级别的TB级内存,使用较小的页面大小可能会导致内存管理成本显著增加。为了解决这个问题,现代处理器支持大页面特性,如2MB或1GB的大页面。使用大页面可以减少页表的大小和复杂性,降低内存管理的开销,并提高应用程序的性能。

虚拟地址到物理地址的转换过程涉及多个关键组件和步骤。首先,处理器会检查TLB(Translation Lookaside Buffer)中是否已经有目标虚拟地址的映射。如果TLB命中,处理器可以直接获取物理地址并访问内存,这大大提高了地址转换的速度。如果TLB未命中,处理器则需要通过查询页表来获取物理地址。这个过程涉及使用页表基地址控制寄存器和虚拟地址来确定使用哪个页表基地址寄存器,并通过多级页表(如您所描述的一级页表和二级页表)来找到最终的页表项。页表项中存放着物理页面的基地址,处理器将其与页内偏移量相结合,计算出最终的物理地址。

分页机制的实现离不开硬件的支持,特别是内存管理单元(MMU)的参与。MMU负责虚拟地址到物理地址的转换工作,它包含了TLB和页表遍历单元等关键部件。这些硬件单元协同工作,确保处理器能够高效地访问内存。

 

   

 

您提到的“ee”命令实际上并不存在,Linux 系统使用者通常用于查看内存信息的命令是“free”。另外,“Limux”应该是一个拼写错误,正确的应该是“Linux”。此外,“mallocO”和“mmapO”应该是“malloc”和“mmap”。

从 Linux 系统使用者的角度看内存管理,他们通常使用 free 命令来查看当前系统的内存使用情况。free 命令可以显示物理内存、交换空间(swap space)以及内核缓冲区等信息。

以下是一个使用 free -m 命令的示例输出,它将以 MB 为单位显示内存使用情况:


 

bash复制代码

  $ free -m
  total used free shared buff/cache available
  Mem: 7938 1341 2156 310 4440 5948
  Swap: 2047 0 2047

解释输出中的列:

  • total:总的物理内存大小。
  • used:已使用的物理内存大小,包括应用程序、缓存和缓冲区。
  • free:未使用的物理内存大小。
  • shared:被多个进程共享的内存大小。
  • buff/cache:用于缓冲和缓存的内存大小,这部分内存可以在需要时被释放给应用程序使用。
  • available:在不交换出任何内容的情况下,可用于启动新应用程序的估计内存量。

Swap 行显示交换空间的使用情况,当物理内存不足时,Linux 会使用交换空间来释放物理内存。

对于 Linux 应用程序开发人员来说,他们通常使用 C 语言标准库中的 malloc 函数来动态分配内存。malloc 函数会向堆(heap)申请一定大小的内存,并返回指向这块内存的指针。如果需要分配大块的虚拟内存,开发者会使用 mmap 函数,它允许应用程序将文件或设备的内容映射到进程的地址空间中。

从 Linux 内核的角度来看,内存管理则涉及更多底层和复杂的机制,包括伙伴系统(buddy system)用于管理物理内存页、页表管理、内存压缩、交换空间管理、OOM(Out-Of-Memory)杀手等等。内核还需要处理进程间的内存共享、内存保护、内存隔离等问题。

 

 

 

 

  1. pglist_data:
    pglist_data 结构体用于表示一个内存节点(node)的所有资源。在UMA(Uniform Memory Access)架构中,所有内存被视为一个单独的内存节点,并由一个全局的 contig_page_data 变量来描述。而在NUMA(Non-Uniform Memory Access)架构中,内存被划分为多个节点,每个节点可以有不同的访问延迟和带宽。pglist_data 结构体的指针数组 node_data[] 用于管理这些节点。

  2. 内存管理区(ZONE):
    Linux内核将物理内存划分为不同的管理区(ZONE),主要是为了应对32位系统物理地址空间的限制和内存管理的不同需求。这些区域包括:

    • ZONE_DMA: 用于需要直接内存访问(DMA)的硬件。
    • ZONE_NORMAL: 可直接映射到内核地址空间的内存。
    • ZONE_HIGHMEM: 高端内存,不能直接映射到内核地址空间,需要通过某种机制(如临时映射)来访问。

    对于32位系统,由于地址空间的限制,不是所有物理内存都可以直接映射到内核地址空间。因此,高端内存的存在是必要的。通过ZONE_HIGHMEM,Linux内核能够管理超过内核直接映射限制的物理内存。

  3. 物理页面(page):
    物理内存被划分为固定大小的页面(通常是4KB),每个页面由一个 page 结构体来描述。这个结构体包含了页面的状态信息、引用计数等。

  4. mem_map数组:
    mem_map 是一个指向 page 结构体的数组,用于描述系统中所有物理页面的信息。在NUMA系统中,每个内存节点都有自己的 mem_map。

  5. 页表项(PTE):
    页表项(Page Table Entry)是页表中的一个条目,用于存储虚拟地址到物理地址的映射信息。当CPU访问一个虚拟地址时,它会查找页表以获取对应的物理地址。

  6. 页帧号(PFN):
    页帧号(Page Frame Number)是物理页面在物理内存中的编号。它用于唯一标识一个物理页面。

  7. 物理地址(paddress):
    物理地址是内存中的实际地址,用于直接访问物理内存。

此帖出自Linux开发论坛

最新回复

非常感谢楼主分享的技术内容,非常详实,通俗易懂,受益匪浅  详情 回复 发表于 2024-6-21 14:42
点赞 关注

回复
举报

2935

帖子

4

TA的资源

五彩晶圆(中级)

沙发
 

问楼主一个问题:linux系统为啥要使用分页系统,分页后明明是浪费了很多内存空间,为啥还还要使用这种管理方式,而且还要使用MMU这种硬件系统来辅助管理效率。

此帖出自Linux开发论坛

点评

分页系统使得内存管理更为高效和灵活一些。  详情 回复 发表于 2024-4-5 20:04
 
 

回复

219

帖子

1

TA的资源

一粒金砂(高级)

板凳
 
bigbat 发表于 2024-4-3 12:04 问楼主一个问题:linux系统为啥要使用分页系统,分页后明明是浪费了很多内存空间,为啥还还要使用这种管理 ...

分页系统使得内存管理更为高效和灵活一些。

此帖出自Linux开发论坛

点评

分页管理是为了“拼接内存”  详情 回复 发表于 2024-4-6 09:31
 
 
 

回复

2935

帖子

4

TA的资源

五彩晶圆(中级)

4
 
meiyao 发表于 2024-4-5 20:04 分页系统使得内存管理更为高效和灵活一些。

分页管理是为了“拼接内存”

此帖出自Linux开发论坛
 
 
 

回复

755

帖子

5

TA的资源

纯净的硅(高级)

5
 

非常感谢楼主分享的技术内容,非常详实,通俗易懂,受益匪浅

此帖出自Linux开发论坛
 
 
 

回复

219

帖子

1

TA的资源

一粒金砂(高级)

6
 
chejm 发表于 2024-4-8 06:25 非常感谢楼主分享的技术内容,非常详实,通俗易懂,受益匪浅

此帖出自Linux开发论坛
 
 
 

回复

2

帖子

1

TA的资源

一粒金砂(初级)

7
 
非常感谢楼主分享的技术内容,非常详实,通俗易懂,受益匪浅
此帖出自Linux开发论坛
 
 
 

回复

219

帖子

1

TA的资源

一粒金砂(高级)

8
 
leo1111 发表于 2024-6-21 14:42 非常感谢楼主分享的技术内容,非常详实,通俗易懂,受益匪浅

此帖出自Linux开发论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表