1.创建一个sourceInsight工程
将Linux-2.6.22.6_jz2440中的所有代码加入,然后移除掉Arch,然后将Arch中的Boot、Common、Configs、Kernel、Lib加入,Mach-s3c2410、Mach-s3c2440加入,将Mm、Mwfpe、Oprofile、Tools、Vfp加入,将plat-24xx加入;去掉include目录,然后将include中的Asm-arm打开,加入这个文件夹中顶层的一些东西,然后将Arch-s3c2410、Hardware、Mach、Plat-s3c24xx加入,再到include文件夹,将非Asm开头的文件夹加入进去(这也是一些公用的文件);最后同步一下,Project-->Synchroize Files。
2.编译出来的内核比较大,可以通过压缩将内核变小。压缩的过程就是将内核缩小之后并且在真正的内核前面加上一个自解压代码,所以运行的时候最开始运行自解压代码,然后才去执行解压出来的代码。
3.内核启动要做的几件事情
(1)处理uboot传入的参数。
A 判断是否支持这个CPU
B 判断是否支持该单板(uboot启动内核时传入的机器ID)
adr r3, 3b @ r3 = 3b的地址(这里是物理地址),也就是3: .long .这个标号的地址
ldmia r3,{r4, r5, r6}执行之后:r4 = "."(3b标号的虚拟地址),r5 = __arch_info_begin(是一个链接地址,在链接脚本里面可以查找到),6 = __arch__info_end
MACHINE_START到MACHINE_END之间的代码就是表示支持的某一个单板的结构体,这个结构体有一个特殊的属性,使得这个结构体被强行放置在.arch.info.init这个段。
C 创建页表
D 使能MMU
E 跳转到start_kernel:内核的第一个c函数(处理uboot启动的时候设置的一些启动参数)
start_kernel-->setup_arch(解析uboot传入的启动参数)-->setup_command_line(解析uboot传入的启动参数)-->rest_init-->kernel_init-->prepare_namespace-->mount_root(挂接根文件系统)-->init_post-->执行应用程序
内核启动的最终目的:挂接根文件系统,运行应用程序。