为什么 Qemu 能够模拟Mini2440开发板?qemu用软件模拟 硬件资源。大家都知道uboot启动流程,那uboot 之前流程呢?也就是从上电开始到uboot 开始执行 _start 之前在做什么呢?
正常的Mini2440 硬件上电时候做了的事情:
2440 开发板启动流程简介 ( ① Nand Flash 拷贝 4 KB -> SRAM 垫脚石 | ② PC 指向 0 地址 即 SRAM 起始地址执行 | ③ 初始化内存 拷贝 后续指令到内存执行 )
2440 NandFlash 启动 :
1.垫脚石 ( SRAM ) 简介 : 2440 Nand Flash 启动 , 需要依赖于 很重要的片内部件 -> SRAM , 这个部件 又叫 垫脚石 , 其 位于 ARM 地址空间 的 0 地址处 , 其容量大小是 4KB ;
2.拷贝最前面 4KB : Nand Flash -> SRAM : 处理器上电之后 , 2440 会自动 从 Nand Flash 中拷贝 出 最前端 4 KB 的内容 , 复制进 SRAM 垫脚石 中 ;
3.执行 拷贝的 SRAM 中的 4KB 指令 : PC 指针 指向 0 地址 , 即 指向 垫脚石 SRAM 中的第一条指令 , 然后开始执行 ;
4.SRAM 大小 4KB 局限性 : 这里 注意 , 只能 拷贝 4KB 的指令 , 对于小的 bootloader 程序足够用 , 但对于 u-boot 这种重量级的程序 编译出来 有 100多KB , 显然 4KB 就不够用了 ;
5.代码搬移策略 : 先拷贝 4KB 到 SRAM 中 , 执行这 4KB 指令 , 在这些指令中 , 先 把内存初始化好 , 然后 将后续指令从 Nand Flash 拷贝到内存中执行 ;
现在没有真实硬件,聪明的你,肯定会想到 那么qemu 就要用软件模拟相应的 ?模拟的就是以下东东!!
Qemu Mini2440 需要模拟的硬件资源
Mini2440硬件资源
CPU处理器: Samsung S3C2440A,主频400MHz,最高533Mhz;
SDRAM内存: Mini2440外接两片32MB的SDRAM(型号EM63A16STS-5G),它们并在一起形成32位总线数据宽度,使用了nGCS6片选。物理起始地址为0x30000000。 SDRAM 时钟频率高达100MHz;
NAND FLASH存储: 在板256MB NAND FLASH(型号K9F2G08U0C), 掉电非易失;
NOR FLASH:在板2M NOR FLASH(型号S29AL016D70TF102),掉电非易失,已经安装BIOS;
标准配置为统宝3.5”真彩LCD,分别率240x320,带触摸屏;
接口和资源:
- 1个100M以太网RJ-45接口(采用DM9000网络芯片)- 3个串行口
- 1个USB Host
- 1个USB Slave B型接口
- 1个SD卡存储接口
-1路立体声音频输出接口,一路麦克风接口
- 1个2.0mm间距10针JTAG接口
- 4 USER Leds
- 6 USER buttons(带引出座)
- 1个PWM控制蜂鸣器
- 1个可调电阻,用于AD模数转换测试
- 1个I2C总线AT24C08芯片,用于I2C总线测试
- 1个2.0 mm间距20pin 摄像头接口
- 板载实时时钟电池
- 电源接口(5V),带电源开关和指示灯
扩展接口 :
1个34 pin 2.0mmGPIO接口1个40 pin 2.0mm 系统总线接口
1.register_machines
./vl.c:4874: register_machines();
./target-arm/machine.c:26: qemu_register_machine(&mini2440_machine);
void register_machines(void) { qemu_register_machine(&integratorcp_machine); qemu_register_machine(&versatilepb_machine); qemu_register_machine(&versatileab_machine); qemu_register_machine(&realview_machine); qemu_register_machine(&akitapda_machine); qemu_register_machine(&spitzpda_machine); qemu_register_machine(&borzoipda_machine); qemu_register_machine(&terrierpda_machine); qemu_register_machine(&sx1_machine_v1); qemu_register_machine(&sx1_machine_v2); qemu_register_machine(&palmte_machine); qemu_register_machine(&n800_machine); qemu_register_machine(&n810_machine); qemu_register_machine(&lm3s811evb_machine); qemu_register_machine(&lm3s6965evb_machine); qemu_register_machine(&connex_machine); qemu_register_machine(&verdex_machine); qemu_register_machine(&mainstone2_machine); qemu_register_machine(&musicpal_machine); qemu_register_machine(&tosapda_