资源描述:
《03.1arm上的linux内核及启动过程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、ARM上的Linux内核及启动过程2007.12linux2.4的内核目录结构Linux2.4.x/arch/drivers/fs/include/Documentation/ipc/kernel/lib/mm/init/net/scripts/arm/alpha/m68k/boot/mach-pxa/kernel/lib/mm/asm-arm/linux/net/arch-pxa/proc-armv读懂linux内核源码linux内核庞大,结构复杂对linux内核的统计:接近1万个文件,4百万行代码内核编程习惯(技巧)不同于应用程序(uC)lin
2、ux内核的C代码Linux内核的主体使用GNUC,在ANSIC上进行了扩充Linux内核必须由gcc编译器编译gcc和linux内核版本并行发展,对于版本的依赖性强内核代码中使用的一些编程技巧,在通常的应用程序中很少遇到GNUC的扩充举例从C++中吸收了inline和const关键字ANSIC代码与GNUC中的保留关键字冲突的问题可以通过双下划线(__)解决例如:inline等价于__inline__、asm等价于__asm__结构体(struct)的初始化结构体初始化structsample{intmember_int;char*member_s
3、tr;void(*member_fun)(void);};ANSIC中的实现structsampleinst_c={100,//member_intNULL,//*member_str;myfunc//void(*member_fun)(void);};C99中的实现structsampleinst_c99={.member_int=100,.member_fun=myfun,};GCC中的实现structsampleinst_gcc={member_fun:myfun,member_int:100,};与C99中的用法类似,不必关心struct定
4、义中的实际的顺序和其他未定义的数据,在复杂的结构体初始化的时候很有优势。宏定义的灵活使用(1)虽然GCC中定义了inline关键字,但是,宏操作(#define)仍然在系统中大量使用举例:#defineDUMP_WRITE(addr,nr)do{memcpy(bufp,addr,nr);bufp+=nr;}while(0)应用DUMP_WRITE,就像使用C的函数一样:if(addr)DUMP_WRITE(addr,nr);else…但是,如果如通过下的定义,都不能满足上述的情况定义1:#defineDUMP_WRITE(addr,nr)memc
5、py(bufp,addr,nr);bufp+=nr;定义2:#defineDUMP_WRITE(addr,nr){memcpy(bufp,addr,nr);bufp+=nr;}宏定义的灵活使用(2)#defineOFFSETOF(strct,elem)((long)&(((structstrct*)0)->elem))1、((structstrct*)0)结构体strct的指针2、&((structstrct*)0)->elem)成员的地址,也就是相对于0的偏移3、结果:OFFSETOF(strct,elem)返回的是,结构体strct中成
6、员elem的偏移量C语言中goto的使用在应用程序的C编程中,为了保证程序的模块化,建议不使用goto内核代码需要兼顾到效率,所以,大量使用goto整个内核的比例大概是每260行一个goto语句——速度优先短距离的gotoLinux内核加载过程通常,Linux内核是经过gzip压缩之后的映象文件bootloader复制压缩内核到内存空间内核自解压运行内核编译完成的Linux内核在哪里?./vmlinux,elf格式未压缩内核arch/arm/boot/compressed/vmlinux,压缩以后的elf格式内核arch/arm/boot/zIma
7、ge,压缩内核压缩内核(zImage)的入口/arch/arm/boot/compressed/vmlinux.lds文件为编译器指定连接(link)顺序ENTRY(_start),压缩内核从.start段开始在arch/arm/boot/compressed/head.S中检测系统空间初始化C代码空间跳转到C代码decompress_kernel,arch/arm/boot/compressed/misc.c中解压之前的串口输出include/asm-arm/arch-s3c2410/uncompress.h定义了puts作为串口输出函数解压结束
8、以后,跳转到r5:解压之后内核的起始地址开始真正的Linux内核入口在arch/arm/kernel/head-armv.