驱动系列之内存

内存类型

内存分为:虚拟内存,物理内存;
物理内存:真实存在的内存;
虚拟内存:对每个进程来说都有一个连续的内存空间,是一种缓存机制,并不是真实存在的;

虚拟地址:程序中使用的地址都是虚拟地址;
物理地址:总线地址线上的地址,地址线上的电信号相对应;一般在写驱动时,设备寄存器的地址均为物理地址;使用时,需将其转换为虚拟地址进行使用;
在这里插入图片描述

内存的分配

内核空间函数分配

函数名释放函数说明
kmalloc()kfree()分配内核内存,不仅在逻辑空间上连续,在物理空间上也连续
分配空间在3GB~high_memory
vmallocvfree()分配内核内存,仅在逻辑空间上连续
分配空间在high_memory~4G
get_free_pages()free_pages分配的单位为页
分配空间在3GB~high_memory
request_mem_region()relealse_mem_region()申请IO内存

内存地址之间的转换

函数名转换方向说明
virt_to_phys()虚拟地址→物理地址只能用于虚拟地址在空间在3GB~high_memory之间的转换
phys_to_virt()物理地址→虚拟地址只能用于物理地址在空间在0~high_memory-3G之间的转换

内存空间的映射

函数名映射方向说明
ioremap()物理地址→虚拟地址将IO内存进行映射,常和request_mem_region()配合使用
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页