Download presentation
Presentation is loading. Please wait.
1
第六章 Linux内核移植
2
主要内容 6.1 移植的概念 6.2 Linux内核结构 6.3 Linux内核选项配置分析 6.4 Linux内核编译
6.5 U-Boot引导linux内核启动
3
6.1 移植的概念 如果一个系统可以在不同硬件平台上运行,那么这个系统就是可移植的,使某个平台的代码运行在其他平台上的过程就叫做移植
Linux系统内核源码中有arch目录,其中包含了不同平台的代码,该目录是为多平台设计并使用的,与体系结构相关的代码都放在arch/<architecture>/和include/asm-< architecture >/目录中, architecture是linux支持的体系结构的简称.ARM体系结构的相关代码放在arch/arm和include/asm-arm目录中. 嵌入式系统的硬件可裁剪性决定了系统移植必须根据硬件的不同对内核代码进行修改移植,才能使系统能在相应的硬件平台上运行.
4
6.2 Linux内核结构 在移植linux操作系统前,需先认识一下linux的内核结构.linux内核主要由五个子系统组成:进程调度、内存管理、虚拟文件系统、网络接口、进程间通信。 Linux内核源码是usr/src/linux-内核版本目录中。包括驱动程序在内有数百兆之多。 /arch 包含了所有硬件结构特定的内核代码 /drivers 包含了内核中所有的设备驱动程序 /fs 包含了所有的文件系统的代码,如ext3等 /include包含了建立内核代码时所需的大部分库文件。
5
Linux内核结构 /init包含了内核 的初始代码,内核从此处工作 /ipc包含了进程间通信代码 /kernel包含了主内核代码
/mm包含了所有内存管理代码 /net包含了和网络有关的代码 /crypto包含了加密算法 /security包含了安全相关的代码
6
Linux的下载工具 Linux下载工具如gftp,kget,wget等,其中wget比较好用,它支持FTP和HTTP,还支持断点续传,不过是命令行的方式. 例:下载源码包 wget –c wget 下载完成后,可先验证一下电子签名: gpg –verify linux-x.tar.bz2.sign
7
linux内核配置方式
8
6.3 Linux内核选项配置 本节对linux内核选项配置进行相关说明,不清楚的地方还可以参考菜单中的帮助信息,所有菜单的帮助 信息都在Kconfig文件中定义。 内核选项中,带有”->”前缀的选项表示当前主菜单的子项,带有“-->”前缀的选项表示是当前主菜单的二级子项。 每一个选项前面都有一个”[ ]”或”< >”,其含义如下: [ ] 表示该选项有两种选择方式: [*]直接编译进内核 [ ]不编译 < >表示该项选项有三种选择方式: <*>直接编译进内核 <M>编译成模块形式,但不编译进内核 < >不编译
9
Kconfig配置文件 Arch/$(ARCH)/Kconfig是主文件,跟体系结构有关,主Kconfig调用其他目录的Kconfig文件,其他的文件又调用各级子目录的配置文件,成树状结构. 内核配置菜单项按树状结构组织,主菜单下有子菜单,子菜单还有子菜单或配置选项,每个选项可以有依赖关系,这些依赖关系用于确定它是否显示,只有被依赖的父项被选中,子项才会显示.
10
Kconfig的特点和语法 语法 config <symbol> <config options>
类型定义 依赖性定义 帮助定义
11
(1)菜单项 config AEABI bool "Use the ARM EABI to compile the kernel“
depends on 。。。 default "" help 。。。。。。。。。 每一行开头用关键字”config”,后面可跟多行。后面的几行定义这个配置选项的属性,属性包括配置选项的类型、选择提示、依赖关系、帮助文档和缺省值.
12
(2)菜单属性 每个配置选项必须有类型定义,包括bool、tristate、string、hex、int共5种。其中有两种基本类型:tristate、string。每种类型定义可以有一个选择提示。 bool布尔类型; tristate三态:内建、模块、移除; string字符串; hex十六进制; int整型 详见: 配置编译内核-华清远见 P14
13
Kbuild执行编译过程 内核配置,生成.config文件 保存内核版本信息到include/linux/version.h
创建链接符号include/asm,链接include/asm-$(ARCH)目录 在arch/ $(ARCH)/makefile中指定附加依赖条件 递归遍历各级子目录并且编译所有的目标 链接所有的目标文件,生成顶层目录的vmlinux。链接的第一个目标文件在head-y列表中,是在arch/ $(ARCH)/makefile中定义的 后期处理,编译生成最终的引导映像zImage
14
Kbuild Makefile中的定义 Obj-y+= XXX.o 静态链接目标文件 Obj-m+=XXX.o 编译成可加载模块
Lib-y:=XXX.o 编译成库,组合到相应目录的built-in.o中 Lib-m:=XXX.o 编译成库,包含到相应目录的lib.a中
15
Makefile中列出要遍历的子目录 $(head-y) 列出链接到vmlinux的起始位置的目标文件
$(libs-y)列出lib.a的库文件所在的目录 剩余列出的目录都是built-in.o文件所在的目录 链接顺序:$(head-y)、 $(init-y) 、 $(core-y) 、 $(libs-y) 、 $(drivers-y) 、 $(net-y)
16
Kconfig
17
编译链接内核映像 一般情况下,先编译链接生成顶层目录的 vmlinux,再把vmlinux精简压缩成piggy.gz,然后加上自引导程序链接成arch/$(ARCH)/boot/zImage,这样就得到一个具备自启动能力的linux内核映像
18
6.4 linux 2.6内核移植 源代码修改: 1 修改顶层目录的Makefile中的平台体系结构和交叉编译器
2 修改源代码中的相关驱动程序,必要处添加内核配置选项 3 内核选项配置 4 make编译内核,生成zImage 5 u-boot工具对zImage进行处理,生成uImage 6 将uImage放入宿主机/tftpboot 7 u-boot命令行执行下载,并跳转到下载地址,运行内核
19
6.5 U-Boot引导linux内核启动 利用u-boot/tools/mkimage工具为内核加上u-boot格式的帧头
调试阶段:bootcmd tftp a uImage;bootm a 部署阶段:bootm 烧写地址
Similar presentations