linux内核开发板启动流程

来源:互联网 发布:淘宝代购利润是多少 编辑:程序博客网 时间:2024/06/05 09:32

声明:本文章是整理网上的资料和自己的理解

很早买了tiny6410开发板,内核使用配置好的,在内核Linux 2.6源码中包含了S3C6410 的驱动,最近想在自己的板子上移植Linux内核(内核源码没有中相关的配置),一直找不到思路,不知道Linux内核如何启动去配置相关的驱动的,在阅读内核启动的流程过程中(重点关注针对不同板子的驱动的加载流程,参考网上文章和博客),发现Linux的的板级的驱动流程,在此根据自己的理解整理,由于本人的技术有限,如果有错误的地方,望请大家提出。OK,现在进入正题。

一、boot到load kernel的过程(略)

二、kernel到板级驱动(S3C6410为例)

           Linux进入到kernel后进入 \init\main.c文件,调用函数过程start_kernel->setup_arch->setup_machine,setup_macine函数:

其中这个语句list = lookup_machine_type(nr);,使用arm汇编语言去找机器的类型,也就是板子的架构,汇编语言在head-common.s中:

BootLoader在引导启动内核的时候需要设置3个寄存器
r0– 0
r1 – 板子的ID号
r2 – 内核的参数链表地址,也就是TAG链表

代码中r3 = r5 + MACHINFO_TYPE=machine_desc结构中定义的nr成员,__lookup_machine_type函数将这个r1寄存器中的机器类型ID与machine_de sc结构中的nr成员比较,如果相等则表示找到了匹配的machine_desc结构,于是返回它的地址(存于r5中),如果__arch_machine_begin和__arch_ machine_end间所有machine_desc结构的nr成员都不等于r1寄存器中的值,则返回0(r5等于0)。

接下来是结构体定义:

          

原型:         

          

其中__attribute__((__section__(".arch.info.init")))放在__section__(".arch.info.init")是初始化的数据,uboot根据.nr = MACH_TYPE_# #_type的数据,也就是MACH_TYPE_S3C2440这个对应的数值,返回给lookup_machine_type函数做参数,找到machine_desc对应的数据。

nr的具体定义是在/arm/arch/tools/mach-types上面:         

         

   之后在setup_macine函数中,用三个全局变量纪录回调函数:
    
    对板子上的驱动的加载。
    
0 0
原创粉丝点击