Embedded Linux 开发环境 Linux 操作系统概述 Linux 下的编辑器 Linux 下的编译器 Linux 下的 make 工具 Linux 的 FHS 1
Embedded Linux 操作系统概述 Linux 的系统架构 Linux Kernel 硬件 2
Embedded Linux 的硬件支持 Embedded Linux 是基于特定硬件平台的应用程序解决方案 Embedded Linux 对于硬件支持主要在于 Kernel 部分 SoC(System on Chip) 技术提供 ARM MIPS PowerPC x86 等不同的处理器架构产品, 可开发各种小型设备 SBC(Single Board Computer) 技术的好处在于我们的大部分时间用于软件开发, 缩短原型机的研发时间与设计流程, 通过在 PC 上开发, 然后移植到 SBC 上 常见的 Linux 支持的处理器有 : ARM MIPS PowerPC x86 等 3
Embedded Linux 的软件支持 对于 Embedded Linux 的开发重点放在 Linux Kernel 与 Application 方面,system shared libraries 我们只关心程序的开发环境 Linux Kernel 是一个操作系统内核的实现, 而 Linux 是指 Linux System, 是 Linux Kernel 加上其他必要的系统工具 (Utilities) 与其他项目程序代码的总称 Linux Distribution 也称为 Linux Collections, 是 GNU/Linux 包 (Packages) 安装程序 包管理器等的收集与集成, 其中 RPM 是 RedHat 开发的相当成功的包管理程序 Linux Distribution 包括 X KDE GNOME 文字处理与编辑软件等 4
Linux System 的核心为 Linux Kernel, 并包括许多系统程序 工具 图形系统等 其分为三层 : Linux Kernel system shared libraries Application 在 Application 方面, 包括 utilities shells compilers management programs tools GUI 等 5
system shared libraries( 系统共享库 ) 是 Linux 内核的重要支持 Linux 的 system shared libraries 的核心成员为 C Library, 同时也包括其他的 Library Static Library 是将程序里的所用到的程序库函数直接链接到一个可执行文件里 Dynamic System 是将程序里的所用到的程序库函数加载到内存供程序执行时使用, 并保留在内存以供其他程序使用 6
Linux 下的编辑器 Linux 下的编辑器有很多种, 常用的有 vi gedit emacs 等 在实验中大家熟悉 vi 编辑器和 gedit 编辑器, 他们两者之间各有优缺点 7
Linux 下的编译器 Linux 下的编译器 gcc gcc 是 GNU 计划中最重要的作品之一, 是一个高质量的编译器, 其特色是高移植性, 有超过 30 种硬件平台与操作系统可以执行 GCC gcc 的基本用法 : 在命令提示符下, 输入 : gcc -o hello hello.c -o 参数后面接的是输出文件的名称, 若不加 -o 参数, 则可执行文件的名字为 a.out gcc -c hello.c -c 参数告诉 gcc 只要编译源码, 不必链接成可执行文件, 生成 hello.o 的目标文件 8
gcc 通常情况下会自动与标准程序库文件链接 (/lib 和 /usr/lib), 若程序中用到非标准库, 则需指定路径, 用参数 -I gcc -o hello -I/usr/local/my/inclide hello.c 若程序中用到程序库, 在编译时加上参数 -l gcc -o hello -I/usr/local/my/inclide hello.c -lm 注意 :-l 后面加上 m 表示与 libm 库相连, 其文件名为 libm.a, 此时 gcc 会到标准库 (/lib 和 /usr/lib) 中找 libm gcc 默认与 shared libraries 链接, 即 /lib/libm.so.*, 若找不到, 才会与 Static Library 中 /usr/lib/libm.a 做链接 9
编写如下程序 math.c 10
执行 gcc 命令分别产生 math-shared 和 mathstatic 可执行文件 11
Linux 下的 make 工具 Make 会根据 makefile 文件所定义的规则来自动编译程序, 编译完成的程序为可执行文件, 即负责从项目的源码中生成最终可执行文件 其特点是没有特定的程序语言环境的限制, 是系统自动化的好工具 简单的 makefile 文件可以利用编辑器来手动编写, 但复杂的 makefile 文件需采用 GNU Autoconf/GNU Automake 工具 12
Make 实现对源码的操作是通过一个被称为 makefile 文件来完成的,GNU 的 make 工作时的执行步骤如下 : 读入所有的 makefile 读入被 include 的其他 makefile 初始化文件中的变量 推导隐含规则, 并分析所有规则 为所有目标文件创建依赖关系 根据依赖关系, 决定哪些目标要重新生成 执行生成命令 13
Makefile 的作用 makefile 文件是用 bash 语言写的 bash 语言是一种命令解释语言 这个文件里主要描述了有关哪些目标文件是从哪些依赖文件中产生的, 是用何种命令来进行这个产生过程的 有了这些信息,make 会检查磁盘文件, 如果目标文件的日期至少比它的一个依赖文件的日期早的话,make 就会执行相应命令, 以更新目标文件 换一句话来讲, 在要求随着输入文件的变更而自动变更其结果文件的情况下都适用 为了使 make 能够解析,Makefile 以一种脚本语言的形式构成 14
Makefile 基本结构 在 Linux 系统中 Makefile 基本上遵循由目标 target, 依赖关系 (dependency), 指令 (c ommand) 这三项构成的规则 (rule) Make 自动更新文件也是遵循了这个简单的规则 目标文件名 (target): 依赖文件 (dependency) (Tab 键 ) 命令 (command) 第一行称为规则, 第二行是执行规则的命令, 必须要以 Tab 键开始 15
简单 Makefile 的例子 executable:main.o io.o gcc main.o io.o -o executable main.o:main.c gcc -Wall -o -g -c main.c -o main.o io.o:io.c gcc -Wall -o -g -c io.c -o io.o 理解执行过程 从以上例子可知,makefile 主要包含 5 项内容 : 显式规则 隐含规则 (make 的自动推导功能 ) 变量的定义 文件指示 ( 在 makefile 中引用另一个 makefile) 和注释 (# 表示注释 ) 16
makefile 的编写规则 Makefile 里的宏是大小写敏感的, 一般使用大写字母 要定义一个宏, 在 makefile 中的任意一行的开始写下该宏名, 后面跟一个等号, 等号后面试要设置的这个宏的值 如果要使 用该宏时, 使用 $( 宏名 ) 或 ${ 宏名 } 例如 :OBJS=main.o io.o CC=gcc CFLAGS= -Wall -O -g executable:$(objs) $(CC) $(OBJS) -o executable main.o: main.c $(CC) $(CFLAGS) -c main.c -o main.o io.o:io.c $(CC) $(CFLAGS) -c io.c -o io.o 上面的例子引入了 3 个宏 如果这些宏的值发生变化时, 开发者只要只需在要修改的宏处, 将其宏值改为要求的值即可,makefile 中用到这些宏的地方会自动变化 17
Makefile 中还有一些已经定义好的内部变量 $< $^ $@, $< 表示当前的依赖目标文件, $^ 表示当前目标文件, $@ 表示所有的依赖文件 内部变量的用法举例 : 例如 :OBJS=main.o io.o CC=gcc CFLAGS= -Wall -O -g executable:$(objs) $(CC) $^ -o $@ main.o: main.c $(CC) $(CFLAGS) -c $< -o $@ io.o:io.c $(CC) $(CFLAGS) -c $< -o $@ 18
下面来说明标签 (Label) 的用法 目标部分可被处理为标签以使程序简单化 下面的例子利用名为 clean 的标签来删除编译时生成的目标文件 运行 make clean 命令时, 将执行 rm f *.o 命令, 最终删除编译产生的所有中间文件 OBJS=main.o io.o CC=gcc CFLAGS= -Wall -O -g executable:$(objs) $(CC) $^ -o $@ main.o: main.c $(CC) $(CFLAGS) -c $< -o $@ io.o:io.c $(CC) $(CFLAGS) -c $< -o $@ clean: rm f *.o 19