今日结果:
1》手动启动内核:
1. 进入u_boot命令系统下:(将u_boot 用Jlink烧写完成之后,使用超级终端连接开发板,重启开发板后,在倒计时5,4,3,2.... 之前按回车键,进入u_boot命令系统)此系统也可以使用u盘进行内核文件烧写
2.在此系统下: nand read 0x30008000 0x60000 0x267000 // 读入内核文件
3.bootm 0x30008000 启动内核文件
2》 do_bootm_linux ) 找到函数在 Boot.c(lib_arm))中(启动内核的函数)
在u_boot 系统下: printenv // 查看环境变量(linux)
bi_arch_number // 机器码 bi_boot_params // 写到内核的值是多少
mkimage Loadaddress 0x30008000 entry pointer 0x30008040
// 多的40为boot的头
theKernel(0, machid , bd->bi_boot_arm) // 规定R0 = 0 ; 机器码 ; 启动参数的初始地址
3》Uboot 源码解析思路
1.从CPU/arm920T目录下找到start.s 文件(看懂每句汇编代码的执行的意义)
2.从汇编代码的ldr pc, _start_armboot 这条指令跳转到C的入口函数, start_armboot,这个函数uboot的C函数的入口函数。
3.我们手工启动linux 内核步骤分两步:
I, nand read 0x30008000 0x60000 0x267000
II, bootm 0x30008000
4.从boot 命令中发现,会调用do_bootm_linux 函数。(lib_arm)的目录下
5.从这个函数中我们发现,uboot使用gd_t这个结构体,该结构体里面包含bd_t的数据结构
6.看一下,gd_t和bd_t里面的数据内容,会发现机器码,和存放启动参数的变量。
7.在do_boot_linux函数内部我们也发现theKernel函数是指向linux内核的函数指针,该函数指针存放在image->ep字段中。
8.在theKernel 函数后就真正跳转到linux内核了,该函数的三个参数很重要:R0 = 0; R1 = 机器码;R2 = 启动参数的内存地址。
(运行到theKernel函数时,uboot的声明周期也就结束了。
9.我们发现在do_bootm_linux 函数中启动参数到底是多少?机器码到底是多少?
10.因此我们重新回到start_armboot函数中寻找
11.我们发现gd这个结构体指针没有malloc而是通过直接赋值于一个内存地址,这个地址是经过详细规定的具体看PPT内存规定
12.在start_armboot 函数中有一个很重要的函数指针数组叫init_sequence, 该数组是uboot初始化开发板的一系列函数的集合。
13.通过for语句一一执行,达到初始化的目的。
14.首先分析board_init 函数(该函数每个开发板目录下都有,我们要找到mini2440.c 这个文件做了四件事情:
I. 设置MPLL和UPLL 来启动CPU时钟频率
II.通过对GPIO口的结构体的定义简化访问
III.对gd这个结构体的bd里面的机器码,启动参数的地址,直接赋值,mini2440的机器码为1999, 启动参数内存地址为:0x30000100.
明日计划:消化陈老师今天讲的所有知识,然后有时间对对汇编的编程进行学习。
感想:感觉培训好快,已经剩下三次课了,不过没有办法,有相聚,就有分离的时候,真心的祈祷,每个人都是在卓越的这个大家庭中,找到各自的方向和收获到硕果累累的知识库。但是对自己来说,又是另一个启程。
1》手动启动内核:
1. 进入u_boot命令系统下:(将u_boot 用Jlink烧写完成之后,使用超级终端连接开发板,重启开发板后,在倒计时5,4,3,2.... 之前按回车键,进入u_boot命令系统)此系统也可以使用u盘进行内核文件烧写
2.在此系统下: nand read 0x30008000 0x60000 0x267000 // 读入内核文件
3.bootm 0x30008000 启动内核文件
2》 do_bootm_linux ) 找到函数在 Boot.c(lib_arm))中(启动内核的函数)
在u_boot 系统下: printenv // 查看环境变量(linux)
bi_arch_number // 机器码 bi_boot_params // 写到内核的值是多少
mkimage Loadaddress 0x30008000 entry pointer 0x30008040
// 多的40为boot的头
theKernel(0, machid , bd->bi_boot_arm) // 规定R0 = 0 ; 机器码 ; 启动参数的初始地址
3》Uboot 源码解析思路
1.从CPU/arm920T目录下找到start.s 文件(看懂每句汇编代码的执行的意义)
2.从汇编代码的ldr pc, _start_armboot 这条指令跳转到C的入口函数, start_armboot,这个函数uboot的C函数的入口函数。
3.我们手工启动linux 内核步骤分两步:
I, nand read 0x30008000 0x60000 0x267000
II, bootm 0x30008000
4.从boot 命令中发现,会调用do_bootm_linux 函数。(lib_arm)的目录下
5.从这个函数中我们发现,uboot使用gd_t这个结构体,该结构体里面包含bd_t的数据结构
6.看一下,gd_t和bd_t里面的数据内容,会发现机器码,和存放启动参数的变量。
7.在do_boot_linux函数内部我们也发现theKernel函数是指向linux内核的函数指针,该函数指针存放在image->ep字段中。
8.在theKernel 函数后就真正跳转到linux内核了,该函数的三个参数很重要:R0 = 0; R1 = 机器码;R2 = 启动参数的内存地址。
(运行到theKernel函数时,uboot的声明周期也就结束了。
9.我们发现在do_bootm_linux 函数中启动参数到底是多少?机器码到底是多少?
10.因此我们重新回到start_armboot函数中寻找
11.我们发现gd这个结构体指针没有malloc而是通过直接赋值于一个内存地址,这个地址是经过详细规定的具体看PPT内存规定
12.在start_armboot 函数中有一个很重要的函数指针数组叫init_sequence, 该数组是uboot初始化开发板的一系列函数的集合。
13.通过for语句一一执行,达到初始化的目的。
14.首先分析board_init 函数(该函数每个开发板目录下都有,我们要找到mini2440.c 这个文件做了四件事情:
I. 设置MPLL和UPLL 来启动CPU时钟频率
II.通过对GPIO口的结构体的定义简化访问
III.对gd这个结构体的bd里面的机器码,启动参数的地址,直接赋值,mini2440的机器码为1999, 启动参数内存地址为:0x30000100.
明日计划:消化陈老师今天讲的所有知识,然后有时间对对汇编的编程进行学习。
感想:感觉培训好快,已经剩下三次课了,不过没有办法,有相聚,就有分离的时候,真心的祈祷,每个人都是在卓越的这个大家庭中,找到各自的方向和收获到硕果累累的知识库。但是对自己来说,又是另一个启程。