Linux内存管理浅识

本文介绍了Linux内存管理的层次结构,包括UMA和NUMA模型,以及内存节点、区和页的概念。还讲解了页分配函数alloc_pages和释放函数__free_pages。此外,讨论了DMA的工作原理,如何减轻CPU负担并提高数据传输效率。

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

1.1内存组织

     从管理内存的方法区分:可以把计算机内存分为,一种UMA(一致性访问),另一种NUMA(非一致性访问)。


        对于UMA每一个CPU访问同一块内存,各CPU对内存的访问不存在性能差异;对于NUMA而言,各内存和CPU都通过总线连接在一起,每个CPU都有一个本地内存,访问速度较快,若CPU访问其他CPU的本地内存,速度很慢。

       Linux在内存组织中将最高层次定义为内存节点。UMA系统中定义一个内存节点,在NUMA系统中定义两个内存节点。Linux内存管理第二个层次定义为区,每个内存节点都划分为很多区,目前内核中定义一下几个区:
-  ZONE_DMA:适合DMA操作的内存区。
-  ZONE_DMA32:在64位系统上使用32位地址寻址的适合DMA操作的内存区。
-   ZONE_NORMAL:常规内存区域,指可以直接映射到内核空间的内存。
-   ZONE_HIGHMEM:高端内存。
-   ZONE_MOVEABLE:一个伪内存区域。
-   Linux内存管理的第三个层次为页,页的大小有CPU的内存管理单元MMU决定。
-     Linux内核是按页来管理内存的,最基本的内存分配和释放都是按页进行的。
1.2按页分配内存

    struct page *alloc_pages(gfp_t gfp_mask,unsigned int order);
    alloc_page(gfp_mask);
    void __free_pages(struct page *page,unsigned int order);

alloc_pages分配2的Oder次方连续的物理页,返回值为起始页struct page对象的地址,参数gfp_mask控制页面分配行为的一个掩码。

1.3 slab分配器

内核针对小块内存的分配器。

2、DMA工作原理

 

DMAC是DMA的控制器,若现在有大量数据需要传输,无DMA时则需要CPU处理,便会产生多次中断,数据搬移则加大CPU的负担,若有DMA的设备则会协助CPU完成数据传输,CPU只需要告诉DMA将一个内存起始地址若干个字节搬移到指定外设发送FIFO中,接受同理,DMAC就会启动存储总线数据搬移,结束后给CPU一个中断,通知CPU数据搬移完成,提高工作效率。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值