应用层申请内存
malloc, calloc, realloc, free
申请/释放/映射
按页分配(每页4K)
unsigned long __get_free_pages(int gfp_mask, unsigned long order)
得到的内存物理地址连续gfp_maskGFP_ATOMIC 不能分配也会返回GFP_KERNEL 不能分配会阻塞order取值范围(0~11)分配的内存大小为2^0页 ~ 2^11页返回内存首地址
释放内存
void free_pages(unsigned long addr, unsigned long order)
按指定大小分配(物理内存连续)
void *kmalloc(size_t, gfp_t);
物理内存连续范围0~128kkfree
按指定大小分配(物理内存不连续)
vmalloc物理内存不连续vfree
X86内存分为
内存空间:RAM
IO空间 :端口
ARM只有内存空间
内核申请内存
| 按页申请 | 按指定大小申请(物理内存连续) | 按指定大小申请(物理内存不连续) | |
| 申请函数 | __get_free_pages | kmalloc | vmalloc |
| 释放函数 | free_pages | kfree | vfree |
| 物理内存是否连续 | 连续 | 连续 | 不一定 |
| 申请大小 | 4K~8MB | 0~128KB | 没有指定上限 |
IO内存映射
void ioremap(unsigned long offset, unsigned long size);
offset 物理地址size 映射的字节个数返回值为映射好的虚拟地址
iounmap(void *addr);
addr 取消映射的虚拟地址
IO内存访问
unsigned int ioread8(u8 value, void *addr);unsigned int ioread16(u16 value, void *addr);unsigned int ioread32(u32 value, void *addr);
使用readl/writel进行内存访问
unsigned long readl(void *addr);void writel(unsigned long data, void *addr);


被折叠的 条评论
为什么被折叠?



