ARM上的Linux内核及启动过程_第1页
ARM上的Linux内核及启动过程_第2页
ARM上的Linux内核及启动过程_第3页
ARM上的Linux内核及启动过程_第4页
ARM上的Linux内核及启动过程_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ARM上的Linux内核及启动过程2007.12linux 2.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)linux内核的C代码Linux内核的主体使用G

2、NU C,在ANSI C上进行了扩充Linux内核必须由gcc编译器编译gcc和linux内核版本并行发展,对于版本的依赖性强内核代码中使用的一些编程技巧,在通常的应用程序中很少遇到GNU C的扩充举例从C+中吸收了inline和const关键字ANSI C代码与GNU C中的保留关键字冲突的问题可以通过双下划线(_ _)解决例如:inline 等价于 _inline_、asm等价于_asm_结构体(struct)的初始化结构体初始化struct sample int member_int;char *member_str;void (*member_fun)(void); ANSI C中的实

3、现struct sample inst_c= 100,/member_intNULL,/*member_str;myfunc/void (*member_fun)(void); C99中的实现struct sample inst_c99 = .member_int = 100,.member_fun = myfun, ; GCC中的实现struct sample inst_gcc = member_fun: myfun, member_int: 100,; 与C99中的用法类似,不必关心struct定义中的实际的顺序和其他未定义的数据,在复杂的结构体初始化的时候很有优势。宏定义的灵活使用(1)

4、虽然GCC中定义了inline关键字,但是,宏操作(#define)仍然在系统中大量使用举例:#define DUMP_WRITE(addr,nr) do memcpy(bufp,addr,nr); bufp += nr; while(0)应用DUMP_WRITE,就像使用C的函数一样:if(addr)DUMP_WRITE(addr, nr);else但是,如果如通过下的定义,都不能满足上述的情况定义1:#define DUMP_WRITE(addr,nr) memcpy(bufp,addr,nr); bufp += nr ;定义2:#define DUMP_WRITE(addr,nr) me

5、mcpy(bufp,addr,nr); bufp += nr;宏定义的灵活使用(2)#define OFFSETOF(strct, elem) (long)&(struct strct *)0)-elem)1、(struct strct *)0) 结构体strct的指针2、&(struct strct *)0)-elem)成员的地址,也就是相对于0的偏移3、结果:OFFSETOF(strct,elem)返回的是,结构体strct中成员elem的偏移量C语言中goto的使用在应用程序的C编程中,为了保证程序的模块化,建议不使用goto内核代码需要兼顾到效率,所以,大量使用goto整个内核的比例大

6、概是每260行一个goto语句速度优先短距离的gotoLinux内核加载过程通常,Linux内核是经过gzip压缩之后的映象文件bootloader复制压缩内核到内存空间内核自解压运行内核编译完成的Linux内核在哪里?./vmlinux,elf格式未压缩内核arch/arm/boot/compressed/vmlinux,压缩以后的elf格式内核arch/arm/boot/zImage,压缩内核压缩内核(zImage)的入口/arch/arm/boot/compressed/vmlinux.lds文件为编译器指定连接(link)顺序ENTRY(_start),压缩内核从.start段开始在a

7、rch/arm/boot/compressed/head.S中检测系统空间初始化C代码空间跳转到C代码decompress_kernel,arch/arm/boot/compressed/misc.c中解压之前的串口输出include/asm-arm/arch-s3c2410/uncompress.h定义了puts作为串口输出函数解压结束以后,跳转到r5:解压之后内核的起始地址开始真正的Linux内核入口在arch/arm/kernel/head-armv.S查找处理器类型_lookup_processor_type_lookup_architecture_type初始化页表(_create_page_tables)初始化C代码空间跳转到C代码中,start_kernel进入C

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论