快速业务通道

ARM Linux静态映射分析

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-17
smdk2410_map_io,
.init_irq = s3c24xx_init_irq,
.init_machine = smdk2410_init,
.timer = &s3c24xx_timer,
MACHINE_END

其中的宏MACHINE_START和MACHINE_END定义如下:
/*
* Set of macros to define architecture features. This is built into
* a table by the linker.
*/
#define MACHINE_START(_type,_name) \
const struct machine_desc __mach_desc_##_type \
__attribute__((__section__(".arch.info.init"))) = { \
.nr = MACH_TYPE_##_type, \
.name = _name,

#define MACHINE_END \
};

其中MACH_TYPE_##_type 为GCC扩展语法中的字符拼接标识,在预编译的时候会用真正的字符代替,比如我们这里就是MACH_TYPE_SMDK2410

MACHINE_START的使用及各个成员函数的的放置位置以及调用过程如下:
MACH_TYPE_SMDK2410这个值是目标板的类型值,定义在arch/include/asm-arm/mach-types.h内,值为193.

/* arch/include/asm-arm/mach-types.h */
#define MACH_TYPE_SMDK2410 193

由上发现,MACHINE_START主要是定义了"struct machine_desc"的类型,放在 section(".arch.info.init"),是初始化数据,其所占用的内存在内核起来之后将会被释放.

这里的map_io成员即内核提供给用户的创建外设I/O资源到内核虚拟地址静态映射表的接口函数.map_io成员函数会在系统初始化过程中被调用,流程如下:
start_kernel -> setup_arch() --> paging_init()中被调用
struct machine_desc 结构体的各个成员函数在不同时期被调用:
1. .init_machine 在 arch/arm/kernel/setup.c 中被 customize_machine 调用,放在 arch_initcall( ) 段里面,会自动按顺序被调用(另外博客分析,敬请关注).
2. init_irq在start_kernel( ) --> init_IRQ( ) --> init_arch_irq( ) 被调用
3. map_io 在 setup_arch( ) --> paging_init( )被调用

其他主要都在 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)
{
/* register our io-tables */
iotable_init(s3c_iodesc, ARRAY_SIZE(s3c_iodesc));
……
}

iotable_init内核提供,定义如下:

/*
* Create the architecture specific mappings
*/
void __init iotable_init(struct map_desc *io_desc, int nr)
{
int i;
for (i = 0; i nr; i )
create_mapping(io_desc i);
}

由上知道,smdk2410_map_io最终调用iotable_init建立映射表.

iotable_init函数的参数有两个:一个是map_desc类型的结构体,另一个是该结构体的数量nr.这里最关键的就是struct map_desc.map_desc结构体定义如下:

/* include/asm-arm/mach/map.h */
struct map_desc {
unsigned long virtual;
unsigned long physical;
unsigned long length;

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号