设备驱动(十一)

应用层申请内存
malloc, calloc, realloc, free

内核中申请内存
申请/释放/映射

按页分配(每页4K)
unsigned long __get_free_pages(int gfp_mask, unsigned long order)
得到的内存物理地址连续
gfp_mask 
GFP_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~128k
kfree
按指定大小分配(物理内存不连续)
vmalloc
物理内存不连续
vfree

X86内存分为
内存空间:RAM
IO空间 :端口
ARM只有内存空间
内核申请内存
 按页申请按指定大小申请(物理内存连续)按指定大小申请(物理内存不连续)
申请函数__get_free_pageskmallocvmalloc
释放函数free_pageskfreevfree
物理内存是否连续连续连续不一定
申请大小4K~8MB0~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);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值