当前位置:
文档之家› 第三部分 Linux内核分析与移植
第三部分 Linux内核分析与移植
应用程序、内核、硬件的关系
内核版本
• 命名规则 <主版本号>.<从版本号>.<修正版本号> • 稳定版-偶数从版本号 开发版-奇数从版本号 • 如何查看运行中的内核版本 cat /proc/version 或者 uname -r •
内核开发的特点
• • • • • • 没有C库 必须使用GNU C 没有内存保护机制 浮点数很难使用 只有很小的定长堆栈 由于支持中断、抢占、SMP,必须时刻注 意同步和并发 • 要考虑可移植
内核代码构造(2)
• 子目录中通常包含源代码、Makefile 文件和配置文件(Kconfig) • drivers和arch是两个较大的子目录, 内核移植通常在这两个目录下进行修 改 • 内核编译后在顶层目录下生成的两个 主要文件: -System.map(内核符号地址映射) -vmlinux(真正的内核,ELF格式)
内核下载、配置和编译(4)
• 编译内核 make 或者 make zImage
课后练习
• 下载最新的内核源码,并试着进行配置和 编译,熟悉配置系统的使用和编译过程
Q&A
第三章 Linux内核代码结构和Build系统
内核编码风格
• Documentation/CodingStyle • 变量、函数名等采用小写加下划线,如 int min_value, max_value; void send_data(void); • 宏定义采用大写 #define PI 3.1415926 • 复合语句块的大括号一般在行尾,如 if () { ... } for ( i = 0; i < BUFSIZE; i++) { ... } • ...
嵌入式Linux开发过程(2)
嵌入式Linux交叉开发模式
Q&A
第二章 Linux内核
Linux内核简介
• • • • • 什么是内核 应用程序、内核、硬件的关系 内核版本 内核开发的特点 内核配置和编译
什么是内核
• 一个操作系统包括内核、驱动程序、启动 程序、用户界面、各种工具等 • 内核是核心,负责管理硬件设备、分配系 统资源等,同时为系统的其他部分提供服 务,包含中断处理程序、进程调度程序、 内存管理程序、进程通信系统、网络系统 等 • 应用程序通过系统调用和内核通信,调用 内核提供的服务 • 内核运行的内存空间和应用程序的内存空 间是相互独立的
处理器基础
• CISC和RISC架构 • 单机处理器 • 集成化处理器(SOC)
– PowerPC PPC PowerPC(PPC) – MIPS – ARM
交叉开发环境
• 在主机系统(host)上编译并构建将在嵌 入式系统(target)上运行的应用 • 主机系统包含: -交叉编译器和库 -目标系统软件包 -主机工具(编辑器、调试器、实用程序等) -为目标板提供的服务
第一章 嵌入式Linux简介
嵌入式Linux简介
• • • • 平台构成 系统框架 开发过程 开发模式
嵌入式Linux平台构成
• • • • 硬件平台 引导装入程序(Bootloader) 内核、设备驱动程序 文件系统
嵌入式Linux系统框架
嵌入式Linux开发过程(1)
• 硬件平台开发 -芯片设计和选择 -电路原理图设计 -PCB绘制 -PCB制板、调试 • 软件开发 -建立交叉开发环境 -系统软件开发 -Bootloader移植 -内核移植 -设备驱动开发 -文件系统制作和部署 -应用程序开发
GNU C对ANSI C的扩展
• • case范围 ,如 switch (ch) { case '0' ... '9': ... } 结构成员初始化可以是任意顺序,如 struct file_operations ext2_file_operations = { ... .read = generic_file_read; .write = generic_file_write; .open = generic_file_open; ... }; __FUNCTION__, __LINE__预定义宏 printk("%s:%d\n", __FUNCTION__, __LINE__); inline关键字 goto的使用, 如 if (register_a() != 0) goto err; if (register_b) != 0) goto err1; if (register_c() != 0) goto err2; ... err2: unregister_b(); err1: unregister_a(); err: return ret; ...
嵌入式系统简介
• • • • • • • • 具备处理器 针对某类应用或目的 简单的人机接口 资源受限 功耗限制 软件内置 软硬件集成发布 通常独立工作,无需人工干预
为什么使用Linux
开源、免费 成熟、高性能、稳定 支持新型硬件平台、架构 支持大量的应用和网络协议 适应性强(小型设备->大型的交换机、路由 器) • 大量的开发者,资源丰富(文档、补丁等) • 大量软硬件厂商的支持 • • • • •
内核下载、配置和编译(1)
• 下载并解压内核 cd /usr/src tar jxvf linux-2.6.x.tar.bz2 • 配置内核 make config(字符界面)
内核下载、配置和编译(2)
make menuconfig(ncurses库图形界面)
内核下载、配置和编译(3)
make xconfig(gconfig)(图形界面)
内核构建过程的输出
make ARCH=arm CROSS_COMPILE=arm-linux- zImage CHK include/linux/version.h HOSTCC scripts/basic/fixdep . . <hundreds of lines of output omitted here> . LD vmlinux SYSMAP System.map SYSMAP .tmp_System.map OBJCOPY arch/arm/boot/Image Kernel: arch/arm/boot/Image is ready AS arch/arm/boot/compressed/head.o GZIP arch/arm/boot/compressed/piggy.gz AS arch/arm/boot/compressed/piggy.o CC arch/arm/boot/compressed/misc.o AS arch/arm/boot/compressed/head-xscale.o AS arch/arm/boot/compressed/big-endian.o LD arch/arm/boot/compressed/vmlinux OBJCOPY arch/arm/boot/zImage Kernel: arch/arm/boot/zImage is ready Building modules, stage 2. ...
vmlinux映像文件的组成(1)
vmlinux映像文件的组成(2)
• • • • • • • • • • • • • • • • • • • • arch/arm/kernel/head.o - 体系结构相关的启动代码 init _task.o - 初始内核线程 init/built-in.o -内核初始化代码 usr/built-in.o - 初始内存盘映像(initramfs) arch/arm/kernel/built-in.o - 体系结构相关的内核代码 arch/arm/mm/built-in.o - 体系结构相关的内存管理代码 arch/arm/common/built-in.o - 体系结构相关的公共代码 arch/arm/mach-ixp4xx/built-in.o - 平台相关初始化代码 arch/arm/nwfpe/built-in.o - 体系结构相关的浮点数仿真代码 kernel/built-in.o - 通用内核代码 mm/built-in.o - 通用内存管理代码 ipc/built-in.o - 进程通信系统 security/built-in.o - 安全系统 lib/lib.a - 公共函数库 arch/arm/lib/lib.a - 体系结构相关的函数库 lib/built-in.o - 内核辅助函数库 drivers/built-in.o - 内置驱动程序 sound/built-in.o - 声音子系统 net/built-in.o - 网络子系统 .tmp_kallsyms2.o - 内核符号表
Байду номын сангаас• • •
•
内核代码阅读工具(1)
• Source Insight(Windows平台)
内核代码阅读工具(2)
• LXR(基于WEB网页) • VIM+ctags+cscope(Linux平台)
内核代码构造(1)
• 顶层目录结构 -arch -crypt -Documentation -drivers -fs -include -init -ipc -kernel -lib -mm -net -scripts -security -sound -usr
典型的交叉开发设置
引导装入程序(Bootloader)
• CPU上电后执行的第一个系统程序 • 默认地址加载 • 初始化关键硬件组件(CPU、SDRAM、串 口等) • 定位、加载并将控制权移交给操作系统 (内核) • 其他功能(调试辅助、下载更新系统映像 等) • 汇编+C代码 • 流行的通用引导装入程序U-Boot
vmlinux-真正的内核
• vmlinux的链接过程 arm-linux-ld -EB -p --no-undefined -X -o vmlinux \ -T arch/arm/kernel/vmlinux.lds \ arch/arm/kernel/head.o \ arch/arm/kernel/init_task.o \ init/built-in.o \ --start-group \ usr/built-in.o \ arch/arm/kernel/built-in.o \ arch/arm/mm/built-in.o \ arch/arm/common/built-in.o \ arch/arm/mach-ixp4xx/built-in.o \ arch/arm/nwfpe/built-in.o \ kernel/built-in.o \ mm/built-in.o \ fs/built-in.o \ ipc/built-in.o \ security/built-in.o \ crypto/built-in.o \ lib/lib.a \ arch/arm/lib/lib.a \ lib/built-in.o \ arch/arm/lib/built-in.o \ drivers/built-in.o \ sound/built-in.o \ net/built-in.o \ --end-group \ .tmp_kallsyms2.o • 在嵌入式Linux平台上真正启动的是压缩的内核(zImage),解压缩是在启动过程中完成的