转自:http://blog.csdn.net/lizuobin2/
在前面学习的过程中,看代码时遇到 arch_initcall(xxx) 等函数总是处于愣神的状态,对于最基础的 module_init(xxx) 也只是拿来用用,不知道幕后的东西,了解 MACHINE_START 创建了一个 machine_desc ,却不知道 machine_desc->map_io 等函数时何时调用的。
这篇文章,就来搞定他们,再遇到它们时,拒绝懵比!
首先,来看下链接脚本的缩略版:
1、*(.proc.info.init) 段
内核中,定义了若干个 proc_info_list 结构,它的结构原形在 include/asm-arm/procinfo.h 中,表示它所支持的CPU。
2、 *(.arch.info.init) 段
*(.arch.info.init) 段,存放的是内核所支持的单板信息如机器ID、其实IO物理地址等,它由 MACHINE_START、MACHINE_END 定义。
顺便看一下 map_io 等函数的调用时机:
先后顺序:
start_kernel -》setup_arch -》 map_io -》 init_irq -》 timer -》 init_machinemap_io 函数中 会对内核进行分区还有时钟、串口的初始化,移植内核时需注意!(传入的机器ID不同,调用的初始化函数自然不同咯)
3、*(.taglist.init)
*(.taglist.init) 段存放的是 uboot 传递到内核的 tag 的处理函数。在 uboot 中,定义了一个 tag 结构体,里面存放要传递给内核的信息,Uboot 将 tag 依次排放在和内核约定的地点,如s3c2440是 0x30000100 处,排放顺序是有要求的,必须以 ATAG_CORE 标记的 tag 开头,以 ATAG_NONE 为标记的 tag 结尾。
arch\arm\kernel\setup.c