tp133的豪窟 https://bbs.21ic.com/?153747 [收藏] [复制] [RSS]

日志

linux kernel 启动过程学习2

已有 1453 次阅读2007-4-7 19:52 |个人分类:操作系统|系统分类:芝麻流水帐

系统启动代码,书上是以x86为原型讲的,我对应arm做理解,对应代码是linux/arch/arm/boot/compressed/head.S
最开始是关于debug的一些设置 有命令kputc、 kphex 是定义的宏 调用putc来向串口发送信息便于开发者调试的,如果定义了debug则会向串口发送类似开发板、cpu版本的信息,如果bootloader传送的数据不吻合就会报错。进入start后先保存体系结构ID也就是R1 下一步和书上不一样,我的是保存r2  atags指针书上写的是r0 不知道是不是新版本的改动,随后是一个宏__ARM_ARCH_2__,从书上看应该是定义了这个宏的。这里主要搞清楚一个地址LC0,LC0定义的是一组连续的地址:分别代表在连接时各个程序段所在的地址,可以在vmlinux.lds.in中查到,顺序为,LC0所在地址,用来判断程序是否正确加载了地址,如果没有则调整一下;bss起始地址;bss结束地址;内核结束地址;zImage基地址;got(全局偏移表)起始地址;got结束地址(给ip);用户堆栈地址。
运行解压缩程序decompress_kernel()这个函数一共4个参数,按顺序对应r0-r3,调用arch_decomp_setup()好像什么也没干;makecrc函数很简单就是不知道做了什么,当然看名字就知道时crc校验,具体的校验算法就不研究了,大概是将一堆数字放入某个指定的地址,真正做事的是gunzip()函数,具体算法不说了,有一点要注意,在gunzip()函数中调用了flush_output()函数用来填充output_ptr的值,从而返回r0,作为解压缩后内核的长度。
解压后寄存器的分布情况为 r0 解压后内核的长度,r4内核执行地址(好像一直没有变动过),r5解压内核起始地址,r6是处理器的id(这里有个问题,r6是在执行cache_clean_flush之后才被赋值为处理器id的),后面的代码是一段复制重定位的代码,然后调用cache_clean_flush擦除掉cache中的值,然后进入下一段代码值行。本节完

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)