- 4
- 0
- 约8.42千字
- 约 27页
- 2017-01-01 发布于河南
- 举报
内存与IO
如何使用内存分配的Flag Process context, can sleep Use GFP_KERNEL. Process context, cannot sleep Use GFP_ATOMIC, or perform your allocations with GFP_KERNEL at an earlier or later point when you can sleep. Interrupt handler Use GFP_ATOMIC. Softirq Use GFP_ATOMIC. Tasklet Use GFP_ATOMIC. Need DMA-able memory, can sleep Use (GFP_DMA | GFP_KERNEL). Need DMA-able memory, cannot sleep Use (GFP_DMA | GFP_ATOMIC), or perform your allocation at an earlier point when you can sleep. 本章结构 Linux内存管理 中断与时钟 kmalloc函数 get_free_page和相关函数 vmalloc及辅助函数 分配内存 虚拟地址与物理地址关系 I/O端口和I/O内存访问 将设备地址映射到用户空间 时间、延迟及延缓操作 DMA DMA和Cache一致性问题 Linux下DMA编程 在PC系统中,内存区域类型如下分布 ZONE_DMA??? 0-16MB (针对ISA设备) ZONE_NORMAL? 16MB-896MB ZONE_HIGHMEM 896MB-物理内存结束 ARM DMA内存没有16M的限制 6-1 Linux地址类型 内核逻辑地址 内核逻辑地址组成了内核的常规地址空间。 该地址映射了部分(或者全部)内存, 并经常被视为物理地址。 与物理地址是线性映射的 例如,kmalloc返回的是逻辑地址 内核虚拟地址 内核虚拟地址和逻辑地址的相同之处在于,它们都将内核空间的地址映射到物理地址上。 与物理地址不必是线性映射关系 地址的转换 6-1 物理地址和页 物理地址被分成离散的大小相等单元,称之为页 Linux系统内部许多对内存的操作都是基于页的。 每个页的大小通常为4096个字节 ,具体的大小在asm/page.h 中用PAGE_SIZE定义 页号 PAGE_SHIFT 11 12 0 31 6-1 内存映射和页结构 page的数据结构:struct page{…}; linux/mm.h atomic_t count; 对该页的访问计数。当计数值为0时,该页将返回给空闲链表。 void *virtual; 如果页面被映射,则指向页的内核虚拟地址;如果未被映射则为NULL。 unsigned long flags; 描述页状态的一系列标志. PG_locked表示内存中的页已经被锁住 PG_reserved表示禁止内存管理系统访问该页。 6-2 分配内存 内核为设备驱动程序提供了一致的内存管理接口 分配内存的方法包括 kmalloc函数 get_free_page和相关函数 vmalloc及其辅助函数 获取大的缓冲区 6-2 kmalloc 分配小块的内存 Flag参数 6-2 如何使用内存分配的Flag Process context, can sleep Use GFP_KERNEL. Process context, cannot sleep Use GFP_ATOMIC, or perform your allocations with GFP_KERNEL at an earlier or later point when you can sleep. Interrupt handler Use GFP_ATOMIC. Softirq Use GFP_ATOMIC. Tasklet Use GFP_ATOMIC. Need DMA-able memory, can sleep Use (GFP_DMA | GFP_KERNEL). Need DMA-able memory, cannot sleep Use (GFP_DMA | GFP_ATOMIC), or perform your allocation at an earlier point when you can sleep. 6-2 kmalloc函数 #includelinux/slab.h void *kmalloc( size_t size,int flags ); 分配的内存大小(字节数) 通常最好不要分配大于128KB的内存 GFP_KE
原创力文档

文档评论(0)