动态映射和静态映射

静态映射:

内核移植时以代码的形式硬编码(代码里已经把它写固定了,即移植的时候已经设计好了要把哪个物理地址映射哪个虚拟地址),如果要更改的话必须改源代码后重新编译内核。开机时调用映射表建立函数,映射表建立函数。该函数根据映射表来建立linux内核的页表映射关系;
start_kernel
setup_arch
paging_init
devicemaps_init

if (mdesc->map_io)
mdesc->map_io();


对于移植好的内核,在内核启动时建立静态映射表,到内核关机时销毁,中间一直有效;

静态映射的好处是执行效率高,坏处是始终占用虚拟地址空间;

所谓映射表其实就是头文件中的宏定义,不同SoC,不同版本内核中静态映射表位置、文件名可能不同。

动态映射:

驱动程序根据需要随时动态地建立、使用和销毁映射;

映射是短期临时的,映射建立时,是要先申请再映射然后使用,使用完要解除映射时要先解除映射再释放申请;

动态映射的好处是按需使用虚拟地址空间,坏处是每次使用前后都需要用函数去建立映射和销毁映射。如:request_mem_region函数向内核申请(报告)需要映射的内存资源,ioremap函数真正用来实现映射,传给他物理地址他给你映射返回一个虚拟地址,iounmap函数结束映射,release_mem_region函数释资源。

注:

二种映射并不排斥,可以同时使用;静态映射类似于C语言中全局变量,动态方式类似于C语言中malloc堆内存。在实际大多数驱动开发工作中用动态还是用静态我们根本不用考虑,因为我们基本都是移植的。

猜你喜欢

转载自www.cnblogs.com/zhangshuaifeng/p/10625030.html