在友善mini2440提供的linux2.6.32.2内核中,有如下定义:

MACHINE_START(MINI2440, "FriendlyARM Mini2440 developmentboard")
.phys_io = S3C2410_PA_UART,
.io_pg_offst = (((u32)S3C24XX_VA_UART)>> 18) &0xfffc,
.boot_params = S3C2410_SDRAM_PA + 0x100,
.init_irq = s3c24xx_init_irq,
.map_io = mini2440_map_io,
.init_machine = mini2440_machine_init,
.timer = &s3c24xx_timer,
MACHINE_END
下面分析一下:
在 include/asm-arm/mach/arch.h中,有定义
#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 \
};
列出 machine_desc的定义:
struct machine_desc {
unsigned int nr;
unsigned int phys_io;
unsigned int io_pg_offst;
const char *name;
unsigned long boot_params;
unsigned int video_start;
unsigned int video_end;
unsigned int reserve_lp0 :1;
unsigned int reserve_lp1 :1;
unsigned int reserve_lp2 :1;
unsigned int soft_reboot :1;
void (*fixup)(struct machine_desc *,
struct tag *, char **,
struct meminfo *);
void (*map_io)(void);
void (*init_irq)(void);
struct sys_timer *timer;
void (*init_machine)(void);
};
按定义展开后:
static const struct machine_desc __mach_desc_MINI2440\
 __used \
 __attribute__((__section__(".arch.info.init")))= {
.nr = MACH_TYPE_MINI2440,
.name = "FriendlyARM Mini2440 developmentboard",
.phys_io = S3C2410_PA_UART,
.io_pg_offst = (((u32)S3C24XX_VA_UART)>> 18) &0xfffc,
.boot_params = S3C2410_SDRAM_PA + 0x100,
.init_irq = s3c24xx_init_irq,
.map_io = mini2440_map_io,
.init_machine = mini2440_machine_init,
.timer = &s3c24xx_timer,

};

MACH_TYPE_MINI2440是mini2440开发板在linux中的机器号。
"FriendlyARMMini2440 development board"是开发板信息,在终端输入cat/proc/cpuinfo可以查看。
MACHINE_START主要是定义了"structmachine_desc"的类型,放在 section(".arch.info.init"),是初始化数据,Kernel起来之后将被丢弃。
其余各个成员函数在setup_arch()中被赋值到内核结构体,在不同时期被调用:
1. .init_machine 在 arch/arm/kernel/setup.c 中被customize_machine 调用,放在 arch_initcall() 段里面,会自动按顺序被调用。
2. .init_irq在start_kernel() --> init_IRQ()--> init_arch_irq()中被调用
3. .map_io 在 setup_arch() --> paging_init()--> devicemaps_init()中被调用
4..timer是定义系统时钟,定义TIMER4为系统时钟,在arch/arm/plat-s3c/time.c中体现。在start_kernel()--> time_init()中被调用。
5..boot_params是bootloader向内核传递的参数的位置,这要和bootloader中参数的定义要一致。
其他主要都在 setup_arch() 中用到。

MACH_START相关推荐

最新文章

  1. 加速DeiT-S 60%+吞吐量!腾讯优图提出高性能Transformer加速方法
  2. [设计模式]工厂模式factory
  3. linux ubuntu 安装安卓,借助ubuntu电脑,给安卓手机安装整套ubuntu14.04
  4. MySQL导入导出远程访问命令
  5. Javascript前端加载等待圆型圈提示实现效果
  6. mysql 查询正在执行的事务以及等待锁 常用的sql语句
  7. linux系统启动报错:[contains a file system with errors, check forced]的解决方法参考【ZT】
  8. SpingBoot —— RestTemplate的配置
  9. 按钮 加加加 减减减
  10. 全国车辆限行限号数据接口服务评测
  11. c++实现LSTM,ADAM优化,预测大写数字
  12. 逻辑结构?存储结构?傻傻分不清……
  13. mysql的max_allowed_packet配置
  14. 计算机音乐谱恋人心,天刀曲谱大全_天涯明月刀曲谱恋人心
  15. PHP获取字符串长度之strlen和mb_strlen的区别
  16. 联想小新22H2版跳过联网方法最新方法
  17. 用分治法查找数组元素的最大值和最小值
  18. 沪深A股分析数据财务分析信息API接口(JSON标准格式,Get请求方式)
  19. 面试官:你说说软件测试WHX模型(图解)
  20. 【盲信道估计】基于matlab的LMS盲信道估计QPSK仿真

热门文章

  1. CES 2023:海信电视UX斩获CES创新大奖
  2. mysql数据库与mysqli_通过 PHP Mysqli 扩展与 MySQL 数据库交互
  3. vue中的横向排列_如何让div中的内容横向排列
  4. ZOOMEYE jaw
  5. 计算机专业的考研英语作文,干货:2021考研英语作文范文背诵:学校钱买书还是电脑...
  6. 继共享WIFI后,共享挪车码代理加盟成为新的行业风口
  7. Can‘t bind to ‘xxx‘ since it isn‘t a known property of ‘xxx‘,dom配置动态属性时候报错
  8. DASCTF Apr.2023 Crypto 全解
  9. OTFT-2:有效迁移率的计算
  10. 如何在短期快速学好英文