以下是关于嵌入式操作系统(Linux篇)的知识点总结版
目录
part 1 Linux系统基础
1、嵌入式OS(EOS):
2、嵌入式操作系统的特点
3、嵌入式Linnx的优势
4、Linnx是什么?是一种UNIX操作系统的克隆
5、Linux操作系统整体介绍.
(1)Linux os体系结构
(2)Linux内核源代码目录结构
(3)Linux os目录结构详解
编辑(4)LinnX系统文件类型+文件属性
(5)Linux用户管理命令
(6)linux常用操作命令
(7)Linux软件管理命令
(8)Linux下 shell编程
part 2 Linux编程基础
一:代码编辑、编译、调试编辑
1.Vim编辑器
2.Gcc编译器
3.GDB调试器
二:代码编译工程与集中开发环境编辑
1、Make工程管理器
2.集成开发环境(IDE)-Eclipse
3、版本与版本管理
三:文件I/O编程
1、什么是I/O
2、了解Linux文件管理子模块
编辑
3、Linux中的文件及文件描述符
4、两种类型的I/O操作
part 3 基于Linux的嵌入式软件开发
一:嵌入式开发环境编辑
1、嵌入式交叉开发环境模型图
编辑2、流程
3、建立环境
4、嵌入式软件体系总体结构
二:BootLoader的开发与移植
1、认识BootLoader结构
2、Bootloader启动过程
3、Uboot示例分析
三:内核Kernel的开发与移植
编辑1、认识Linnx内核的结构
2、Linux内核的移植过程
四:嵌入式文件系统的Rootfs开发与移植
1、认识文件系统与根文件系统
2、根文件系统的开发与移植
3、学会利用Busybox制作根文件系统
4、Linux设备文件
part 1 Linux系统基础
1、嵌入式OS(EOS):
ios MAC linux VxWOrks Ros ucLinux
Android wihdowsCE MC/0S-11 Harmony os
2、嵌入式操作系统的特点
(1)可移植性
(2) 可定制性
(3)实时性
(4)资源限制
(5)可靠性
(6)应用编程接口
3、嵌入式Linnx的优势
(1)开源,遵从GPL的优势
(2)优秀的网络功能
(3)支持的硬件数量庞大
4、Linnx是什么?是一种UNIX操作系统的克隆
Linux目标是保持和Posix的兼容.
Linnx内核版本号.x.y. z 其中y为奇表示开发版本,为偶为稳定版本
Linnx发行版=linux内核+外围的实用程序。常见的发行版如下:
5、Linux操作系统整体介绍.
(1)Linux os体系结构
内核是操作系统的核心,负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。
①进程管理:进程是某特定应用程序的一个运行实体。包含进程调度,进程通信,进程调度控制进程对CPU的访问
②文件系统:Linnx的文件目录是树形结构(区别于window的盘符).传统的是
Ext2文件系统,同时也支持许多不同类型的文件系统,Linux将新的文件系统通过一个称为“挂载”的操作将其挂载装到某个目录上,从而让不同的文体系统结合成为一个整体
③设备驱动:控制os和硬件设备之间的交互。设备驱动程序提供一组操作系统可理解的抽象接口完成和操作系统之间的交互,而与硬件相关的具体操作细节由设备驱动程序完成。一般而言,设备驱动和设备的控制芯片有关
(2)Linux内核源代码目录结构
名称 | 功能 |
drivers | 所有的设备驱动程序,每一类的驱动对应一个子目录.如 |
fs | 所支持的各种文件系统,如EXT、FAT、NTFS、JFFS2等 |
ipc | 进程间通信源代码 |
kernel | 内核最核心的部分,包括进程调度、定时器等 |
mm | 内存管理代码 |
net | 网络相关代码,实现各种常见的网络协议 |
(3)Linux os目录结构详解
(4)LinnX系统文件类型+文件属性
----在windows系统中,文件类型是通过扩展名来区分的,而Linx系统中文件扩展名和文件类型无关,其“一切皆文件”,总结起来抽象为如下4种
①普通文件:仅仅是字节序列
②目录文件:在Linux中,目录也可看作一个文件,是存储文件名的唯一地方
③链接文件:类似windov中的快捷方式,它可以实现对不同的目录、文件系统甚至是不同机器上的文件直接访问,并且不必重新占用磁盘空间
④设备文件:可分为字符设备和块设备,所有的设备文件都放在/dev目录下
-----属性:以ls-l命令可以查看系统中文件的基本属性.
第1位表示文件类型
“-”普通文件
“d”目录文件
“I”连接文件
“c”字符设备
“b”块设备
2-4位表示该文件属主拥有的权限(“rwx”分别对应“可读可写可执行”,“-”表示无权限)
5-7表示和这个文件属主所在同一组的用户所有的权限
8-10位表示其它用户所具有的权限
(5)Linux用户管理命令
①Linux是多用户多任务操作系统
②用户的属性:用户名、口令、用户ID(UID)、用户主目录(HOME)、用户shell
③如何查看用户属性.
□/etc/passwd配置文件是系统能够识别的用户清单
□用户登陆时,系统查询该文件,确定用户的UID并验证用户口令
PS:“×”表示该用户没有passnord,但不是真正的password,真的password保存在/etc/shadow文件中
④添加用户
add user zhangsan
删除用户zhangsan的同时删除用户的工作目录
deluser -remove-home zhangsan
(6)linux常用操作命令
----可以通过man方法查看命令的详细使用方法
----shell命令基础
a、shell是系统的用户界面,提供用户与内核进行交互操作的一种接口
b、shell命令行:一个shell可以理解为一个“命令集”,接受用户的命令送给内核去执行
c、Shell程序设计语言:可以按照预先编好的程序去执行
d、shell也很多版本,Linnx系统中,常见的是bash shell(即/bin/bash)
e、shell命令启动方法:进入系统,找到“系统工具”下的“终端”,通过单击“终端”可以启动Shell环境
①文件与目录相关的命令
ls | 列出目录的内容 |
cd | 改变工作目录/切换目录 |
Pwd. | 显示当前工作目录的绝对目路 |
mkdir | 创造一个新的目录 |
rmdir | 删除指定的目录,其必须为空目录或多级空目录 |
rm | 删除文件或目录 |
cp | 复制文件或目录 |
mv | 移动或更名现有的文件或目录 |
find | 查找文件 |
in | 链接目录或文件 |
cat | 显示件内容 |
chmod | 更改目录或文件的权限 |
②磁盘管理与维护命令
fdisk | 磁盘分区操作,fdisk-l列出指定的外围设备分区情况 |
mount | 文件系统挂载的命令,mount [-参数][设备名称][挂载点] |
③系统管理与设置命令
shutdown | 关闭系统命令 |
ps | 查看进程命令,ps -e显示所有进程 |
kill | kill 结束进程命令 |
④网络管理相关命令
ifconfig | 查看或者设置网络设备 |
ping | 检测主机网络状态 |
netstat | 显示网络连接、路由表和网络口信息 |
⑤压缩与备份的相关文件
tar | 对文件和目录进行打包或解压 |
gzip | 压缩或解压缩文件 |
(7)Linux软件管理命令
----APT ( advanced packaging tool)是Vbuntu Linnx中功能最强大的命令行软件包管理工具,用于获取、安装、编译、卸载和查询软件包,以及检查软件包依赖关系
----工作原理
①采用集中的软件仓库机制,将各式各样的软件包分门类别地存放在软件仓库中,进行有效地组织和管理
②将软件仓库置于许许多号的镜像server中
③镜像server就是用户的软件源(reposity)
a、软件配置文件: letc/apt/sources.list
b、列出可获得软件包的镜像站点地址;可以在root用户下进行编辑
c、编辑完成后一定要行运“apt-get update”命令才会使更改有效(apt-grt)用于管理软件包,包括安装、卸载、升级等操作 软件包
(8)Linux下 shell编程
0.关于shell.
----Shell:命令解释器,介于0S内核和用户之间
----shell脚本语言,常用于编写软件和OS的配置文件
①shell程序概述[hello.c文件]
#!/bih/bash --------->“#!”开头,表示该程序由哪个程序来解释执行
# This is a very simple example --------->“#“开头,表示该行是注释
echo“Hello” --------->程序语句:此处echo类似c语言printf语句.
echo"first shell program".
两种运行方法 ·/hello.sh
bash hello.sh
②shell变量
----对于shell来说,所有变量的取值都是一个字特串。shell语法中,有如下5种类型的变量
a、用户自定义变量:变量定义:变量名=变量值(不能有空格),变量引用:$变量名
b、环境变量: /eic/profile定义了全局的系统环境变量
c、位置参数:$1表示传递的第一个参数
d、预定义变量:由系统保留和维护的一组特殊的变量,这些变量通常用于保存程序运行状态等
e、参数置换变量(不做要求)
③Shell特殊字符
a 一般通配符:用于模式匹配,如:文件名匹配、字符串查找
b 模式表达式:是包含一个或多个通配符的字
c 引号
④shell语句
说明性语句 | 注释,以#开头,到行位结束,注意区分:井!开头的表达 |
功能性语句 | 输出语句echo,echo "Hello". |
键盘读入变量值read(read a从键入一个值,放到变量a中) | |
算术算命令expr,a='expr $var1+$var2' | |
测试语句test常判断条件是否成立 |
⑤shell流程控制
while循环条件为真继续执行,而until语句是条件为假继续执行
⑥shell函数定义
⑦shell编程基本流程
step1.建立shell文件 File Name.sH
step2.赋予shell文件执行权限 chmod+x FileNume.sh
step3.执行shell文件 ·/FileName.sh
⑧shell程序示例(要考) shell程序不可用C语言写
#!/bin/bash
# This is avery simple exampleecho “测试函数的功能”
funotion printInfo()
{
echo“此函数被调用传入的参数的是$1”}
echo“该测试脚本第一个命令参数是$1”
printInfo Honor执行:
./test.Funtion.sh Helloshell
结果:
测试函数的功能该测试脚本第一个命令参数是Helloshell
此函数被调用传入的参数的是Honor
part 2 Linux编程基础
一:代码编辑、编译、调试
1.Vim编辑器
(1)作用:①创建或修改文本文件 ②维护Linux系统中的各种配置文件
(2)启动方式:在Linux命令行下输入Vi或Vim
(3)两个版本 Vi:类Unix系统中默认的文本编辑
Vim:vi编辑器的增强版本,习惯上也称为vi
[root@localhost ~]# Vim文件名 --------> 进入该文件的编辑页面
[root@localhost ~]# vim --------> 进入编辑器初始页面 文作
(4)三种工作模式:命令模式(一般模式),编辑模式和底行模式
----命令模式:通常进入Vim后默认处于命令模式,此模式下所有的输入都是作为命令来执行
----底行模式:该模式下,可以输入命令来实现查找、保存、退出等
:q未修改退出 :q!放弃对文件内容的修改,并退出Vi
:wq 保存文件退出Vi :set su 在编辑器中显示行号
2.Gcc编译器
(1)Linux下最常用的c语言编译器是gcc(GNU Compiler Collection),它是GNU项目中符合ANSIC标准的编译系统,能编译C、C++和Object c 等语言
GCC是一个交叉平台编译器,可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比,平均效率要高20%~30%
(2)GCC的编译流程分解.
①预处理阶段 处理以“#”开头的预编译指令 [xxxx.i]
②编译阶段 检查代码规范性(如语法错误)[xxxx.s]
③汇编阶段 [xxxx.o]
④链接阶段 链接库文件.符号文件,生成可执行程序 [xxxx.exe]
(3)GCC的编译流程
----编译:将源文件生成一个可执行文件
①编体指令的一般格式
gcc [编译选项1] 要编译的源文件 [编译选项2] [生成的目标文件]
②几种常见的gc编泽命令
#gcc hello.c //gcc+变编译的源文件,目标文件可省,默认生成A.ant.
#gcc hello.c -o hello.out
#gcc -g hello.c -o hello.ont
#gcc -O1 -g -Werror hello.c -o hello.out
③
(4)GCC的编译选项
总体选项 | -c只是编译不链接,成目标文件“o” |
-s只是编译不汇编,生成汇编代码 | |
-e只是进行预编译,不做其他处理 | |
-g在可执行程序中包含标准调试信息 | |
-o file 把输出文件输出到file里 |
告警和出错选项 | -w关闭所有名警 |
-wall允许发出gcc提供的所有有用的报警信息 | |
-werror把所有的告警信息转化为错误信息,并在告警发生时终止编译过程 |
优化选项 【优化选项称为-O选项,后面跟不同的数字表示优化的程序】 | -OO表示没有优化 |
-01为缺省值(推荐) | |
-03优化级别最高(不推荐) |
3.GDB调试器
(1)GDB(GNU Symbolic debugger)是一个强大的命令行调试工具,一般来说,gdb主要帮助用户完成下面4个方面的功能
①启动程序 ②设置断点③查看信息 ④ 动态调试
(2)GDB调试方法
要使用GDB调试程序,在程序通过gcc编译时,需要使用 -g选项。eg:guc -g gdbtest.c -o gdbtest
GDB的调试方法中,常使用的有如下几大功能:
①启动程序------> eg: gdb gdbtest
②查看源文件 ------>L或list
③设置源文件断点及查看断点情况 ------>into break可以查看所有的断点信息,b或break+文件行号或者函数名称,delete +断点号 可以取消该断点
④运行代码------> 1或者run
⑤单步运行------>n(next) 或s(step)(区别:函数调用时s会进入函数而n不会进入该函数)
⑥恢复程序运行------>C或者continue
⑦查看变量的值------> P+变量名称 修改变量值:set+变量名称=值
⑧查看函数堆栈------>bt
⑨退出程序------>q或者quit 退出函数 finish.
⑩修改运行参数
二:代码编译工程与集中开发环境
1、Make工程管理器
(1)Question:
gcc的编译命令gcc -g hello.c -o hello.out只能对单个文件进行编译,而大型项目开发中,一个项目工程通常有多个文件,怎么未满足项目级多文件的编译需求呢?
Answer:
Make工程管理 就完美的解决了这个问题。(Make工程管理是指管理较多的文件。利用make工具来自动完成编译工作。make工具通过一个称为makefile的文件来完成并自动维护编译工作makefile需要某种语法进行编写,其主要内容是定义了源文件之间的依赖关系,说明了如何编译各个源文件并连接生成可执行文件)
(2)Makefile文件
①文件中描述了整个工程所有文件的编译顺序,编译规则
②文件是通过make命令启动执行,make命令负责解释makefile文件中的每一条语句和指令
③makefile文件好处:(“自动化编译”):makeflle一旦写好,只需要一个Make命令,就可以实现自动化编译整个工程
(3)Makefile文件的基本结构
(4)Makefile文件中的语句
①变量定义:自定义变量,预定义变量,常见自动变量
②隐式规则.(eg.makefile发现.o件程序就会自动去找.c文件,并编译成.o文件)
③显式规则 GNU Make的显示规则说明了如何生成一个或多个的目标文件这是由Makefile的书写者明显指出如下3项
要生成的文件;文件的依赖文件;生成的命令
④注释:Makefie注释使用“#”,若Makefile需要用到”#”,则need做转义“/#”
(5)一个makefile文件示例及执行逻辑
-当输入make命令时,make得到执行
-make程序在当前目录寻找Makefile文件.如没有则执行失败
-在执行make时,可以指定目标执行如make Clean,那么make会直接读入执行目标Clean,跳过TestMain
-若执行make TestMain,与make功能相同
2.集成开发环境(IDE)-Eclipse
(1)什么是IDE
IDE(Integrated development environment)是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等体化的开发软件服务套
(2)Eclipse is什么
是众多IDE中的一种主要用来Java语言开发的环境
3、版本与版本管理
(1)版本:是记录特定对象各个可选状态的快照.
(2)版本管理:是对对象的历史演变过程进行记录与维护,根据实际应用背景选样合适的版本间的拓扑结构
(3)版本管理的功能
①新版本的生成
②统一、协调管理各个版本
③有效记录不同版本的演变过程
④以尽可能少的数据见系记录各版本
(4)开发人员的常用操作
建立连接
项目提交
提方修改
版本比对
打标签
拉分支
代码检视
代码审核
(5)Git、github、gitee的区分
git是一个分式的开源版本控制系统,是一种集中技术或者说是工具;GitHub是一个代码托管云服务网站,主要用于软件开发者存储和管理其项目源代码,且能够追踪、记录并控制用户对其代码的修改;gitee是代码托管平台。
三:文件I/O编程
1、什么是I/O
就是数据的输入和输出流;在此通俗来说就是文件的读写。I:就是应用程序从“文件”读入数据O:就是应用程序 把数据写入“文件”。
以钩鱼举例: 要钓的鱼:要获取(读进来)的数据;鱼饵:要发送(写入)的数据;河流:外设缓存或存储空间。一次钓鱼的过程,就是一次IO操作
2、了解Linux文件管理子模块
关于用户态和内核态:
a.在Linux中,将程序的运行空间分为内核空间与用户空间(内核态和用户态)
b.在逻辑上它们之间是相互隔离的,因此用户程序不能访问内核数据,也无法使用空间内核函数.
c.用户态空间和内核空间通进系统调用接口system-call通信
3、Linux中的文件及文件描述符
文件描述符:表示一个打开的文件对象,Linux内核用文件描述符来访问文件
4、两种类型的I/O操作
缓冲文件操作【标准IO】:在用户空间自动为正在使用的文件开辟内存缓冲区
非缓冲文件操作【基本IO】:不会开辟,应用程序直接访问磁盘上的文件数据
基本IO | 标准IO |
open()打开 | fopen打开 |
read()读取 | fread()读取 |
write()写入 | fwrite()写入 |
Iseek()定位 | fseek()定位 |
close()关闭 | fclose()关闭 |
关于两种操作对应的程序会考!!参考老师上课的课件里面的例子,很有可能就是期末考试的变形
part 3 基于Linux的嵌入式软件开发
一:嵌入式开发环境
1、嵌入式交叉开发环境模型图
2、流程
(1)建立开发环境
(2)配置开发主机
(3)建立引导装载程序BootLoader
(4)移植Linux os
(5)建立根文件件系统
(6)建立应用程序的文件系统
(7)开发应用程序
(8)烧写内核、根文件系统、应用程序
(9)发布产品
3、建立环境
(1)安装GC交叉编译器
①交叉编译:在一个平台上生成另外一个平台上可执行的代码
②为什么要重装gcc编译器?
--宿主机(host):编辑和编译程序的平台,一般是基于x86体系结构的PC机,通常也称为主机开发。
--目标机(target):用户开发的系统,通常都是非×86平台.host编译得到的可执行代码在target上运行。
(2)配置NFS服务
①NFS(Notwork Fike System,网络文件系统),一般用于Linux网络中,能够使Linux和Linux之间进行通信
②安展NFS服务+启动+配置+挂载
(3)配置 TFTP服务件
①TFTP(Trivial File Transfer Protocol,简单文传输协议)
TCP/IP协议族中的一个用来在客户机分服务器之间进行简单文件传输协议。TFTP设计的时候是进行小文件传输的,提供不复杂、开销不大的文件传输服务,因此它不具备通常的FTP的许多功能,它只能从文件服务器上获得或写入文件,不能列出自录,不进行认证,它传输8位数据
②安装TFTP+启动+配置+测试
# apt install -tftpd -hpa
# /etc/init.d/tfepd -hpa restant
#vi/etc/defanlt/pd -hpa
tftp 192.168.203.1
4、嵌入式软件体系总体结构
(1)四个层级
①设备驱动层:使用任何外部设备都需要有相应驱动程序的支持,它为上层软件提供了设备的操作接口,设备驱动层一般包括
--硬件抽象层HAL
--板级支持包BSP
--设备驱动程序
②操作统层:Linux系统中,os做成内核映像文件,与文件系统一起烧录到目标系统中,系统启动运行时:
通过BootLoader下指定地址运行Linux内核,启动已经下载好的嵌入式Linux系统
b.通过操作系统解开文件系统,运行应用程序
③中间件层:处于os软件与用户的应用软件的中间,总的作用是为处于自己上层的应用软件提供运行与开发的环境,帮助用户灵活、高效地开发和集成复杂的应用软件.
④应用软件层:在嵌入式系统中,应用软件建立在系统的主任务(MainTasK)基础
之上:a用户应用程序主要通过调用系统的API函数对系统进行操作时,完成用户应用功能开发;b在用户的应用程序中,也可以创建用户自己的任务
(2)Linux系统中:BootLoader、内核(kernel)、Rootfs这三者共同构成Limx系统的启动和运行环境
①BootLoader:引导程序.硬件上执行的第一段代码
主要任务:a最小硬件初始化力.建立内存空间的映射图
②kernel:内核Boot启动完成后,通过地址跳转加载内核。
a.Linux内核的定制与载剪
b.设备驱动程序的开发
③Rootfs根文件系统:内核启动完成后加载根文件系统,通过根文件系统,可访问各种应用程序所在的目录,从而启动与运行应用程序.
后面的知识点都关于这3个展开
二:BootLoader的开发与移植
1、认识BootLoader结构
(1)认识BootLoader
①Boot【启动】+Load【加载】
②Booloader是系统加电后运行的第一段软件代码
③Bootloader是与系统硬件环境高度相关的初始化软件,它担负着初始化硬件和引导操作系统的双重任责任
(2)Bootloader的两种操作模式
①启动加载(Boot loading)模式
--操作方式:Bootloader从目标机上的某个固态存储设备上将OS加载到RAM中运行,整个过程并没有用户的介入
--应用场景:通常在数入式产品发布时,Bootloader必须在这种模式下
②下载(Downloading)模式
--操作方式:目标机上的Bootloader通过串口连接或网络连接等通信手段从主机(host)下载文件到目标机的RAM中,然后再被Bootloader写到目标机上的FLASH
类固志存储设备
--应用场景:通常应用于产品开发时
(3) Bootloader的基本原理——安装.
①系统加电或复位后,所有的CPU通常都从某个由CPU制造商预先安排的地址上取指令
②基于CPU构建的EOS通常都有某种类型的固态存储设备被映射到这个预先安排的地址上
③在系统加电后,CPU将首先执行Bootloader程序
2、Bootloader启动过程
(1)Bootloader基本原理—启动过程
①大多数Bootloader的启动都可以分为两个阶段:
---stage1部分:依赖于CPU体系结构的代码,比如设备初始化代化码等,而且通常都用汇编语言来实现
---stage2部分:通常用C语言来实现
②好处:可以实现代复杂的功能,而且代码会具有更多的可读性和可移植性
(2)stage1部分
①基本的硬件初始化(目的是为stage2的执行以及kernel的执行准备好一些,基本硬件环境)②为加载Stage2准备RAM空间③拷贝stage2到RAM中④设置堆线指针S ⑤跳转到stage2的C入口点
第一阶段启动总结:部分硬件初始化→加载完整uboot到RAM→跳转到第二阶段入口开始执行。主要是这两个文件实现上述操作:两个汇编程序start.s,low level_init.s
(3)stage2部分
①初始化本阶段要nse的硬件设备 ②检测系统的内存映射(memory map)③加载内核映像和根文件系统映映像④设置内核的启动参数 关键函数:mainl0opl)
⑤调用内核:Booloader调用Linux内核的方法是直接跳转到内核的第一条指令处
第二阶段启动总结:部分硬件初始化→加载→内核映像和根文件系统→启动内核的执行。关键函数:main_loop()
3、Uboot示例分析
(1)Uboot在Flash中的分区
Flash分区如下: | 功能: |
自由分区 | 待用空间(一般做根文件系统使用) |
rootfs | 根文件系统 |
Kernel | 内核文件 |
Var | 环境变量 |
uboot | bootlater(必须放在最前面) |
(2)Uboot目录结构
Uhoot源码目录中所要存放的文件有其规则,可以分为3类
第1类目录 | 与处理器体系结构或者开发板硬件直接相关 |
第2类目录 | 是一些通用的函数或者驱动程序 |
第3类目录 | 是U-Boot的应用程序,工具或者文档 |
(3)Uboot命令要在uhoot命令行下使用,不是在Linwx系统下使用。单板上电后载uboot后不启动系统,在此时可以执行动uboot的命令
(4)Uboot的配置与编译
①不同硬件设计的单板的UBOOT不能通用
----每种不同的CPU体系结构都有不同的Bootloader
----除了依赖于CPU的体系结构外,Bootloader还依赖于具体的嵌入式板级设备的配置
----对于两块不同的开发板而言,即使它们是基于同一种CPU而构建的,但如果他们的硬件资源或配置不一致的话,要想在一块开发板上运行的Bootloader程序也能在另一块板子上运行,但是需要修改
②Uboot的Makefile从功能上可以分成两部分
----实现每种board相关配置
----编译生成Uboot.bin文件
③Uboot.bin的生成
----对单板board进行配置。配置完成会在include目录生成config.h和config.mk两个配置文件
----进行编译生成 u-boot.bin
三:内核Kernel的开发与移植
1、认识Linnx内核的结构
(1)从不同视角来认识Linux内核
①从动态角度:
内核就是一次代码的执行过程,它是二进制可执行程序,被bootloader加载到内存中并从其“main”函数开始处进行执行。当然内核不会结束,是常驻
②从静态角度:C代码(函数和数据变量)经过交叉编译工具进行编译和连接后内核就是得到的一个二进制码和应用程序,其中有代码段和数据段
(2)Linux内核的主要子系统
进程调度、内存管理、虚拟文件系统、网络接口进程间通信
(3)Linux内核的源代码结构
Linux内核源代码组成:用来支持各种体系结构的源代码包含大约4500个C语言程序;存放在270个左右的子目录下,其中一级目录20+,总共大约包含200万行代码
子目录 | 介绍 |
init | Init/main.c→start_kernel 内核执行第一条代码 |
Arch | 包括了所有的体系结构相关的核心代码 |
mm | 包括所有独立于CPU体系结构的内存管理代码 |
kernel | 主要的核心代码,此目录下的文件实现了大多数Linux系统的内核函数,其中最重要的文件是 sched.c |
drivers | 放置系统所有的设备驱动程序。它不仅初始化硬盘,也初始,网络。因为安装nfs文件系统时需要网络 |
ipc | 包含了核心进程间的通信代码 |
net | 核心是网络部分代码,其每个子目录对应网络的一个方面 |
modules | 存放了已建好的,可动态加载的模块 |
lib | 目包含了核心的库代码;与处理器结构相关的库代码被放在arch/*//lib/目录下 |
include | 包括编译核心所需要的大部分头文件 |
scripts | 包含用于配置核心的脚本文件 |
2、Linux内核的移植过程
----内核本质上是一个C代码,是一个提供了进程管理等多种功能的系统软件。我们可以将其移植到多个平台上运行,移植一般步骤如下:
①获取内核代码
②准备交叉编译环境
③修改相关的配置文件:修改内核目录下的的kt文件中关校叉编译工具相
④修改Linux内核源码:主要是修改和CPU相关的部分相关的内容
⑤内核的裁剪:根据项目的需要定制内核模块
⑥内核的编译:将载剪好的内核进行编译,生成二进制映像文件
⑦内核的加载;将生成的二进制映像文件,烧到目标平台
四:嵌入式文件系统的Rootfs开发与移植
1、认识文件系统与根文件系统
(1)认识文件系统
①文件系统,即文件管理系统,是一套实现了数据的存储、分级组织、访问和获取等操作的抽象数据类型,一种存储和组织计算机文件和数据的方法
②它使得对文件的访问和查找变得容易
(2)Linux的VFS
①Linux支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso966o、roomfs
②为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS( Virtnal File System),为各类文件系统提供一个统一的操作界面和应用编程接口
了解常用的文件系统格式
①基于Flash的文件系统
a.Yaffs文件系统:专门针对NAND闪存设计的嵌入式文件系统,Yaffs将文件组织成固定大小(512B)的数据段,在进行文件修改时,总是先写入新的数据块,然后将旧的数据块从文件中删除.
b.Romfs文件系统:是一种只读文件系统,相对简单、占用空间较少的文件系统C.CRAMFS文件系统:属于只读性文件系统,不能在闪存中修改。压缩比高达 2:1,节约存储空间
②基于RAM的文件系统
Ramfs/tenpts文件系统:
---把所有的文件放在RAM中,所以读/写操作发生在RAM中一用来存储一些临时性或经常要修改的数据
---文件系统大小可随所含文件内容大小变化。Tmpfs的一个缺点是当系统重新引导时会丢失所有数据
③基于网络的文件系统
NFS文件系统
---NFS可以实现在不同机器、不同os之间的网络共享
---在嵌入式Linux系统的开发调试阶段,可以利用该技术在主机上建立基于NFS的根文件系统,挂载到嵌入式设备
---可以很方便地修改根文件内容
(4)认识根文件系统 Rootfs
①根文件系统在入式系统的Flash中的哪个位置?
根文件系统首先是一种文件系统:
a该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统,它的特殊之处在于:它是内核启动时所挂载(mourt)的第一个文件系过。它是加载其它文件系统的“根”
b.若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。成功之后可以自动或手动挂载其他的文件系统
c.根文件系统也是一种目录结构,包括Linux启动时所必需的目录和关键性文件
②目录选取原则:
a.按需出发,从系统和应用程序的实现需求入手,一般来说:/bin、/dev、/etc、/1ib、/proc、/bin 和/usr 是不可缺的
b.为多用户提供可扩展环境的所有目录(例如/home、/mnt、/opt和root)可以省略
c.系统通用目标
目录名称 | 含义 |
/bin | 存放二进制程序 |
/boot | 存放系统启动的一些程序 |
/dev | 存放设备文件 |
/etc | 存够系统配置文件 |
/home | 用户根目录 |
/lib | 存放库文件 |
/media | 媒介的挂载点 |
/mnt | 该目录用来为其他文件系统提供安装点 |
/opt | 不随发行版本一起交付的程序 |
/proc | Proc文件系统 |
/root | 超级用户根目录 |
/sbin | 存放超级用户运行的二进制文件 |
/src | 存放一些服务的目录 |
/sys | SyS文件系统的目录 |
/var | 存放经常变化的文件,如临时文件 |
2、根文件系统的开发与移植
(1)根文件系统的构建过程
step1:明确文件系统的选取方案
a.根文件系统:根文件系统是系统启动时挂载的第一个文件系统,其他的文件系统需要在跟文件系统目录中建立节点后再挂载。假设对于一个64M大小的NAND FLASH,根文件系统和用户文件系统建立在该flash的后大半部分。该flash的前小部分用来存放bootloader和Kernel映像。根文件系统选用了Cramfs文件格式系统
b.用户YAFFS文件系统:由于Cramfs为只读文件系统,为了得到读写的文件系统,用户文件采用YAFFS格式。用户文件系统挂载于根文件系统下的/mnt/yafs目录
c.临时文件系统:采用了Ramfs文件系统,根目录下的/var,/tmp目录为Ramffs临时文件系统的挡载点
step2:准备制作文件系统所need的内容
a、配置内核:内核对MTD,Cramfs,YAFFS以及Ramfs文件系统自持功能编译进内核
b.划分Flash分区:对Flash物理空间进行分区,以便在不同的分区上存放不同的数据,采用不同的文件系统格式;必要时编写MAPS文件。今修改系统脚本后,在系统启动后利用脚本挂载文件系统
Step3:制作根文件系统.
a. 一个使用Linux内核的EOS中的root文件系统必须包括支持完整linux系统的全部内容
b.创建文件系统镜像文件,利用工具生成文件系件统镜像文件,并通过Flash烧写工具将镜像文件烧写到Flash物理空间
3、学会利用Busybox制作根文件系统
(1)什么是Bnsybox?
①是一个开源项目,遵循GPLv2协议,主要用于EOS
②Busybox将众多的UNIX命令集合进一个很小的可执行程序中,可以用来替代GNU的工具集
③在编写过程中对文件大小进行了优化,动态链接的Busybox只有几百K
(2)如何use Busybox?
①获取busybox源代码,并解压
②配置 busybox,make mennconfig
③在arm-linukgec交叉编译;make
④安装make install
4、Linux设备文件
Linnx的一个基本特点是“一切皆是文件”:
不管哪种类型的设备,最终都被抽象成设备进行处理,看待普通文件一样打开、关闭和读写,各种设备都以文件的形式存放在/dev目录下,成为设备文件。