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

邮箱: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_machinemachine_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_irqmachine_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

转载于:https://www.cnblogs.com/embedded-tzp/p/4450035.html

【linux】具体芯片MACHINE_START处理相关推荐

  1. linux 看芯片信息,Linux查看硬件信息(北桥芯片组、南桥、PCI接口、CPU等)

    今天想要在Linux下查看机器上MCH(北桥)芯片,ICH(南桥)信息,在网上找方法.通过命令lspci | grep -i host\ bridge查看北桥芯片只 今天想要在Linux下查看机器上M ...

  2. 正点原子Linux 触摸芯片改成GT911后的驱动修改(单点和多点触摸)

    目录 单点触摸 设备树修改 编译设备树和驱动模块并运行 运行测试 多点触摸 野火的Linux的触摸芯片就是用的GT911,如果用GT911替换原来正点原子的FT5x06或者GT9147,需要做一些修改 ...

  3. linux bios芯片型号,如何准确判断主板BIOS类型 - 怎么看bios芯片型号_查看bios芯片型号...

    但有些AMI BIOS的CMOS设置界面与PHOENIX的界面相似,如下图,此时,就需要根据开机自检测或BIOS芯片上的激光标签做判断了. 通过主板BIOS芯片激光标签判断 AWARD BIOS芯片表 ...

  4. Linux启动芯片的初始代码,Linux系统初始化流程(简述)

    1,POST[power on self test]: 接通电源后,CPU通过出厂指定的存储地址读取代码[主板芯片上的ROM],然后测试内存,风扇,显示设备等是否正常,并通过BOIS的Boot Seq ...

  5. w25q64 linux,W25Q64Flash芯片STM32操作

    1.W25Q64Flash芯片介绍 通讯方式:SPI通讯 大小:8M(Byte)   (128块(Block),每块64K字节,每块16个扇区(Sector),每个扇区4K字节,每个扇区16页,每页2 ...

  6. Linux AT24C256芯片 数据手册解读

    文章目录 AT24C256 地址 AT24C256页 AT24C256写操作 AT24C02读操作 注意 AT24C256 地址 前四位(1010)是固定的,A2, A1, A0 与硬件连接有关系,外 ...

  7. 打开tpm服务 linux,TPM芯片LINUX下如何测试 ?

    使用下面这条命令可以查看系统内核tpm驱动情况: $ ls -la /lib/modules/`uname -r`/kernel/drivers/char/tpm 总计 100 drwxr-xr-x ...

  8. Linux音频驱动之五:UDA1341芯片操作接口

    本文是基于mini2440开发板Linux版本号是linux-2.6.32.2的学习笔记 一. uda1341的硬件信息 CPU通过L3接口控制uda1341芯片,分别是: L3DATA: 数据线 L ...

  9. 鸟哥的Linux私房菜(服务器)- 第四章、连上 Internet

    第四章.连上 Internet 最近更新日期:2011/07/20 终于要来到修改 Linux 网络参数的章节了!在第二章的网络基础中, 我们知道主机要连上 Internet 需要一些正确的网络参数设 ...

  10. linux fpga 开发板,香蕉派BPI-F2S ,四核Linux工业级应用的开源硬件开发板,FPGA教学套装...

    香蕉派BPI-F2S 是 香蕉派团队 and 凌阳科技首次合作开发的一款工业级应用的开发板, 使用SP7021芯片设计.具有高性能,低功耗的特点; 内嵌 Linux Embed 系统,适合于语音图像处 ...

最新文章

  1. FreeRTOS学习及移植笔记之一:开始FreeRTOS之旅
  2. 利用软碟通软件制作Ubuntu16.04系统启动盘
  3. java 正则提取大于等于号_Java正则表达式
  4. Kafka、 RabbitMQ、Redis、 ZeroMQ、 ActiveMQ、 Kafka/Jafka 对比
  5. 【正则表达式】正则表达式引发的惨案 回溯 超时 cpu 100
  6. 常用排序算法的Java实现 - 1
  7. c语言 头文件卫士详解,C 语言条件编译与防止头文件重复
  8. 2021-0(C++)输入一个字符串,判断其是否是回文字符串(回文字符串就是正序与反序是相同的字符串)5-27
  9. 《深入浅出WPF》-刘铁猛学习笔记——XAML
  10. 当外面的容器的height使用百分比时,如何设置line-height可以使里面的文字垂直居中
  11. nginx配置和优化详解
  12. Codeforces Round #796 (Div. 2)
  13. 你知道管理的精髓是什么吗?-进度猫带你走进管理者的世界
  14. 刚体的相对运动与机器人连杆的运动
  15. 【系统分析师之路】2009年上系统分析师综合知识真题
  16. 云原生时代,青云QingCloud的“极简”之道
  17. maven私有库神坑之:“Downloading: http://repo.maven.apache.org/maven2/”
  18. python利用pymannkendall包进行MK(Mann-Kendall)趋势检验
  19. 线下门店+线上商城,新商云商城系统驱动流量增长
  20. linux内核wifi,8192DU双频wifi模块移植到linux3.6.0内核

热门文章

  1. HIBERNATE调试工具JBOSS TOOLS
  2. 深度 | EB级规模大数据平台核心技术揭秘(下)
  3. 如何解决大规模高性能存储可靠性问题?
  4. 毕设题目:Matlab优化分配
  5. 【电力负荷预测】基于matlab粒子群算法优化支持向量机预测电力负荷【含Matlab源码 1225期】
  6. 【模拟信号】基于matlab抑制载波双边带调幅信号产生+解调【含Matlab源码 985期】
  7. 【数字识别】基于matlab离散Hopfield神经网络数字识别【含Matlab源码 226期】
  8. 【车间调度】基于matlab粒子群算法求解车间调度问题【含Matlab源码 013期】
  9. AMOS结构方程模型(SEM)简介【SPSS 049期】
  10. 傅里叶变换对照表_傅里叶分析推导