ARM上的Linux内核及启动过程.ppt

  1. 1、本文档共18页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ARM上的Linux内核及启动过程

ARM上的Linux内核及启动过程 2007.12 linux 2.4 的内核目录结构 读懂linux内核源码 linux内核庞大,结构复杂 对linux内核的统计:接近1万个文件,4百万行代码 内核编程习惯(技巧)不同于应用程序 (uC)linux内核的C代码 Linux内核的主体使用GNU 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中的实现 struct sample inst_c={ 100, //member_int NULL, //*member_str; myfunc //void (*member_fun)(void); }; GCC中的实现 struct sample inst_gcc = { member_fun: myfun, member_int: 100, }; 与C99中的用法类似,不必关心struct定义中的实际的顺序和其他未定义的数据,在复杂的结构体初始化的时候很有优势。 宏定义的灵活使用(1) 虽然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) {memcpy(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 整个内核的比例大概是每260行一个goto语句——速度优先 短距离的goto Linux内核加载过程 通常,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段开始 在arch/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_archit

文档评论(0)

yan698698 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档