原创:kylin_zeng http://blog.chinaunix.net/uid/23795897.html
一、
1、如果没有mmu,直接会使用物理地址,否则就会被mmu截获,因而使用虚拟地址。
2、分配小于128Kb的内存:kmalloc和kfree. 线性连续的虚拟地址 且 物理地址是连续的。
3、分配大块内存。get_zeroed_page,//返回单个的,零填充的页。
4、__get_free_pages;//获取整页的内存。
5、free_pages//释放面向页分配的函数。
以上物理内存都是连续的。
6、如要申请一片连续的虚拟内存,到时物理内存不是连续的。
vmalloc; vmalloc_user; vfree;
二、io端口到虚拟地址的映射。
1、外设的io内存资源的物理地址是已知的。由硬件的设计决定。linux的驱动程序不能直接通过物理地址访问i/o内存资源,而必须将物理地址映射到内核虚拟地址空间。
2、采用静态映射。arm中使用内存管理单元mmu实现虚拟地址到实际物理地址的映射,mmu通过查表映射。页表位于系统内存中。页表每一项对应一个虚拟地址到物理地址的映射。
3、动态映射:ioremap,将i/o内存资源的物理地址映射到内核虚拟地址空间中。iounmap//取消。
阅读(1271) | 评论(0) | 转发(0) |