内核中的2套虚拟地址映射方法:动态映射和静态映射

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

if (mdesc->map_io)
mdesc->map_io();
2)对于移植好的内核,在内核启动时建立静态映射表,到内核关机时销毁,中间一直有效;
3)静态映射的好处是执行效率高,坏处是始终占用虚拟地址空间;
4)所谓映射表其实就是头文件中的宏定义,不同SoC,不同版本内核中静态映射表位置、文件名可能不同。

动态映射:
1)驱动程序根据需要随时动态地建立、使用和销毁映射;
2)映射是短期临时的,映射建立时,是要先申请再映射然后使用,使用完要解除映射时要先解除映射再释放申请;
3)动态映射的好处是按需使用虚拟地址空间,坏处是每次使用前后都需要用函数去建立映射和销毁映射。如:request_mem_region函数向内核申请(报告)需要映射的内存资源,ioremap函数真正用来实现映射,传给他物理地址他给你映射返回一个虚拟地址,iounmap函数结束映射,release_mem_region函数释资源。

另外需要注意的是:
1)二种映射并不排斥,可以同时使用;静态映射类似于C语言中全局变量,动态方式类似于C语言中malloc堆内存。在实际大多数驱动开发工作中用动态还是用静态我们根本不用考录,因为写代码,我们都是抄的,说的好听点就是移植的,一般情况下只需要体会内核的代码是怎么写,自己认真体会就可以了。
2)内核提供的寄存器读写接口(arch/arm/include/asm/io.h):writel和readl,iowrite32和ioread32等

你可能感兴趣的:(Linux,kernel)