关于MACHINE_START (机器信息)

(1) 这是TI平台的OMAP4430的机器实现核心文件/arch/arm/mach-omap2/board-omap3pandora.c 中的一段代码


MACHINE_START(OMAP3_PANDORA, "Pandora Handheld Console")
.phys_io = 0x48000000,
.io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
.boot_params = 0x80000100,
.map_io = omap3pandora_map_io,
.init_irq = omap3pandora_init_irq,
.init_machine = omap3pandora_init,
.timer = &omap_timer,
MACHINE_END
这里赋值了影射io、初始化irq、初始化机器等函数指针,其中的omap3pandora_map_io()、(影射io空间)
omap3pandora_init_irq()、(初始化板级的中断系统)
omap3pandora_init() 、(OMAPZOOM平台的板级初始化函数,如flash、usb、串口、camera、wifi等初始化)
都是在此文件中实现的初始化函数
omap_timer是为当前机器实现的定时器


Io地址影射

如果想叫处理器知道外围设备上的存储空间,首先要建立虚拟地址到总线地址的影射,总线地址到物里地址转换是硬件完成的。外围设备的存储范围是4G的顶端,而应设的虚拟地址时在896M以上,就是high_mm开始的地方,页表示在init_mm,这是专门为内核使用的页表,不与一般进程的页表在一起,所以在唤出时候,就找不到它的存在,所以内核页表示不会唤出的。同时虚拟地址也是在4G最后的128M里面,由一个虚拟存储区管理。

Offset<wbr> 要应设的物理地址</wbr>

Size<wbr><wbr><wbr><wbr>大小范围</wbr></wbr></wbr></wbr>

返回影射成功的虚拟地址

Void* iormap(unsigned long offset ,unsigned longsize)

1<wbr><wbr><wbr><wbr><wbr><wbr><wbr><span style="font-size:16px">是对offset的一些测试,不能是1M下的应为这些已经建立影射,不能重复影射。</span></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

2<wbr><wbr><wbr><wbr><wbr><wbr><wbr><span style="font-size:16px">申请一个vm_struct结构,当然这个东西是在slab管理的,</span></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

3<wbr><wbr><wbr><wbr><wbr><wbr><wbr><span style="font-size:16px">申请完就获得了虚拟地址,就要在init_mm的页表里建立影射了。加一句,正是这里,所以有时候会出现页面异常,所以要同步</span><br><br><br><br><strong>(2)(这是转载的s3c2410的平台机器信息)<br><br></strong>MACHINE_START(VR1000, "Thorcom-VR1000")<br> /* Maintainer: Ben Dooks &lt;<a href="mailto:ben@simtec.co.uk"><span style="background-color:rgb(255,255,128)">ben@simtec.co.uk</span></a><span style="background-color:rgb(255,255,128)">&gt; */<br> .phys_ram= S3C2410_SDRAM_PA,<br> .phys_io= S3C2410_PA_UART,<br> .io_pg_offst= (((u32)S3C24XX_VA_UART) &gt;&gt; 18) &amp; 0xfffc,<br> .boot_params= S3C2410_SDRAM_PA + 0x100,<br> .map_io= vr1000_map_io,<br> .init_irq= s3c24xx_init_irq,<br> .timer= &amp;s3c24xx_timer,<br> MACHINE_END</span></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
这两个是宏定义 原型为
#define MACHINE_START(_type,_name)/
const struct machine_desc __mach_desc_##_type/
__attribute__((__section__(".arch.info.init"))) = {/
.nr= MACH_TYPE_##_type,/
.name= _name,
#define MACHINE_END/
};
struct machine_desc 的原型为:
struct machine_desc {
/*
* Note! The first five elements are used

* by assembler code in head-armv.S
*/
unsigned intnr;/* architecture number*/
unsigned intphys_ram;/* start of physical ram */
unsigned intphys_io;/* start of physical io*/
unsigned intio_pg_offst;/* byte offset for io
* page tabe entry*/
const char*name;/* architecture name*/
unsigned longboot_params;/* tagged list*/
unsigned intvideo_start;/* start of video RAM*/
unsigned intvideo_end;/* end of video RAM*/
unsigned intreserve_lp0 :1;/* never has lp0*/
unsigned intreserve_lp1 :1;/* never has lp1*/
unsigned intreserve_lp2 :1;/* never has lp2*/
unsigned intsoft_reboot :1;/* soft reboot*/
void(*fixup)(struct machine_desc *,
struct tag *, char **,
struct meminfo *);
void(*map_io)(void);/* IO mapping function*/
void(*init_irq)(void);
struct sys_timer*timer;/* system tick timer*/
void(*init_machine)(void);
};

MACH_TYPE_SMDK2410定义在arch/include/asm-arm/mach-types.h内,值为193.
/* arch/include/asm-arm/mach-types.h */
#define MACH_TYPE_SMDK2410 193
这个值是机器的类型值,编译时由arch/arm/tool/mach-types里面定义的数据生成的。
/* arch/arm/tool/mach-types */
smdk2410ARCH_SMDK2410SMDK2410193

由上发现,MACHINE_START主要是定义了"struct machine_desc"的类型,放在 section(".arch.info.init"),是初始化数据,Kernel 起来之后将被丢弃。

各个成员函数在不同时期被调用:
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()被调用
其他主要都在 setup_arch() 中用到


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值