03.1arm上的linux内核及启动过程

03.1arm上的linux内核及启动过程

ID:5564435

大小:235.00 KB

页数:18页

时间:2017-11-18

03.1arm上的linux内核及启动过程_第1页
03.1arm上的linux内核及启动过程_第2页
03.1arm上的linux内核及启动过程_第3页
03.1arm上的linux内核及启动过程_第4页
03.1arm上的linux内核及启动过程_第5页
资源描述:

《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.

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。