嵌入式ARM系统开发基础
从.net到delplhi
从windows到Linxu
未来有多远?
如何突破自己?
什么是自己?
我从哪里来,要到哪里去?
世界是什么?
是世选择了我,还是我选择了世界?
怎么才能够完成蜕变?
去他妈的,干吧!!!
ARM可执行文件格式
- ELF:可执行文件格式
- AFX:ARM的调试文件
- BIN:可以写到flash或者RAM中直接运行
加载时地址就是程序放置的地址,运行地址就是程序定位的绝对地址,也即在编译连接时定位的地址。如果程序是在flash里运行,则运行地址和加载地址是相同的。如果程序是在ram里运行,但程序是存储在flash里,则运行地址指向ram,而加载地址是指向flash。代码一般是烧写在NAND里面
ARM上电启动
- 初始化ARM CPU异常处理向量表
- 禁止看门狗???
- 禁止中断
- 初始化系统时钟,包括CPU主频,系统总线时钟频率,外设总线时钟频率
- 初始化SDRAM (SD卡) 控制器
- 设置ARM CPU 在各种模式下的栈指针
- 设置ARM中断向量表,安装中断处理程序
- 搬运可执行文件到RAM中
- 跳转到C语言程序的MIAN函数开始执行。
linux内核原码的组织
init 核心初始化代码 该目录下的mian.c中的start_lernel函数式内核运行的第一个C语言函数,相当于内核的mian函数
arch 体系结构的核心代码 不同的CPU不同的指令
MM 独立于CPU体系结构的内存管理代码
kernel 内核核心
drivers 驱动程序
ipc 进程间通信的代码
lib 库代码
...
内核裁剪配置图 Kconfig|Kconfig|Kconfig|Kconfig ==>.config|makefile ==>uimage或者zimage
CPU刚上电启动时,一般内存控制器还没有配置过,无法再内存中运行程序。
linux内核要运行CPU还必须满足一些条件
为了初始化CPU以及其他外设,必须要有一个先于内核的程序来配置硬件,这个程序就是BootLoader=BIOS+GRUB=Uboot(严格依赖硬件)
CPU内部有一个叫做MMU的内存转换单元,其中有一个页表,用来实现CPU寻址与内存或者其他IO寻址转换。对于不同的操作系统,可以设置不同的内存转换的页表,UBoot可以写不同的内容,将不同的CPU地址分配给不同的硬件设备。比如32位CPU寻址范围为4G,可以只给内存分配1K,给硬件分配3G。这样即使你的内存有4G,CPU也只使用其中的1K。(当然这是作死的节奏)