欢迎转载,转载时需保留作者信息,谢谢。

邮箱:tangzhongp@163.com

博客园地址:http://www.cnblogs.com/embedded-tzp

Csdn博客地址:http://blog.csdn.net/xiayulewa

 

MACHINE_START定义了一个具体机器。Linux已经定义好了调用接口,只需要实现MACHINE_START中的成员即可。

 

Mach-mini2440.c (src\arch\arm\mach-s3c24xx)  中定义:

 

MACHINE_START(MINI2440, "MINI2440")

    /* Maintainer: Michel Pollet <buserror@gmail.com> */

    .atag_offset    = 0x100,

    .map_io     = mini2440_map_io,

    .init_machine   = mini2440_init,

    .init_irq   = s3c2440_init_irq,

    .init_time  = samsung_timer_init,

    .restart    = s3c244x_restart,

MACHINE_END

 

#define MACHINE_START(_type,_name)          \

static const struct machine_desc __mach_desc_##_type    \

 __used                         \

 __attribute__((__section__(".arch.info.init"))) = {    \

    .nr     = MACH_TYPE_##_type,        \

    .name       = _name,

 

#define MACHINE_END             \

};

可见编译后放置在段.arch.info.init中。

 

struct machine_desc成员的处理流程

 

Ø  init_machine:

start_kernel→rest_init→kernel_init→kernel_init_freeable→do_basic_setup→do_initcalls

 

static initcall_t *initcall_levels[] __initdata = {

    __initcall0_start,  /* 在src\arch\arm\kernel\vmlinux.lds中定义__initcall0_start = .; *(.initcall0.init) *(.initcall0s.init) */

    __initcall1_start, /* 在src\arch\arm\kernel\vmlinux.lds中定义*/

    __initcall2_start, /* 同上*/

    __initcall3_start, /* 同上*/

    __initcall4_start, /* 同上*/

    __initcall5_start, /* 同上*/

    __initcall6_start, /* 同上*/

    __initcall7_start, /* 同上*/

    __initcall_end, /* 同上*/

};

 

static void __init do_initcalls(void)

{

    int level;

 

    for (level = 0; level < ARRAY_SIZE(initcall_levels) - 1; level++)

        do_initcall_level(level);

}

 

因此do_initcalls函数会执行所有的在src\arch\arm\kernel\vmlinux.lds中定义的__initcall0_start与_initcall_end之间的段。

 

Setup.c (src\arch\arm\kernel)中有:

 

static int __init customize_machine(void)

{

    /*

     * customizes platform devices, or adds new ones

     * On DT based machines, we fall back to populating the

     * machine from the device tree, if no callback is provided,

     * otherwise we would always need an init_machine callback.

     */

    if (machine_desc->init_machine)

        machine_desc->init_machine();

#ifdef CONFIG_OF

    else

        of_platform_populate(NULL, of_default_bus_match_table,

                    NULL, NULL);

#endif

    return 0;

}

arch_initcall(customize_machine);

 

而Init.h (src\include\linux)中有:

#define arch_initcall(fn)       __define_initcall(fn, 3)

 

#define __define_initcall(fn, id) \

    static initcall_t __initcall_##fn##id __used \

__attribute__((__section__(".initcall" #id ".init"))) = fn

 

最后得到函数customize_machine被分配到了__initcall0_start与_initcall_end之间的段.initcall3.init.

 

总结:整个流程为: start_kernel→rest_init→kernel_init→kernel_init_freeable→do_basic_setup→do_initcalls→

customize_machine→machine_desc->init_machine()MACHINE_START宏定义的.init_machine   = mini2440_init

 

Ø  map_io:

setup_arch→paging_init→devicemaps_init→ mdesc->map_io();MACHINE_START宏定义的.map_io     = mini2440_map_io;

 

Ø  init_irq:

 

start_kernel→init_IRQ→init_irq→machine_desc->init_irq()即

MACHINE_START宏定义的.init_irq   = s3c2440_init_irq;

 

Ø  init_time:

start_kernel→time_init→machine_desc->init_time()即

MACHINE_START宏定义的.init_time  = samsung_timer_init;

 

【linux】具体芯片MACHINE_START处理的更多相关文章

  1. 基于335X平台Linux交换芯片驱动开发

    基于335X平台Linux交换芯片驱动开发   一.软硬件平台资料 1.开发板:创龙AM3359核心板,网口采用RMII形式. 2.Kernel版本:4.4.12,采用FDT 3.交换芯片MARVEL ...

  2. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

  3. 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建、调试输出和建立时间系统

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

  4. 飞思卡尔烧写工具mfgtools的使用

    MFGTool是飞思卡尔提供的烧写工具,使用起来非常方便.但是,在使用MFGTool有几点是需要注意的,否则就会在烧写过程中遇到一些问题: 1.在使用MFGTool前,文件cfg.ini 和 UICf ...

  5. linux中MACHINE_START&END在9g10ek上实现

    在linux的板卡初始化文件中有machine的相关定义 //arch/arm/mach-at91/board-sam9261ek.c MACHINE_START(AT91SAM9G10EK, &qu ...

  6. Linux编译安装RTL8192CU芯片驱动,使用TP_LINK wn823n无线网卡

    前几天给自己的台式电脑安装了Window 7+CentOS 6.4 Linux双系统,发现在Windows 7下面可以正常使用TP_LINK wn823n无线网卡来连接无线网络,但是在Linux下面, ...

  7. Linux下时钟框架实践---一款芯片的时钟树配置

    关键词:时钟.PLL.Mux.Divider.Gate.clk_summary等. 时钟和电源是各种设备的基础设施,整个时钟框架可以抽象为几种基本的元器件:负责提供晶振 Linux内核提供了良好的CC ...

  8. 【2017-11-19】Linux基础知识:TP-Link WN823N无线网卡(RTL8192EU芯片)的X86-64及AARCH64驱动安装

    目的: 使类似于树莓派的AARCH-64架构的嵌入式设备能通过USB无线网卡连接上以太网: 该设备有LAN接口,但在前一次系统固件升级后,其内部的三个网络接口可以相互ping通,但任一接口无法ping ...

  9. [转]Linux芯片级移植与底层驱动(基于3.7.4内核)

      1.   SoC Linux底层驱动的组成和现状 为了让Linux在一个全新的ARM SoC上运行,需要提供大量的底层支撑,如定时器节拍.中断控制器.SMP启动.CPU hotplug以及底层的G ...

随机推荐

  1. DFS(White-Gray-Black)

    参考<数据结构与算法> 本书在复杂深度优先遍历图时,采用三种颜色标记图中节点 1 white 表示未访问 2 gray 表示已经正在访问,其相邻节点 3 black 表示该节点所有的相邻节 ...

  2. Qt中addStretch的有趣应用

    今天在使用addStretch,布局的时候,发现addStretch竟然是可以平均分配的,有意思.比如: QVBoxLayout *buttonLayout = new QVBoxLayout; bu ...

  3. HDU 2227 Find the nondecreasing subsequences (线段树)

    Find the nondecreasing subsequences Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/3 ...

  4. css中border-width 属性

    border-width属性可能的值 值 描述 thin 定义细的边框. medium 默认.定义中等的边框. thick 定义粗的边框. length 允许您自定义边框的宽度. inherit 规定 ...

  5. HDU 4720 Naive and Silly Muggles (外切圆心)

    Naive and Silly Muggles Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...

  6. mac .bash_profile环境变量汇总

    export CATALINA_HOME=/Applications/MyApplications/apache-tomcat-7.0.54 export PATH=$PATH:$CATALINA_H ...

  7. Javascript-one

    今天,学习Javascript第一天,学习了一些基本的概念,下面就对今天所学的知识进行一个整理,回顾吧! 首先,将Javascript代码包含在(X)html文档中,主要的方法是使用<scrip ...

  8. iOS中 视频直播功能-流媒体的使用

    简单介绍: HLS 协议 : >5M会被AppStore拒绝  服务器要求低   延迟高    多平台   RTMP 协议:  电视直播   PC端使用    配合flash插件  及时性好  ...

  9. C# lazy<T>的用法

    .NET 4.0中加入了lazy<T>(懒对象),其实叫懒对象感觉不对,更应该叫延迟对象加载. 正如我们所知,对象的加载是需要消耗时间的,特别是对于大对象来说消耗的时间更多.lazy可以实 ...

  10. C++中,如何定义和使用指向成员函数的指针

    /*** 定义指向成员函数的指针变量的形式 : 成员函数返回类型 (类名∷*指针变量名)(参数列表)* 成员函数指针变量值的形式 : &类名∷成员函数名;* 成员函数指针变量使用形式 : (对 ...