【linux】具体芯片MACHINE_START处理
欢迎转载,转载时需保留作者信息,谢谢。
邮箱: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;
转载于:https://www.cnblogs.com/embedded-tzp/p/4450035.html
【linux】具体芯片MACHINE_START处理相关推荐
- linux 看芯片信息,Linux查看硬件信息(北桥芯片组、南桥、PCI接口、CPU等)
今天想要在Linux下查看机器上MCH(北桥)芯片,ICH(南桥)信息,在网上找方法.通过命令lspci | grep -i host\ bridge查看北桥芯片只 今天想要在Linux下查看机器上M ...
- 正点原子Linux 触摸芯片改成GT911后的驱动修改(单点和多点触摸)
目录 单点触摸 设备树修改 编译设备树和驱动模块并运行 运行测试 多点触摸 野火的Linux的触摸芯片就是用的GT911,如果用GT911替换原来正点原子的FT5x06或者GT9147,需要做一些修改 ...
- linux bios芯片型号,如何准确判断主板BIOS类型 - 怎么看bios芯片型号_查看bios芯片型号...
但有些AMI BIOS的CMOS设置界面与PHOENIX的界面相似,如下图,此时,就需要根据开机自检测或BIOS芯片上的激光标签做判断了. 通过主板BIOS芯片激光标签判断 AWARD BIOS芯片表 ...
- Linux启动芯片的初始代码,Linux系统初始化流程(简述)
1,POST[power on self test]: 接通电源后,CPU通过出厂指定的存储地址读取代码[主板芯片上的ROM],然后测试内存,风扇,显示设备等是否正常,并通过BOIS的Boot Seq ...
- w25q64 linux,W25Q64Flash芯片STM32操作
1.W25Q64Flash芯片介绍 通讯方式:SPI通讯 大小:8M(Byte) (128块(Block),每块64K字节,每块16个扇区(Sector),每个扇区4K字节,每个扇区16页,每页2 ...
- Linux AT24C256芯片 数据手册解读
文章目录 AT24C256 地址 AT24C256页 AT24C256写操作 AT24C02读操作 注意 AT24C256 地址 前四位(1010)是固定的,A2, A1, A0 与硬件连接有关系,外 ...
- 打开tpm服务 linux,TPM芯片LINUX下如何测试 ?
使用下面这条命令可以查看系统内核tpm驱动情况: $ ls -la /lib/modules/`uname -r`/kernel/drivers/char/tpm 总计 100 drwxr-xr-x ...
- Linux音频驱动之五:UDA1341芯片操作接口
本文是基于mini2440开发板Linux版本号是linux-2.6.32.2的学习笔记 一. uda1341的硬件信息 CPU通过L3接口控制uda1341芯片,分别是: L3DATA: 数据线 L ...
- 鸟哥的Linux私房菜(服务器)- 第四章、连上 Internet
第四章.连上 Internet 最近更新日期:2011/07/20 终于要来到修改 Linux 网络参数的章节了!在第二章的网络基础中, 我们知道主机要连上 Internet 需要一些正确的网络参数设 ...
- linux fpga 开发板,香蕉派BPI-F2S ,四核Linux工业级应用的开源硬件开发板,FPGA教学套装...
香蕉派BPI-F2S 是 香蕉派团队 and 凌阳科技首次合作开发的一款工业级应用的开发板, 使用SP7021芯片设计.具有高性能,低功耗的特点; 内嵌 Linux Embed 系统,适合于语音图像处 ...
最新文章
- FreeRTOS学习及移植笔记之一:开始FreeRTOS之旅
- 利用软碟通软件制作Ubuntu16.04系统启动盘
- java 正则提取大于等于号_Java正则表达式
- Kafka、 RabbitMQ、Redis、 ZeroMQ、 ActiveMQ、 Kafka/Jafka 对比
- 【正则表达式】正则表达式引发的惨案 回溯 超时 cpu 100
- 常用排序算法的Java实现 - 1
- c语言 头文件卫士详解,C 语言条件编译与防止头文件重复
- 2021-0(C++)输入一个字符串,判断其是否是回文字符串(回文字符串就是正序与反序是相同的字符串)5-27
- 《深入浅出WPF》-刘铁猛学习笔记——XAML
- 当外面的容器的height使用百分比时,如何设置line-height可以使里面的文字垂直居中
- nginx配置和优化详解
- Codeforces Round #796 (Div. 2)
- 你知道管理的精髓是什么吗?-进度猫带你走进管理者的世界
- 刚体的相对运动与机器人连杆的运动
- 【系统分析师之路】2009年上系统分析师综合知识真题
- 云原生时代,青云QingCloud的“极简”之道
- maven私有库神坑之:“Downloading: http://repo.maven.apache.org/maven2/”
- python利用pymannkendall包进行MK(Mann-Kendall)趋势检验
- 线下门店+线上商城,新商云商城系统驱动流量增长
- linux内核wifi,8192DU双频wifi模块移植到linux3.6.0内核
热门文章
- HIBERNATE调试工具JBOSS TOOLS
- 深度 | EB级规模大数据平台核心技术揭秘(下)
- 如何解决大规模高性能存储可靠性问题?
- 毕设题目:Matlab优化分配
- 【电力负荷预测】基于matlab粒子群算法优化支持向量机预测电力负荷【含Matlab源码 1225期】
- 【模拟信号】基于matlab抑制载波双边带调幅信号产生+解调【含Matlab源码 985期】
- 【数字识别】基于matlab离散Hopfield神经网络数字识别【含Matlab源码 226期】
- 【车间调度】基于matlab粒子群算法求解车间调度问题【含Matlab源码 013期】
- AMOS结构方程模型(SEM)简介【SPSS 049期】
- 傅里叶变换对照表_傅里叶分析推导