Linux内存管理(下)

Linux 内存管理 本文详细的介绍了多种内存管理方式,同时详细介绍了Linux下的内存管理方式 阅读详情

物理内存管理(页管理)

Linux内核管理物理内存是通过分页机制实现的,它将整个内存划分成无数4k(在i386体系结构中)大小页,从而分配和回收内存的基本单位便是内存页了。利用分页管理有助于灵活分配内存地址,因为分配时不必要求必须有大块的连续内存[1],系统可以东一页、西一页的凑出所需要的内存供进程使用。虽然如此,但是实际上系统使用内存还是倾向于分配连续的内存块,因为分配连续内存时,页表不需要更改,因此能降低TLB的刷新率(频繁刷新会很大增加访问速度)。

鉴于上述需求,内核分配物理页为了尽量减少不连续情况,采用了“伙伴”关系来管理空闲页框。伙伴关系分配算法大家不应陌生——几乎所有操作系统书都会提到,我们不去详细说它了,如果不明白可以参看有关资料。这里只需要大家明白Linux中空闲页面的组织和管理利用了伙伴关系,因此空闲页面分配时也需要遵循伙伴关系,最小单位只能是2的幂倍页面大小。内核中分配空闲页框的基本函数是get_free_page/get_free_pages,它们或是分配单页或是分配指定的页框(2、4、8…512页)。

 注意:get_free_page是在内核中分配内存,不同于malloc在用户空间中分配,malloc利用堆动态分配,实际上是调用brk()系统调用,该调用的作用是扩大或缩小进程堆空间(它会修改进程的brk域)。如果现有的内存区域不够容纳堆空间,则会以页面大小的倍数位单位,扩张或收缩对应的内存区域,但brk值并非以页面大小为倍数修改,而是按实际请求修改。因此Malloc在用户空间分配内存可以以字节为单位分配,但内核在内部仍然会是以页为单位分配的。

   另外需要提及的是,物理页在系统中由页框结构struct paga描述,系统中所有的页框存储在数组mem_map[]中,可以通过该数组找到系统中的每一页(空闲或非空闲)。而其中的空闲页框则可由上述提到的以伙伴关系组织的空闲页链表(free_area[MAX_ORDER])索引。

 内核内存使用

Slab

    所谓尺有所长,寸有所短。以页为最小单位分配内存对于内核管理系统物理内存来说的确比较方便,但内核自身最常使用的内存却往往是很小(远远小于一页)的内存块——比如存放文件描述符、进程描述符、虚拟内存区域描述符等行为所需的内存都不足一页。这些用来存放描述符的内存相比页面而言,就好比是面包屑与面包。一个整页中可以聚集多个这种这些小块内存;而且这些小块内存块也和面包屑一样频繁地生成/销毁。

  为了满足内核对这种小内存块的需要,Linux系统采用了一种被称为slab分配器的技术。Slab分配器的实现相当复杂,但原理不难,其核心思想就是“存储池[2]”的运用。内存片段(小块内存)被看作对象,当被使用完后,并不直接释放而是被缓存到“存储池”里,留做下次使用,这无疑避免了频繁创建与销毁对象所带来的额外负载。

Slab技术不但避免了内存内部分片(下文将解释)带来的不便(引入Slab分配器的主要目的是为了减少对伙伴系统分配算法的调用次数——频繁分配和回收必然会导致内存碎片——难以找到大块连续的可用内存),而且可以很好利用硬件缓存提高访问速度。

    Slab并非是脱离伙伴关系而独立存在的一种内存分配方式,slab仍然是建立在页面基础之上,换句话说,Slab将页面(来自于伙伴关系管理的空闲页框链)撕碎成众多小内存块以供分配,slab中的对象分配和销毁使用kmem_cache_alloc与kmem_cache_free。

 

Kmalloc

Slab分配器不仅仅只用来存放内核专用的结构体,它还被用来处理内核对小块内存的请求。当然鉴于Slab分配器的特点,一般来说内核程序中对小于一页的小块内存的求情才通过Slab分配器提供的接口Kmalloc来完成(虽然它可分配32 到131072字节的内存)。从内核内存分配角度讲kmalloc可被看成是get_free_page(s)的一个有效补充,内存分配粒度更灵活了。

有兴趣的话可以到/proc/slabinfo中找到内核执行现场使用的各种slab信息统计,其中你会看到系统中所有slab的使用信息。从信息中可以看到系统中除了专用结构体使用的slab外,还存在大量为Kmalloc而准备的Slab(其中有些为dma准备的)。

 

 

内核非连续内存分配(Vmalloc)

 

伙伴关系也好、slab技术也好,从内存管理理论角度而言目的基本是一致的,它们都是为了防止“分片”,不过分片又分为外部分片和内部分片之说,所谓内部分片是说系统为了满足一小段内存区(连续)的需要,不得不分配了一大区域连续内存给它,从而造成了空间浪费;外部分片是指系统虽有足够的内存,但却是分散的碎片,无法满足对大块“连续内存”的需求。无论何种分片都是系统有效利用内存的障碍。slab分配器使得含与一个页面内众多小块内存可独立被分配使用,避免了内部分片,节约了空闲内存。伙伴关系把内存块按大小分组管理,一定程度上减轻了外部分片的危害,因为页框分配不在盲目,而是按照大小依次有序进行,不过伙伴关系只是减轻了外部分片,但并未彻底消除。你自己笔画一下多次分配页框后,空闲内存的剩余情况吧。

所以避免外部分片的最终思路还是落到了如何利用不连续的内存块组合成“看起来很大的内存块”——这里的情况很类似于用户空间分配虚拟内存,内存逻辑上连续,其实影射到并不一定连续的物理内存上。Linux内核借用了这个技术,允许内核程序在内核地址空间中分配虚拟地址,同样也利用页表(内核页表)将虚拟地址影射到分散的内存页上。以此完美地解决了内核内存使用中的外部分片问题。内核提供vmalloc函数分配内核虚拟内存,该函数不同于kmalloc,它可以分配较Kmalloc大得多的内存空间(可远大于128K,但必须是页大小的倍数),但相比Kmalloc来说Vmalloc需要对内核虚拟地址进行重影射,必须更新内核页表,因此分配效率上要低一些(用空间换时间)

与用户进程相似内核也有一个名为init_mm的mm_strcut结构来描述内核地址空间,其中页表项pdg=swapper_pg_dir包含了系统内核空间(3G-4G)的映射关系。因此vmalloc分配内核虚拟地址必须更新内核页表,而kmalloc或get_free_page由于分配的连续内存,所以不需要更新内核页表。

 

空闲页框

APP

内存区域 vm_area_structs

malloc、fork、excute、mmap

brk/do_map

get_free_page(s)

用户空间

内核空间

进程虚拟地址空间

 

系统调用

进程页表

 

请页异常

内核程序

物理内存影射区

Vmalloc分配区

slab

get_free_page(s)

内核页表

get_free_page(s)

请页异常

vmalloc分配的内核虚拟内存与kmalloc/get_free_page分配的内核虚拟内存位于不同的区间,不会重叠。因为内核虚拟空间被分区管理,各司其职。进程空间地址分布从0到3G(其实是到PAGE_OFFSET,在0x86中它等于0xC0000000),从3G到vmalloc_start这段地址是物理内存映射区域(该区域中包含了内核镜像、物理页框表mem_map等等)比如我使用的系统内存是64M(可以用free看到),那么(3G——3G+64M)这片内存就应该映射物理内存,而vmalloc_start位置应在3G+64M附近(说附近因为是在物理内存映射区与vmalloc_start期间还回存在一个8M大小的gap来防止跃界),vmalloc_end的位置接近4G(说接近是因为最后位置系统会保留一片128k大小的区域用于专用页面映射,还由可能会由高端内存映射区,这些都是细节,这里我们不做纠缠)。

 

 

 

进程地址空间

物理内存映射区

 

0

3G

内核虚拟空间

Vmalloc_start

Vmalloc_end

上图是内存分布的模糊轮廓

 

   由get_free_page或Kmalloc函数所分配的连续内存都陷于物理映射区域,所以它们返回的内核虚拟地址和实际物理地址仅仅是相差一个偏移量(PAGE_OFFSET),你可以很方便的将其转化为物理内存地址,同时内核也提供了virt_to_phys()函数将内核虚拟空间中的物理影射区地址转化为物理地址。要知道,物理内存映射区中的地址与内核页表是有序对应,系统中的每个物理页框都可以找到它对应的内核虚拟地址(在物理内存映射区中的)。

而vmalloc分配的地址则限于vmalloc_start与vmalloc_end之间。每一块vmalloc分配的内核虚拟内存都对应一个vm_struct结构体(可别和vm_area_struct搞混,那可是进程虚拟内存区域的结构),不同的内核虚拟地址被4k打大小空闲区的间隔,以防止越界——见下图)。与进程虚拟地址的特性一样,这些虚拟地址可与物理内存没有简单的位移关系,必须通过内核页表才可转换为物理地址或物理页。它们有可能尚未被映射,在发生缺页时才真正分配物理页框。

 

这里给出一个小程序帮助大家认请上面几种分配函数所对应的区域。

#include<linux/module.h>

#include<linux/slab.h>

#include<linux/vmalloc.h>

unsigned char *pagemem;

unsigned char *kmallocmem;

unsigned char *vmallocmem;

int init_module(void)

{

 pagemem = get_free_page(0);

 printk("<1>pagemem=%s",pagemem);

 kmallocmem = kmalloc(100,0);

 printk("<1>kmallocmem=%s",kmallocmem);

 vmallocmem = vmalloc(1000000);

 printk("<1>vmallocmem=%s",vmallocmem);

}

void cleanup_module(void)

{

 free_page(pagemem);

 kfree(kmallocmem);

 vfree(vmallocmem);

}

 

内存管理实例

代码功能介绍

我们希望能通过访问用户空间的内存达到读取内核数据的目的,这样便可进行内核空间到用户空间的大规模信息传输。

具体的讲,我们要利用内存映射功能,将系统内核中的一部分虚拟内存映射到用户空间,从而使得用户空间地址等同与被映射的内核内存地址。

代码结构体系介绍

内核空间内存分配介绍

因此我们将试图写一个虚拟字符设备驱动程序,通过它将系统内核空间映射到用户空间——将内核虚拟内存映射到用户虚拟地址。当然映射地址时少不了定位内核空间对应的物理地址,并且还要建立新的用户页表项,以便用户进程寻址时能找到对应的物理内存。

从中应该看出,需要我完成既定目标,我们需要获得:被映射内核空间物理地址 和 建立对应的用户进程页表。

在内核空间中主要存在kmalloc分配的物理连续空间和vmalloc分配的非物理连续空间。kmalloc分配的空间往往被称为内核逻辑地址,由于它是连续分配(直接处理物理页框),而且分配首地址一定,所以其分配的内核虚拟地址对应的实际物理地址很容易获得:内核虚拟地址—PAGE_OFFSET(0xC0000000)(内核有对应例程virt_to_phys)即等于物理地址,而且其对应的页表属于内核页表(swapper_pg_dir)——在系统初始化时就以建立,因此省去了建立页表的工作。

而vmalloc分配的空间被称为内核虚拟地址,它的问题相对要复杂些,这是因为其分配的内核虚拟内存空间并非直接操作页框,而是分配的是vm_struct结构。该结构逻辑上连续但对应的物理内存并非连续,也就是说它vamlloc分配的内核空间地址所对应的物理地址并非可通过简单线性运算获得。从这个意义上讲,它的物理地址在分配前是不确定的,因此虽然vmalloc分配的空间与kmalloc一样都是由内核页表来映射的,但vmalloc分配内核虚拟地址时必须更新内核页表。

 

注释:vmalloc分配的内核虚拟内存与kmalloc/get_free_page分配的内核逻辑内存位于不同的区间,不会重叠。因为内核空间被分区管理,各司其职。进程空间地址分布从0到3G(其实是到PAGE_OFFSET,在0x86中它等于0xC0000000),从3G到vmalloc_start这段地址是物理内存映射区域(该区域中包含了内核镜像、物理页框表mem_map等等)比如我使用的系统内存是64M(可以用free看到),那么(3G——3G+64M)这片内存就应该映射物理内存,而vmalloc_start位置应在3G+64M附近(说附近因为是在物理内存映射区与vmalloc_start期间还回存在一个8M大小的gap来防止跃界),vmalloc_end的位置接近4G(说接近是因为最后位置系统会保留一片128k大小的区域用于专用页面映射,还由可能会由高端内存映射区,这些都是细节,这里我们不做纠缠)。

       另一个需要澄清的是,vmalloc分配的内核空间,其结构是vm_area,可千万别与用户空间malloc分配的vm_area_struct结构混淆。前者由内核页表映射,而后者则由用户页表映射。

 

 

进程地址空间

 

物理内存映射区kmalloc分配

 

 Vmalloc 分配区

 

0

 

3G(page_offset)

 

内核虚拟空间

 

Vmalloc_start

 

Vmalloc_end

 

上图是内存分布的模糊轮廓

 

实例蓝图

为了近可能丰富我们的例子程序的场景,我们选择映射vmalloc分配的内核虚拟空间(下面我们简称为vk地址)到用户空间。

要知道用户进程操作的是虚拟内存区域vm_area_struct,我们此刻需要将用户vma区间利用用户页表映射到vk对应的物理内存上去(如下图所示)。这里主要工作便是建立用户也表项完成映射工作,而这个工作完全落在了vma->nopage[3]操作上,该方法会帮助我们在发生“缺页”时,动态构造映射所需物理内存的页表项。

 

 

用户虚拟空间Vm_area_struct

Vk空间vm_struct

物理内存

Vma->nopage

 

 

 

 

我们需要实现nopage方法,动态建立对应页表,而在该方法中核心任务是寻找到vk地址对应的内核逻辑地址[4]。这必然需要我们做以下工作:

a)         找到vmalloc虚拟内存对应的内核页表,并寻找到对应的内核页表项。

b)        获取内核页表项对应的物理页框指针。

c)        通过页框得到对应的内核逻辑地址。

基本函数

我们实例将利用一个虚拟字符驱动程序,驱动负责将一定长的内核虚拟地址(vmalloc分配的)映射到设备文件上,以便可以通过访问文件内容来达到访问内存的目的。这样做的最大好处是提高了内存访问速度,并且可以利用文件系统的接口编程(设备在Linux中作为特殊文件处理)访问内存,降低了开发难度。

 

 Map_driver.c就是我们的虚拟字符驱动程序,不用说它要实现文件操作表(file_operations——字符驱动程序主要做的工作便是实现该结构)中的,为了要完成内存映射,除了常规的open/release操作外,必须自己实现mmap操作,该函数将给定的文件映射到指定的地址空间上,也就是说它将负责把vmalloc分配的内核地址映射到我们的设备文件上。

我们下面就谈谈mmap操作的实现细节:

文件操作的mmap操作是在用户进行系统调用mmap[5]时被执行的,而且在调用前内核已经给用户找到并分配了合适的虚拟内存区域vm_area_struct,这个区域将代表文件内容,所以剩下要做的便是如何把虚拟区域和物理内存挂接到一起了,即构造页表。由于我门前面所说的原因,我们系统中页表需要动态分配,因此不可使用remap_page_range函数一次分配完成,而必须使用虚拟内存区域自带的nopage方法,在现场构造页表。这样以来,文件操作的mmap的方法只要完成“为它得到的虚拟内存区域绑定对应的操作表vm_operations”即可。于是主要的构造工作就落在了vm_operations中的nopage方法上了。

Nopage方法中核心内容上面已经提到了是“寻找到vk地址对应的内核逻辑地址”,这个解析内核页表的工作是需要自己编写辅助函数vaddr_to_kaddr来完成的,它所作的工作概括来讲就是上文提到的a/b/c三条。

有关整个任务执行路径请看下图。

STEP BY STEP

编译map_driver.c为map_driver.o模块,具体参数见Makefile

加载模块 :insmod map_driver.o

生成对应的设备文件

1 在/proc/devices下找到map_driver对应的设备命和设备号:grep mapdrv /proc/devices

2 建立设备文件mknod  mapfile c 254 0  (在我系统里设备号为254)

    利用maptest读取mapfile文件,将取自内核的信息(”ok”——我们在内核中在vmalloc分配的空间中填放的信息)打印到用户屏幕。

 

全部程序下载 mmap.tar (感谢Martin Frey,该程序主体出自他的灵感)

 

 

 

 

 

 



[1] 还有些情况必须要求内存连续,比如DMA传输中使用的内存,由于不涉及页机制所以必须连续分配。

[2] 这种存储池的思想在计算机科学里广泛应用,比如数据库连接池、内存访问池等等。

[3] 构建用户也表项,除了使用nopage一次一页的动态构造,还又一种方法remap_page_range可以一次构造一段内存范围的也表项,但显然这个方法时针对物理内存连续被分配时使用的,而我们vk对应的物理内存并非连续,所以这里使用nopage。

[4] 很多人一定会问,为什么不直接找到物理地址那,而要找内核逻辑地址呢? 没错,我们本意应该是获得物理地址,但是为了利用内核提供的一些现成的例程,如virt_to_page等(它们都是针对内核逻辑地址而言的),我们不妨转化成内核逻辑地址来做,别忘了内核逻辑地址与理地址仅仅相差一个偏移量。

[5] 系统调用mmap原形是void *mmap2(void *start, size_t length, int prot, int flags, int fd, off_t pgoff)。

 
******************************************************************分段与分页*****************************************************************
分段就是把存储器分为CS,DS,ES,SS等几个段。
分页机制是在分段之后,系统管理内存采取的一种手段。具体的说,分页采用两级表结构,第一级为页目录,第二级为页表,这两层结构相当于两层索引,系统通过查找这两级页表把线性地址转换成物理地址。程序使用的都是逻辑地址,非物理的。处理器在得到逻辑地址后首先通过分段机制转换为线性地址,线性地址再通过分页机制转换为物理地址。
分页是附加功能,分段机制是必须的,分页机制是可选的。
如果不使用分页,那么线性地址将直接映射为物理地址。
Android中的Service:Binder,Messenger,AIDL(2) 前言前面一篇博文介绍了关于Service的一些基本知识,包括service是什么,怎么创建一个service,创建了一个service之后如何启动它等等。在这一篇博文里有一些需要前一篇铺垫的东西,建议没有看过前一篇博文的同学先去看一下前一篇: Android中的Service:默默的奉献者 (1) 。但是在前一篇博文中也有一些遗漏的东西——主要是关于bindService()这一块的具体细节。由于这 阅读详情

相关推荐

使用moveit中的报错及解决

1.fatal error: moveit/move_group_interface/move_group.h: 没有那个文件或目录。// #include <moveit/move_group_interface/move_group.h> 改为。问题1 moveit/move_group_interface/move_group.h: 没有那个文件或目录。在运行c++程序时报错。

qq_60566155的博客 2286

linux内存管理

对于物理内存内存,linux对内存的组织逻辑从上到下依次是:node,zone,page,这些page是根据buddy分配算法组织的,看下面两张图:

wwwlyj123321的博客 4547

产业大脑+未来工厂:揭秘浙江数字经济系统的5大核心场景搭建指南

本文深入解析了“产业大脑+未来工厂”这一浙江数字经济系统的核心范式,并提供了五大核心场景的实战搭建指南。文章详细阐述了从供应链协同、产能共享到产品创新、质量追溯及绿色低碳等关键场景的构建逻辑与技术架构,旨在帮助企业实现从技术驱动到场景驱动的价值落地,破解数据孤岛难题,提升产业链整体效能。

mac99的博客 667

Windows内存管理学习笔记(二)—— 物理内存的管理

Windows内存管理学习笔记(二)—— 物理内存的管理前言物理内存实验一:理解MmNumberOfPhysicalPagesMmPfnDatabase_MMPFN物理页状态六个链表实验二:理解零化链表实验三:查看进程占用的所有物理页 前言 一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com 二、海东老师牛逼! 物理内存 最大物理内存 10-10-12分页:最多识别4GB物理内存 2-9-9-12分页:最多识别64GB物理内存 操作系统限制 在xp系统中,即使采用2-9

lzyddf的博客 2396

PyTorch复现PSMNet踩坑全记录:从环境配置到KITTI数据集训练

本文详细记录了使用PyTorch复现CVPR经典立体匹配模型PSMNet的全过程,从环境配置到KITTI数据集训练,特别针对2023年主流软硬件环境中的常见问题提供解决方案。文章重点介绍了PSMNet的金字塔池化模块和堆叠沙漏结构,帮助研究者和工程师快速实现工业级深度估计,节省大量试错时间。

weixin_30897233的博客 328

水下机器人仿真平台选型指南:从AirSim到Unity3D的深度对比

本文深入对比了AirSim+UE和Unity3D两大水下机器人仿真平台的核心架构、传感器仿真能力和水下环境建模特点。AirSim+UE凭借高精度物理仿真和丰富传感器支持成为专业研发首选,而Unity3D则以快速开发和灵活扩展见长。文章为研发团队提供了全面的选型指南,帮助优化水下实验的仿真效率与成本。

weixin_29009669的博客 453

关于 Linux 内存管理

Linux 内存管理涵盖了分配、释放、映射、交换、压缩、保护和监控等操作。最大限度地利用内存;保证系统的稳定与可靠;为应用提供抽象且隔离的运行环境。内存管理是操作系统对硬件内存资源的抽象与管理。它通过虚拟内存机制将进程的地址空间与物理内存解耦,使得每个进程都“感觉”自己独占了整个内存空间。物理内存是计算机中的主存(DRAM),它是 CPU 运行程序的直接存储区域。速度快:比磁盘快,但比 CPU 缓存慢;容量有限:受硬件限制;寻址方式:通过物理地址直接访问。

m0_74258518的博客 1089

VOSviewer文献可视化006:修改节点标签文字

由VOSviewer软件生成的可视化图形所显示的文字是小写的,有时候,我们希望其所显示的数据(如国家或作者的首字母等)能够以大写的方式呈现,这时可以进行对节点标签文字的修改操作,使图形显示我们想要的一个效果。

qq_41725964的博客 6152

Linux内核之内存管理

NUMA(Non-Uniform Memory Access,非统一内存访问)是一种多处理器系统的内存架构。内存被划分为多个节点(node),每个节点与一个或多个处理器核心相关联。处理器访问本地节点内存的延迟较低,访问远程节点内存的延迟较高。以上是我自己学习内存管理时所做的笔记,很多抽象的东西用了通俗的语言来解释清楚,方便在学习的过程中理解,如果你正好是在学习内存管理的相关内容,可以以我的笔记作为参考,如果你是需要突击内存管理相关的知识,也可以结合着大语言模型来进行学习。

qq_56187001的博客 1128

RK3588&RK3576实现 HW-ID DTB(动态加载不同的Kernel DTB)功能

RK平台的U-Boot⽀持检测硬件上的GPIO或者ADC状态动态加载不同的Kernel DTB,暂称为HW-ID DTB(Hardware id DTB)功能。

Wynter 849

【32】软考软件设计师——算法题(一):分治法与动态规划深度精讲|下午第4题常考满分攻略

本文是《软件设计师·50讲通关|从零基础到工程师职称》专栏第32篇,正式开启**模块四:应用技术(下午题)算法大题专项**,聚焦下午第4道高频必考大题核心两大算法:分治法与动态规划。全文超4000字深度拆解两大经典算法的底层核心思想、算法策略识别技巧、递归边界设计、状态转移方程推导,全覆盖代码填空高频考点、时间复杂度分析、经典题型解题套路;配套可直接默写的递归代码模板、DP状态设计范式、真题完整填空案例,彻底解决考生分不清分治与DP、递归边界写错、状态转移推不出、复杂度算不对四大核心痛点。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 639

Linux内存管理

Linux 是为多用户多任务设计的操作系统,所以存储资源要被多个进程有效共享;且由于程序规模的不断膨胀,要求的内存空间比从前大得多。Linux 内存管理的设计充分利用了 计算机系统所提供的虚拟存储技术,真正实现了虚拟存储器管理。第二章介绍的 Intel 386 的段机制和页机制是 Linux 实现虚拟存储管理的一种硬件平台。

qq_28576837的博客 1190

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

linux 内存管理

目录 1Linux内存管理概述 1.1 内存的层次结构 1.2 虚拟内存概述 1.2.1 虚拟内存基本思想 1.2.2 进程虚拟地址空间 1.3 内核空间到物理空间的映射 1.3.1 内核空间的线性映射 1.3.2 内核镜像的物理存储 1.4 虚拟内存实现机制 2进程用户空间管理 2.1 进程用户空间布局 2.2 进程用户空间的内核描述 2.2.1 概述 2.2.2 mm_struct 结构 2.2.3 vm_area_struct 结构 2.2.4 实例:内核态打印虚存..

5755

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

linux的内存管理

Linux的内存管理是操作系统中至关重要的组成部分之一。它负责管理系统中的物理内存,以便进程可以访问和使用它。

weixin_39512905的博客 884

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【Linux内存管理】

解决内部内存碎片化。不连续页分配器提供分配内存的接口vmalloc和释放内存的接口vfree,在内存碎片化的时候,申请连续物理页的成功率很低,可以申请不连续的物理页,映射到连续的虚拟页,即虚拟地址连续页物理地址不连续,每处理器内存分配器用来为每处理器变量分司内存。为了使系统可以正确的访问页在对应页框中的映像,在把一个页映射到某个页框上的同时,就必须把页码和存放该页映像的页框码填入一个叫做页表的表项中,这个页表就是映射记录表。如果释放的块大小大于链表中的其他块,它可能会与相邻的块合并以形成一个更大的块。

weixin_40146547的博客 694

一文讲透Linux内存管理

Linux内存管理是指对系统内存的分配、释放、映射、管理、交换、压缩等一系列操作的管理。在Linux中,内存被划分为多个区域,每个区域有不同的作用,包括内核空间、用户空间、缓存、交换分区等。Linux内存管理的目标是最大限度地利用可用内存,同时保证系统的稳定和可靠性。内存管理是计算机系统中负责管理系统内存资源的一种机制,主要包括内存分配、内存释放、内存映射和虚拟内存管理等方面。它是计算机系统中非常重要的一个组成部分,能够有效地提高系统的资源利用率和应用程序的性能。

LinkSLA的博客 1874

Linux上的内存管理

 Linux上的内存管理 [ FAQ ]Q:什么是mm?A:这可不是meimei哦!指的是内存管理(memory management)。是内核中的一套软件机制,用于有效管理内存的使用。Q:内存管理的软件实现了什么功能?A:1) 进程的保护,即进程向内存管理请求的物理页,由内存管理系统负责,不会将同一物理页(共享页面除外)映射到不同进程的虚地址空间。?? 2) 虚存的实现,允许所有进程使用的内存总

hondrif82q的专栏 1755

linux内存管理概述

linux内存管理建立在基本的分页机制基础上,在linux内核中RAM的某些部分将会永久的分配给内核,并用来存放内核代码以及静态内核数据结构。RAM的其余部分称为动态内存,这不仅是进程所需的宝贵资源,也是内核本身所需的宝贵资源。实际上,整个系统的性能取决于如何有效地管理动态内存。因此,现在所有多任务操作系统都在经历优化对动态内存的使用,也就是说,尽可能做到当要时分配,不需要时释放。 内存管理是o

bullbat的专栏 4453

Linux内存管理图解

转自: http://www.cublog.cn/u3/94690/showart_2051283.htmlLinux内存管理图解作者:wdy一、逻辑地址转线性地址   机器语言指令中出现的内存地址,都是逻辑地址,需要转换成线性地址,再经过MMU(CPU中的内存管理单元)转换成物理地址才能够被访问到。我们写个最简单的hello world程序,用gccs编译,再反编译后会看到以下指令:mov    0x80495b0, %eax这里的内存地址0x80495b0 就是一个逻辑地址,必须加上隐含的DS 数据段的

guogaofeng1219的专栏 1131

Linux - 内存管理

【1】前言 内存管理是指软件运行时对计算机内存资源的分配和使用的技术。其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源。 内存管理是操作系统很重要的一部分。作为一个后端开发来说,了解操作系统是如何进行内存管理是必须要的。 【2】读前须知 在看正文之前,我们需要先了解一些相关的知识点帮助接下来的理解。 内存和外存 内存(RAM ) 可以大致理解为在市面上看到的内存条,通常有4G、16G等容量。有着易失性、容量较小、价格偏贵 读写很快得特点。这里需要和 CPU 的一二三级缓存分开理解哦

一七令 1646
上一篇: Linux内存管理(上)
下一篇: Linux实模式和保护模式
sooolo
博客等级 码龄17年 95粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值