米乐m6官网
您现在的位置:首页 > 产品展示 > LED驱动

浅谈剖析Arm linux 内核移植及体系初始化的进程二

发布时间:2022-10-23 18:48:35 来源:米乐m6官网

  Resource结构体主要是描绘了设备在体系中的起止地址、称号、标志以及为了链式描绘便利指向本结构体类型的指针。Resource界说的实例将被添加到platform_device结构体目标中去。

  Platform_device结构体包含结构体的称号、ID号、渠道相关的信息、设备的数目以及上面界说的resource信息。Platform_device结构目标将被直接经过设备操作函数注册导体系中去。详细注册和刊出进程鄙人一节介绍。

  由此可见在.arch.info.init段内存放了__desc_mach_desc_SMDK2410结构体。初始化了相应的初始化函数指针。问题又来了, 这些初始化指针函数是什么时分被调用的呢?

  Start_kernel() 函数担任初始化内核各子体系,最终调用reset_init(),发动一个叫做init的内核线程,持续初始化。在init内核线程中,将履行下列 init()函数的程序。Init()函数担任完结根文件体系的挂接、初始化设备驱动程序和发动用户空间的init进程等重要工作。

  driver_init(); /* 初始化驱动程序模型。调用驱动初始化函数初始化子体系。 */

  分 析上面一段代码能够看出,设备的初始化是经过do_basic_setup()函数调用do_initcalls()函数,完成 __initcall_start, __initcall_end段之间的指针函数履行的。而到底是那些驱动函数怎样会被会集到这个段内的呢?咱们知道体系内存空间的分配是由链接器ld读取 链接脚本文件决议。链接器将相同特点的文件安排到相同的段里边去,如一切的.text段都被放在一同。在链接脚本里边能够获得某块内存空间的详细地址。我 们来看下linux-2.6.18.8archarmkernelvmlinux.lds.S文件。因为文件过长,只贴出和 __initcall_start, __initcall_end相关的部分。

  由此能够判别,一切的设备驱动函数都必定经过*_initcall(fn)宏的处理。以此为进口,能够查询一切的设备驱动。