linux内核裁减移植,嵌入式Linux内核裁减移植.ppt

嵌入式Linux内核裁减移植 课程安排 Linux内核配置与编译Linux内核MakefileLinux内核启动流程 Linux系统结构 用户与内核空间 从上图得知 Linux由用户空间和内核空间两部分组成 为什么Linux系统会被划分为用户空间与内核空间 CPU工作模式 现代CPU通常实现了不同的工作模式 以ARM为例 实现了7种工作模式 用户模式 usr 快速中断 fiq 外部中断 irq 管理模式 svc 数据访问中 abt 系统模式 sys 未定义指令异常 und X86也实现了4个不同的级别 Ring0 Ring3 Ring0下 可以执行特权指令 可以访问IO设备等 在Ring3则有很多限制 体系结构 Linux系统利用了CPU的这一特性 使用了其中的两级来分别运行Linux内核与应用程序 这样使操作系统本身得到充分的保护 例如 如果使用X86 用户代码运行在Ring3 内核代码运行在Ring0 体系结构 内核空间与用户空间是程序执行的两种不同状态 通过系统调用和硬件中断能够完成从用户空间到内核空间的转移 什么是Linux内核 内核架构 内核配置与编译 Linux内核具有可定制的优点 具体步骤如下 1 清除临时文件 中间文件和配置文件 makeclean removemostgeneratedfilesbutkeeptheconfigmakemrproper removeallgeneratedfiles configfilesmakedistclean mrproper removeeditorbackupandpatchfiles 内核配置与编译 2 确定目标系统的软硬件配置情况 比如CPU的类型 网卡的型号 所需支持的网络协议等3 使用如下命令之一配置内核 makeconfig 基于文本模式的交互式配置 makemenuconfig 基于文本模式的菜单型配置 推荐使用 makeoldconfig 使用已有的配置文件 config 但是会询问新增的配置选项 makexconfig 图形化的配置 需安装图形化系统 4 配置信息保存为 config文件 内核配置与编译 makemenuconfig是最为常用的内核配置方式 按功能分层次来组织配置选项使用方法如下 1 使用方向键在各选项间移动 2 使用 Enter 键进入下一层选单 每个选项上的高亮字母是键盘快捷方式 使用它可以快速地到达想要设置的选单项 3 在括号中按 y 将这个项目编译进内核中 按 m 编译为模块 按 n 为不选择 按空格键也可在编译进内核 编译为模块和不编译三者间进行切换 按 h 将显示这个选项的帮助信息 按 Esc 键将返回到上层选单 内核配置与编译 Y 编译出目标文件 并直接链接到内核映像imageM 编译出目标文件 但不链接N 不编译Y M N的区别 内核配置与编译 配置菜单中的项该怎么选择呢 参考Linux 2 6内核配置手册文档内核配置通常在一个已有的配置文件基础上 通过修改得到新的配置文件 Linux内核提供了一系列可供参考的内核配置文件 位于arch cpu configsmakexxx defconfig 生成 config更便捷的方法是使用厂家提供的配置文件cpconfig mini6410 n43 config 内核配置与编译 4 编译内核 编译内核映像makezImagemakebzImage区别 在X86平台 zImage只能用于小于512K的内生成带Uboot文件头的的内核 makeuImage注意需要uboot的mkimage工具支持 但本开发板uboot支持直接引导zImage参见 cmd bootm c ifdefCONFIG ZIMAGE BOOT如需获取详细编译过程信息 可使用 makezImageV 1makebzImageV 1编译出错时 可以通过查看编译过程信息定位错误 例如缺少某些编译选项时可以到相应目录下的Makefile去修改编译好的内核位于arch boot 目录下 内核映像构成 内核映像构成 内核映像构成 启动代码 功能代码 符号链接 Linux内核启动流程 演示 编译使用开发板内核 1 使用厂商提供的配置文件配置内核2 编译内核映像zImage3 下载到开发板通过uboot启动内核 课程安排 Linux内核配置与编译Linux内核MakefileLinux内核启动流程 内核Makefile组成 内核Makefile作用 1 决定编译哪些文件 2 决定怎样编译这些文件 3 决定怎样链接这些文件 最重要是它们的连接顺序如何 编译哪些文件 1 顶层Makefile决定根目录下哪些子目录将被编译 1 将子目录分为以下几类 init y drivers y net y libs y 和core y 2 arch目录内的Makefile直接包含进来include srctree arch ARCH Makefile 3 ARCH变量在makemenuconfig时配置或者make时传入makeARCH armCROSS COMPILE arm linux 在顶层目录Makefile可查看这两个体系结构相关变量 编译哪些文件 2 arch ARCH Makefile决定arch ARCH 目录下哪些文件 哪些目录被编译 1 增加head y类 head y arch arm kernel head oarch arm kernel init task o 2 并且扩展libs y core y类中体系结构相关内容3 编译时 依次进入init y drivers y net y libs y 和core y所列出的目录中执行它们的Makefile 怎样编译文件 1 各级子目录下的Makefile决定所在目录下哪些文件将被编译进内核 哪些文件将被编译成模块 进入哪些子目录继续调用它们的Makefile 1 配置内核时生成 config 转化为include config auto conf文件 去掉了 config中的注释 顶层Makefile引用该文件includeinclude config auto conf 2 auto conf中的变量值有两类 y 和 m 子目录Makefile使用这些变量来决定哪些文件被编译进内核中 哪些文件被编译成模块 3 obj y 定义文件编译进内核 obj y中定义的 o文件由当前目录下的 c或 S文件编译生成 它们连同下级子目录的build in o一起链接成当前目录下的build in o文件 被上一层Makefile使用 怎样编译文件 4 obj m 定义文件编译成可加载模块obj m中定义的 o文件由当前目录下的 c或 S文件编译生成 但不会编进build in o中 而是编译成可加载模块 ko当某个模块 m 需要多个文件编译制作而成 obj m a oa objs b o c o d o由b o c o d o组合生成a o a o最后制作成a ko模块 5 obj m obj y变量中增加子目录名则进入该子目录执行Makefile 6 lib y 定义文件被编译成库文件lib y中定义的 o文件由当前目录下的 c或 S文件编译生成 并且被打包成当前目录下的一个库文件lib a要把lib a编译进内核 需要在顶层Makefile中libs y中列出该目录要编译成库的代码一般在lib arch ARCH lib 这两个目录下 怎样链接文件 1 除了head y外 init y drivers y等都是目录名 顶层Makefile中 这些目录名直接加上build in o或lib a 表示要链接进内核的文件init y patsubst build in o init y 将在 init y 变量中将 替换成 build in o 2 内核映像链接顺序vmlinux init head y init y vmlinux main core y libs y drivers y net y vmlinux all vmlinux init vmlinux main 3 内核映像链接脚本vmlinux lds arch ARCH kernel vmlinux lds 怎样链接文件 5 顶层目录Makefile和arch ARCH Makefile设置了影响所有文件的编译链接选项 CFLAGS AFLAGS LDFLAGS ARFLAGS6 各级子目录下的Makefile中可以设置能影响当前目录下所有文件的编译链界选项 EXTRA CFLAGS EXTRA AFLAGS EXTRA LDFLAGS EXTRA ARFLAGS7 还可以设置只影响某个文件的编译选项 CFLAGS AFLAGS 目标表示文件名 课程安排 Linux内核配置与编译Linux内核MakefileLinux内核启动流程 内核启动过程 1 Linux内核启动过程也可分为两个阶段 1 架构 开发板相关的引导过程 机器ID使用 检查是否支持传入的机器类型 1 head s中调用head common S实现的 lookup machine type检测机器ID 机器ID使用 2 arch info begin arch info end在链接脚本arch arm kernel vmlinux lds中定义 3 include arm include asm mach arch h中定义了如下结构 机器ID使用 4 arch arm mach s3c64xx mach mini6410中定义了如下结构如果内核配置了mini6410开发板 则structmachine desc mach desc mini6410结构被定义在arch info init段 在该段中包含了mini6410开发板的机器ID MACH TYPE MINI6410各种开发板机器ID由arch arm tools mach types在编译中生成 启动参数使用 2 汇编实现的引导过程实现后 跳转到C实现的start kernel函数 进入通用启动过程Uboot传入的启动参数在start kernel过程中处理 内核启动过程 2 后续通用启动过程 启动参数使用 1 start kernel实现在init main c中调用setup arch setup comand line函数处理启动参数 启动参数使用 2 启动参数使用 利用 setup宏定义在 init setup段中的结构体structobs kernel param设置启动参数供后续使用从prepare namespace中的saved root name找到root分区参数使用3 启动参数处理完毕后rest init kernel init prepare namespace mount root 挂接根文件系统 init post run init process sbin init 执行应用程序 NAND分区表 s3c nand c 此课件下载可自行编辑修改 供参考 感谢您的支持 我们努力做得更好

展开阅读全文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值