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数据搬移完成,提高工作效率。