ARM Linux静态映射分析
smdk2410_map_io, .init_irq = s3c24xx_init_irq, .init_machine = smdk2410_init, .timer = &s3c24xx_timer, MACHINE_END 其中的宏MACHINE_START和MACHINE_END定义如下: #define MACHINE_END \ 其中MACH_TYPE_##_type 为GCC扩展语法中的字符拼接标识,在预编译的时候会用真正的字符代替,比如我们这里就是MACH_TYPE_SMDK2410 MACHINE_START的使用及各个成员函数的的放置位置以及调用过程如下: /* arch/include/asm-arm/mach-types.h */ 由上发现,MACHINE_START主要是定义了"struct machine_desc"的类型,放在 section(".arch.info.init"),是初始化数据,其所占用的内存在内核起来之后将会被释放. 这里的map_io成员即内核提供给用户的创建外设I/O资源到内核虚拟地址静态映射表的接口函数.map_io成员函数会在系统初始化过程中被调用,流程如下: 其他主要都在 setup_arch() 中用到. 用户可以在定义machine_desc结构体时指定map_io的接口函数,我们也正是这样做的. 接下来我们继续分析smdk2410_map_io的执行过程,流程如下: smdk2410_map_io-> s3c24xx_init_io(smdk2410_iodesc, ARRAY_SIZE(smdk2410_iodesc)) 下面来看一下s3c24xx_init_io函数: void __init s3c24xx_init_io(struct map_desc *mach_desc, int mach_size) iotable_init内核提供,定义如下: /* 由上知道,smdk2410_map_io最终调用iotable_init建立映射表. iotable_init函数的参数有两个:一个是map_desc类型的结构体,另一个是该结构体的数量nr.这里最关键的就是struct map_desc.map_desc结构体定义如下: /* include/asm-arm/mach/map.h */ |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |