Linux内核中的内存(二)

本文深入探讨了Linux操作系统中的内存管理机制,包括进程地址空间的概念、内存描述符的使用及其实现方式、内核线程如何处理内存描述符、内存区域的描述与管理、页表的结构及其工作原理等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

版权所有,转载请说明转自 http://my.youkuaiyun.com/weiqing1981127

内存除了管理本身的内存(物理内存)外,还必须管理用户空间中的进程的内存(虚拟内存),这个内存就叫进程地址空间。尽管一个进程可以寻址4GB的虚拟内存,但是这并不代表它就有权访问所有的虚拟内存,这些可以被访问的地址空间称为内存区域。如果一个进程访问了不在有效范围内的内存区域,或者以不正确的方式访问了有效地址,那么内核就会终止该进程,并返回段错误信息。

内核使用内存描述符结构体表示进程的地址空间,内存描述符由struct mm_struct结构体表示。分配内存描述符有两种方法:其一,fork函数利用copy_mm函数复制父进程的内存描述符,也就是current->mm域给其子进程,而子进程中的mm_struct结构体实际上是通过allocate_mm宏从mm_cachep_slab缓存中分配得到的。其二,当CLONE_VM被指定后,内核就不需要调用allocate_mm函数,而仅仅需要在调用copy_mm函数中将mm域指向其父进程的内存描述符。

内核线程与内存描述符

内核线程没有进程地址空间,也就没有自己的内存描述符,内核线程是没有用户上下文的。因为内核线程不需要访问用户空间内存,所以它们不需要有自己的内存描述符和页表。但是,当内核线程访问内核内存时,内核线程还是需要使用一些数据的,比如页表,为了避免内核线程为内核描述符呵呵页表浪费内存,内核线程直接使用前一个进程的内存描述符,而且仅仅使用前一个进程的内存描述符中和内核内存相关的信息,这些信息的含义和普通进程完全相同。

内存区域由struct vm_area_struct结构体描述,在linux内核中,内存区域又叫虚拟内存区域(VMAs),内核将每一个内存区域作为一个单独的内存对象管理,内存区域的位置就在[vm_start,vm_end]之间。在struct vm_area_struct中,我们有个flags域,这里面存放VMA标志,和物理页的访问权限不同,VMA标志反映了内核处理页面所需要遵守的行为准则,而不是硬件要求。另外提供了VMA操作来处理虚拟内存区域,包括open,close,fault,page_mkwrite,access函数。

内存区域的树型结构和内存区域的链表结构

红黑树的特点:第一,左边节点值小于右边节点值;第二,红节点的子节点为黑色;第三,树中的任何一条从节点到叶子的路径必须包括相同数量的黑色节点;第四,跟节点为红色;第五,红黑树搜索、插入、删除等操作的复杂度都是O(log(n))。链表用于需要遍历全部节点的时候,而红黑树适合在地址空间中定位特定内存区域的时候,内核为了内存区域上的各种不同的操作获得更高的性能,所以同时使用红黑树和链表这两种数据结构。

创建和撤销内存区域

如果创建内核区域,系统会调用do_mmap函数,在用户空间可以通过mmap函数获取内核函数do_mmap函数的功能。如果需要撤销内核区域,系统会调用do_munmap函数,在用户空间可以调用munmap函数获取内核do_munmap函数的功能。

原则上用户空间不能访问设备空间,mmap函数能把用户空间和设备空间进行映射,使得对用户空间的访问等同于对设备空间的访问。mmap具体功能有两个:其一,将普通文件映射到内存中,通常在需要对文件进行频繁读写时使用,这样用内存读写取代I/O读写,以获得较高的性能。其二,为无关联的进程提供共享内存空间,一般也是将一个普通文件映射到内存中。

当用户调用mmap函数,内核会进行如下处理:第一,在进程的虚拟空间查找一块VMA;第二,将这块VMA进行映射;第三,如果设备驱动程序或者文件系统的file_operations定义了mmap操作,则调用它;第四,将这个VMA插入进程的VMA链表中。

应用层测试mmap代码:

#include <sys/types.h>

#include <sys/stat.h>

#include <sys/mman.h>

#include <fcntl.h>

#include <stdio.h>

#include <string.h>

int main()

{

  int fd;

  char *map;

  char buf[20];

  fd=open("mmap_test", O_RDWR);

//创建内存区域,映射的起始地址通常为NULL,由内核指定

  map=mmap(NULL,20,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);

  strcpy(buf,map);  /*read date from map*/

  printf("%s",buf);

  strcpy(map,"This is a map test!");

  munmap(map,20);      //撤销内存区域

  close(fd);

  return 0;

}

页表

当应用程序访问一个虚拟地址时,首先必须将虚拟地址转化为物理地址,然后处理器才能解析地址访问请求,地址转换需要将虚拟地址分段,使每段虚拟地址都作为一个索引指向页表。Linux使用三级页表完成地址转换,顶级页表是页全局目录(PGD),它包含一个pgd_t类型数组,其中表项指向PMD中的表项,在内存描述符mm_struct结构体中包含pgd_t类型数据;二级页表是中间页目录(PMD),它是一个pmd_t类型数组,其中的表项指向PTE中的表项;最后一级的页表简称页表,它是一个pte_t类型数组,该页指向物理页面。多数情况下搜素页表的工作是由硬件完成的,操作和检索页表时必须使用内存描述符中的page_table_lock锁。

搜素内存中的物理地址速度很有限,为了加快搜素,多数体系结构都实现了一个TLB(转换旁路缓存)TLB作为一个将虚拟地址映射到物理地址的硬件缓存。当请求访问一个虚拟地址时,处理器将首先检查TLB中是否缓存了该虚拟地址到物理地址的映射,如果在缓存中直接命中,物理地址就立刻返回,否则,就需要再通过页表搜索需要的物理地址。2.6版本内核对页表管理的主要改进是从高端内存分配部分页表。未来改进的地方包括通过写时拷贝的方式共享页表,这样可以消除fork操作时页表拷贝所带来的消耗。

内容概要:该论文聚焦于T2WI核磁共振图像超分辨率问题,提出了一种利用T1WI模态作为辅助信息的跨模态解决方案。其主要贡献包括:提出基于高频信息约束的网络框架,通过主干特征提取分支和高频结构先验建模分支结合Transformer模块和注意力机制有效重建高频细节;设计渐进式特征匹配融合框架,采用多阶段相似特征匹配算法提高匹配鲁棒性;引入模型量化技术降低推理资源需求。实验结果表明,该方法不仅提高了超分辨率性能,还保持了图像质量。 适合人群:从事医学图像处理、计算机视觉领域的研究人员和工程师,尤其是对核磁共振图像超分辨率感兴趣的学者和技术开发者。 使用场景及目标:①适用于需要提升T2WI核磁共振图像分辨率的应用场景;②目标是通过跨模态信息融合提高图像质量,解决传统单模态方法难以克服的高频细节丢失问题;③为临床诊断提供更高质量的影像资料,帮助医生更准确地识别病灶。 其他说明:论文不仅提供了详细的网络架构设计与实现代码,还深入探讨了跨模态噪声的本质、高频信息约束的实现方式以及渐进式特征匹配的具体过程。此外,作者还对模型进行了量化处理,使得该方法可以在资源受限环境下高效运行。阅读时应重点关注论文中提到的技术创新点及其背后的原理,理解如何通过跨模态信息融合提升图像重建效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值