以tiny4412为例:

arch/arm/mach-exynos/mach-tiny4412.c

MACHINE_START(TINY4412, "TINY4412")
/* Maintainer: FriendlyARM (www.arm9.net) */
.boot_params = S5P_PA_SDRAM + 0x100,
.init_irq = exynos4_init_irq,
.map_io = smdk4x12_map_io,
.init_machine = smdk4x12_machine_init,
.timer = &exynos4_timer,
.reserve = &exynos4_reserve,
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 \
};

启动时:

start_kernel  ----- init/main.c

---->  setup_arch ---- arch/arm/kernel/setup.c

---->  mdesc = setup_machine_tags(machine_arch_type);   到这里,根据machine_arch_type就找到上面这个结构体了。

---->  machine_desc = mdesc;

                      ---->  paging_init(mdesc)   (arch/arm/mm/mmu.c)

----> devicemaps_init(mdesc)

----> mdesc->map_io()   调用了函数 smdk4x12_map_io

---->  init_IRQ()   (arch/arm/kernel/irq.c)

----> machine_desc->init_irq()    调用 exynos4_init_irq

----> time_init()

---->      system_timer = machine_desc->timer;   其中, system_timer 就是 exynos4_timer
                  ---->      system_timer->init();          其中, init 是 exynos4_timer_init

----> rest_init()

---->  kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND)

---->  kernel_init

---->  do_basic_setup()

---->  driver_init()

---->  platform_bus_init();

---->  do_initcalls()

---->

static void __init do_initcalls(void)
{
initcall_t *fn; for (fn = __early_initcall_end; fn < __initcall_end; fn++)
do_one_initcall(*fn);
}

在arch/arm/kernel/vmlinux.lds中:

  __initcall_start = .; *(.initcallearly.init) __early_initcall_end = .; *(.initcall0.init) *(.initcall0s.init) *(.initcall1.init) *(.initcall1s.init) *(.initcall2.init) *(.initcall2s.init) *(.initcall3.init) *(.initcall3s.init) *(.initcallbresume.init) *(.initcallresume.init) *(.initcall4.init) *(.initcall4s.init) *(.initcall5.init) *(.initcall5s.init) *(.initcallrootfs.init) *(.initcall6.init) *(.initcall6s.init) *(.initcall7.init) *(.initcall7s.init) __initcall_end = .;

即: do_initcalls 会一次执行上面的链接脚本指定的段中的函数,其中在arch/arm/kernel/setup.c中:

static int __init customize_machine(void)
{
/* customizes platform devices, or adds new ones */
if (machine_desc->init_machine)
machine_desc->init_machine(); // 执行了smdk4x12_machine_init
return ;
}
arch_initcall(customize_machine); 

其中在include/linux/init.h中:

#define __define_initcall(level,fn,id) \
static initcall_t __initcall_##fn##id __used \
__attribute__((__section__(".initcall" level ".init"))) = fn #define arch_initcall(fn) __define_initcall("3",fn,3)

所以, customize_machine 被链接到了 ".initcall3.init" 段, 会被 do_initcalls执行。

init_machine 在Kernel中被调用的过程的更多相关文章

  1. Wayland中的跨进程过程调用浅析

    原文地址:http://blog.csdn.net/jinzhuojun/article/details/40264449 Wayland协议主要提供了Client端应用与Server端Composi ...

  2. kernel中,dump_stack打印调用栈,print_hex_dump打印一片内存,记录一下

    kernel中,dump_stack打印调用栈,print_hex_dump打印一片内存,记录一下

  3. 【lombok】使用lombok注解,在代码编写过程中可以调用到get/set方法,但是在编译的时候无法通过,提示找不到get/set方法

    错误如题:使用lombok注解,在代码编写过程中可以调用到get/set方法,但是在编译的时候无法通过,提示找不到get/set方法 报错如下: 解决方法: 1.首先查看你的lombok插件是否下载安 ...

  4. Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6629298 在前面一篇文章浅谈Android系 ...

  5. Linux kernel中网络设备的管理

    kernel中使用net_device结构来描述网络设备,这个结构是网络驱动及接口层中最重要的结构.该结构不仅描述了接口方面的信息,还包括硬件信息,致使该结构很大很复杂.通过这个结构,内核在底层的网络 ...

  6. Android Camera 通过V4L2与kernel driver的完整交互过程

    http://blog.chinaunix.net/uid-26215986-id-3552456.html 原文地址:Android Camera 通过V4L2与kernel driver的完整交互 ...

  7. Linux kernel中常见的宏整理

    0x00 宏的基本知识 // object-like #define 宏名 替换列表 换行符 //function-like #define 宏名 ([标识符列表]) 替换列表 换行符 替换列表和标识 ...

  8. Android中View的绘制过程 onMeasure方法简述 附有自定义View例子

    Android中View的绘制过程 onMeasure方法简述 附有自定义View例子 Android中View的绘制过程 当Activity获得焦点时,它将被要求绘制自己的布局,Android fr ...

  9. 在Java中直接调用js代码(转载)

    http://blog.csdn.net/xzyxuanyuan/article/details/8062887 JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码. 在Ja ...

随机推荐

  1. ssh 免交互登录 ,远程执行命令脚本。

    ##免交互SSH登录auto_login_ssh () {    expect -c "set timeout -1;                spawn -noecho ssh -o ...

  2. Android事件分发机制详解(2)----分析ViewGruop的事件分发

    首先,我们需要 知道什么是ViewGroup,它和普通的View有什么区别? ViewGroup就是一组View的集合,它包含很多子View和ViewGroup,是Android 所有布局的父类或间接 ...

  3. CocoaPods 安装与使用

    1.如果之前已经安装过的 gem list --local | grep cocoapods 会看到如下输出: cocoapods (1.1.1)cocoapods-deintegrate (1.0. ...

  4. Tomcat学习笔记(十)

    StandardWrapper容器 Context容器包含一个或者多个Wrapper实例,每个Wrapper实例表示一个具体的servlet定义. 方法调用序列 具体过程 (1)连接器创建reques ...

  5. Tomcat学习笔记(一)

    Tomcat目录结构的认识 tomcat是Apache旗下的一个开源Servlet的容器,实现了对Servlet和JSP技术支持. 通过http://tomcat.apache.org/ 下载tomc ...

  6. [原]C++拾遗

    int a=3,b=4; bool ok=(a==2,b==4); printf("%d\n",ok); //输出的结果是1,逗号既不是&& 也不是|| 应该是从前 ...

  7. Hibernate的注释该如何使用?每一个注释代表什么意思?

    出自:java快快飞 原文地址:http://blog.sina.com.cn/s/blog_697b968901016s31.html Hibernate的注释该如何使用?每一个注释代表什么意思? ...

  8. College student reflects on getting started in open source(一)

    I just completed the first semester of my second year in college, and I'm reflecting on what I learn ...

  9. Linuxmint:MySQL安装指南(转贴)

    这篇文章来自以下网站:http://wiki.ubuntu.com.cn/MySQL. 安装MySQL sudo apt-get install mysql-server 这个应该很简单了,而且我觉得 ...

  10. WPF - 样式 (转)

    本文目录 1.引言 2.怎样使用样式? 3.内联样式 4.已命名样式 5.元素类型样式 6.编程控制样式 7.触发器 1.引言 样式(Style),主要是用来让元素或内容呈现一定外观的属性.WPF中的 ...