系统移植知识点总结
Posted 小镇春风
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了系统移植知识点总结相关的知识,希望对你有一定的参考价值。
系统移植知识点总结
系统移植学习各知识点总结
首先我们来了解一个设备要运行起来,要做的工作:
接下来我们了解一下常见的操作系统
所谓的操作系统就是管理硬件,对用户提供统一的接口
提供服务: 网络协议 打印服务 UI界面
vxworks: 硬实时系统 军工 汽车 $1
linux: 软实时系统 民间 免费 服务器 嵌入式
window: 非实时系统 民间 收费 PC
其他: freeRTOS-stm32 51-osal ucOS xxx
RTOS: real time os 实时系统
简单了解一下系统移植
首先就是为什么我们要进行系统移植:
思考一个问题:新开发板子需要系统,但是没有系统. 系统从哪里来???
答案是:大多数芯片原厂都会提供,包括 系统、电路图 linux源码 u-boot源码 开发工具 等。
系统移植主要分为三个主要部分:
bootloader os fileSystem
举个例子:
PC: bios window fileSystem
手机: recovery andriod fileSystem
嵌入式: u-boot linux fileSystem
系统移植的过程:
1.使用大厂提供的 原始iso(uImage) run in my board .发现可以跑起来,但是可能有问题.
2.发现问题,找出原因: 比较两个板子差异.
3.根据原因 添加我们功能
比如 dm9000, 修改设备树 menuconfig添加驱动和其他功能
- 添加第三方驱动:比如摄像头 …
1)方法一直接融入内核
2)方法二 编译为模块
5.自己写驱动
接下来了解一下系统移植的三个部分
bootloader
boot 启动,启动板子 loader加载os
目的: 加载并启动os.bootloader其实 就一个 单片机程序,能够开机启动 最后加载os就行了.
工作过程:
汇编 : 开机启动 初始化核心硬件(cpu ram flash 串口) 初始化堆栈,跳转到C
C语言: 初始化大部分硬件(网卡 sd )从flash加载环境变量,初始化 [交互模式] 加载os,启动os
u-boot使用:
bootloader有很多款:
bios : 安装包 300M ,功能强大 PC
recovery: 安装包 5MB ,功能可以 手机
u-boot : 200KB ,功能够用 嵌入式u-boot: universal bootloader 通用的bootloader 可以跑在pc arm ppc mips ..... u-boot是依赖于硬件的, 硬件不同 你要使用专用的u-boot . 工作中我们很少去改动u-boot. 因为u-boot使用的硬件很少的.
两种方法:
命令:
printenv 打印环境变量
FS4412 # printenv
setenv 环境变量 值 修改内存中的环境变量
如果环境变量没有,则创建
如果值为空,则删除saveenv 把内存中的环境变量存入flash tftp 文件传输命令 tftp服务器ip--环境变量serverip决定 板子ip---ipaddr决定 tftp 41000000 文件名 ping ipaddr go addr : 去指定地址执行程序 bootm: boot from memery,主要用来启动操作系统的 bootm os_addr fs_addr dtb_addr
环境变量: 它会影响uboot执行
baudrate=115200 串口波特率
bootargs=root=/dev/ram0 rw console=ttySAC2,115200 init=/linuxrc
linux启动 需要读取fs,那么他怎么知道fs在哪里(网上 sd 硬盘 u盘)…他其实不知道
你要告诉他 写入bootargs中,有固定的格式的.set bootargs root=/dev/nfs nfsroot=192.168.3.196:/home/lsf/source/rootfs rw console=ttySAC2,115200 init=linuxrc ip=192.168.3.232 root=/dev/nfs:: rootfs根文件系统使用nfs,要去网络上挂载它 nfsroot=192.168.2.121:/home/lsf/source/rootfs rw 指定nfs的具体位置 和读写权限 console=ttySAC2,115200 告诉linux 你起来以后,记得使用串口2,波特率=..... init=linuxrc ip=192.168.2.245 告诉linux ,你起来以后 使用这个ip bootcmd=movi read kernel 41000000;movi read dtb 42000000;movi read rootfs 4300000 3f73a9;bootm 410000 u-boot要去加载启动os,但是u-boot怎么知道 如何启动os???他不知道 你要告诉u-boot如何启动,如何告诉u-boot: 让bootcmd等于几条指令,这几条指令依次执行就可以启动os u-boot启动之后就会 读取bootcmd参数,然后依次执行. set bootcmd tftp 41000000 uImage\\;tftp 42000000 exynos4412-fs4412.dtb\\;bootm 41000000 - 42000000 bootdelay=3 启动延迟 ethact=dm9000 网卡dm9000 ethaddr=11:22:33:44:55:66 网卡物理地址 fileaddr=41000000 filesize=8636 gatewayip=192.168.3.1 网关地址 serverip=192.168.0.134 tftp服务器ip ipaddr=192.168.3.247 板子的ip netmask=255.255.255.0 掩码 stderr=serial stdin=serial stdout=serial
u-boot源码
解压源码,要在纯linux下 tar -xvf u-boot…
顶层目录, u-boot第一级目录,以后 代码移植 编译都是在该目录下.目录结构:
1.平台相关源码
cpu相关的代码 不同的cpu代码不一样,so 每款 arm系列 都有有自己的 代码 arch/arm/cpu/xxxxxx 4
板子相关的代码 不同的板子,代码不一样 board/samsung/origen
板子可以有不同配置 一个板子可以有多个配置文件 include/configs/origen.h 里面全是宏
2.平台无关的源码
比如 网络协议 命令 驱动 等等都是 无关cpu 板子 配置的.编译: 要在顶层目录下
1.配置u-boot: 告诉u-boot你要编译那一款板子(origen)的
make 板子名字_config ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
例子: make origen_config ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-2.编译
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
3.结果 顶层目录下 u-boot.bin可以烧录到板子上的
u-boot.map 将源码中的所有符号的地址存起来4.清空
make clean 清理垃圾,除了配置文件
make distclean 清理所有的东西
u-boot简单移植
我们需要修改的地方
cpu的代码 arch/arm/armv7 不需要动
板子的代码 board/samsung/origen 要改
配置文件 include/configs/origen.h 要改
如何做??? 为什么要这么做???
1.每款板子都要有自己独立的代码,实现自己的初始化 cp board/samsung/origen board/samsung/fs4412 mv board/samsung/fs4412/origen.c board/samsung/fs4412/fs4412.c 同时还要修改Makefile vi board/samsung/fs4412/Makefile 将所有origen替换为fs4412 2.每款板子都要有自己的配置文件 cp include/configs/origen.h include/configs/fs4412.h 3. 我们以前 make origen_config的时候, u-boot是如何知道 对应cpu 公司的 配置文件的...... 原理: make origen_config 的时候 根据 origen去搜索boards.cfg文件中的选项,找出该board 's cpu and config file and vendor(公司 厂家) 4.配置和编译 make fs4412_config ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
操作系统 os
板子上linux : kernel–内核 镜像 uImage 2M
Ubuntu/andriod : 基于内核,增加了很多app 镜像 iso 3.7GB
linux内核的版本发展:4.5.0-21-generic
主版本号.次版本号.修改版本号-原厂自定义版本号次版本号 为奇数的时候,表示当前系统版本是不稳定版本(实验版本)
偶数,表示 稳定版本内核源码
解压在纯linux目录下 tar -xvf linux-3.14.tar.xz
顶层目录: linux第一级目录 后续编译和移植都是基于该目录下执行的.平台相关 :
不同的cpu 不同的板子 代码和配置是不一样的
cpu: arch/arm/mach-xxx 表示一款芯片的初始化代码
board: 都描述了在设备树中 arch/arm/boot/dts 每个板子都要有自己的设备,描述自己有哪些硬件
config: 不同的板子配置不一样 arch/arm/configs/exynos_defconfig平台无关 :
Documentation-文档 init-内核的初始化代码 lib sound
block-块设备 drivers-驱动程序 ipc-进程间通信实现 tools
COPYING firmware-固件 Kbuild Makefile samples usr-用户目录
CREDITS fs-文件系统的实现 Kconfig mm–内存管理 scripts virt
crypto–加密算法 include-头文件 kernel-核心实现 net-网络协议 security
编译
1.配置 告诉linux kernel 要编译那些功能进入 uImage
cp arch/arm/configs/exynos_defconfig .config如何修改配置呢 : .config是默认配置文件 方法1: 直接修改.config 不现实---看不懂 方法2: linux提供了图形化配置界面 make menuconfig ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- 依赖于库 sudo apt-get install libncurses5-dev
内核裁剪: 通过menuconfig方法 增加/删除 需要/不需要功能,从而让uImage大小发生变化.
2.编译
make [uImage] ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- -j43.结果
arch/arm/boot
Image 原始的可以直接运行的内核 5M~
zImage 对Image进行压缩, 运行之前需要解压,但是zImage自带解压程序
uImage u:u-boot uboot专用的Image
u-boot 对zImage进行处理, 添加一些头部 生成uImage
前提: 需要u-boot的工具编译uboot之后,会tools/mkimage 拷贝到 /bin ,等于安装该软件
在编译内核的时候, make uImage ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- -j4
该命令会首先 生成 Image,然后生成zImage,最后 使用mkimge工具产生uImage
- 清空
make clean 清零所有.o, 保留配置文件和 uImage Image zImage
make distclean 清理所有东西我们知道,有些驱动会集成到 kernel, 那些驱动有资格进入 kernel???
大厂:intel NVIDIA
小厂: 应用规模很大的芯片驱动
问题来了: 如果驱动没有集成到内核,怎么办???
添加到内核,然后可以通过menuconfig配置 编译与否!!!思考: 需要那些功能 1.在menuconfig中显示出来 --显示 你要了解menuconfig的工作过程 Kconfig 2.编译的时候, 可以根据 menuconfig的配置,决定是否编译 ---编译 还要知道 内核的编译过程 Makefil
文件系统 fileSystem
文件系统 他是一个 用户访问系统 接口/界面 ,all in file
普通的文件:
bin–存放命令的 etc–配置文件 linuxrc sbin–非系统级命令
tmp–临时文件 var-variable:日志 usr–存放用户文件的 /usr/bin /usr/sbin:存放用户命令的
lib–库文件 mnt-推荐mount挂载点内存文件系统: 文件都建立在ram至上.
特点: 访问速度快,断电丢失/proc: process 内核运行信息. cmdline,即u-boot传过来的bootargs cpuinfo: cpu信息 ###device-tree: 列举了设备树的各个节点,按照 数结构 diskstat :查看系统有有哪些分区 meminfo: ram信息 modules:查看内核安装了哪些模块 lsmod:读取该文件,解析,打印 partitions: 查看系统有哪些分区 uptime: 时间 version: 内核版本 数字: 表示 进程号, 在对应的目录下可以看到改进程的各种属性 /sys 驱动和设备的 sys/bus/总线/devices /dev 存放设备文件的地方
开机启动:
kernel启动之后,挂载fs. 然后去fs中找到第一个程序–init程序(init=linuxrc).
init进程是第一个用户程序,pid=1. init进程要做哪些工作呢:
init读取一个文件 /etc/inittab#this is run first except when booting in single-user mode. ::sysinit:/etc/init.d/rcS ### 当系统发生 init事件, 执行后面的脚本 系统一起动,init进程就会执行 后面的脚本 # /bin/sh invocations on selected ttys # Start an "askfirst" shell on the console (whatever that may be) ::respawn:-/bin/sh # Stuff to do when restarting the init process ::restart:/sbin/init # Stuff to do before rebooting ::ctrlaltdel:/sbin/reboot /etc/init.d/rcS : init进程开机就会执行,如果你想 让某个进程 开机执行,把程序写进去 telnet####### 远程登录命令: 客户端 telnet servIP 服务器: 开机启动telnetd 配置文件 /etc/passwd root::0:0:root:/:/bin/sh
深入文件系统
window: fat32 NTFS reFs 一直在发展
linux: ext2 ext3 ext4 ext5 …
他们不能用在嵌入式上,体积太大了
嵌入式上要有自己 特有的文件系统: 体积小,功能够用cramfs: linus亲自开发的,只读的 nor/nand flash4 #jffs2: 针对nor flash开发的,后来支持nand flash,但是效果不好 RW #yaffs2: 针对nand flash的 RW exit2: 支持 nor nand,但是都不咋的 nor flash: 有数据线和地址线 体积大 容量小 1-3-5M 工艺要求很高 安全 贵 nand flash: 只有8根线,数据和地址都走它体积小,容量大 100M-500G-1G 工艺要求不高 一般 便宜
功能够用
cramfs: linus亲自开发的,只读的 nor/nand flash4
#jffs2: 针对nor flash开发的,后来支持nand flash,但是效果不好 RW
#yaffs2: 针对nand flash的 RW
exit2: 支持 nor nand,但是都不咋的
nor flash: 有数据线和地址线 体积大 容量小 1-3-5M
工艺要求很高 安全 贵
nand flash: 只有8根线,数据和地址都走它体积小,容量大 100M-500G-1G
工艺要求不高 一般 便宜
系统移植总结
menu 简述嵌入式linux系统移植的主要内容有哪些?
1> 搭建交叉开发环境
2> 移植bootloader
3> 移植linux内核
4> 制作根文件系统
一、搭建交叉开发环境
1、交叉编译工具链的制作(GCC交叉编译器的生成)
(1) 下载Binutils、GCC、Glibc源码
(2) 配置并编译Binutils取得所需的汇编和链接程序(连接程序ld,汇编程序as,主要为GNU系统提供汇编和连接工具)
(3) 配置并编译GCC源码生成GCC编译器。(主要为GNU系统提供C编译器)
(4) 配置Glibc并编译生成Glibc的c函数库(一些基本的C函数和其他函数定义)
(5) 再次配置和编译GCC源码,生成其他语言的编译器,如C++编译器(一般是C编译器首先生成,然后以这个为基础,结合生成的Glibc的C函数库,再编译生成其他编译器)
【注】工具链依赖内核版本
2、二进制工具Binutils
ld:
as:
objcopy:objcopy 是用来进行目标格式转换的
objdump:objdump 是用来反汇编的
strings:
strip:strip 是丢弃目标文件的全部或者特定符号,减少文件体积的
addr2line: addr2line 是用来把程序地址转换为文件名和行号的
ar:ar 是用来将目标文件生成静态库的
3、配置主机方必须的软件
(1)tftp服务器
Tftp用来下载远程文件的最简单网络协议,基于UDP协议实现
(2)nfs服务器
主要将本地的一个目录通过网络输出,其他计算机可以远程挂接这个目录并进行访问。
Nfs有自己的协议和端口,但在文件传输或其他相关信息传递的时候,NFS使用远程过程调用协议(RPC),RPC负责管理端口号的对应与服务相关的工作。NFS本身没有传输文件的协议。
二、 U BOOT
2010.08版本之前的Uboot架构比较简单,之后的版本架构变复杂。
(1)bootloader是系统加电或复位时首先运行的一段代码,
(2)作用:对系统的软硬件做相应的初始化,为操作系统的加载运行做好准备。
(3)ARM平台常用的bootloader:u-boot、 redboot、 blob 、 vivi
2.描述u-boot启动流程
u-boot启动分为两个阶段:
第一个阶段用汇编实现。设置中断向量表->设置SVC模式、中断和时钟 ->
关闭看门狗、mmu和cache->初始化内存控制器->自搬移->设置堆栈、清空bss段
第二个阶段用C实现。调用一系列初始化函数->初始化Flash设备和环境变量->
初始化网络设备->进入循环
(1). bootloader向内核传参的方式有param_struct、 tag;
(2) u-boot的命令中,设置环境变量的命令是 setenv
(3) u-boot中存放内核启动参数的环境变量是 bootargs
(4)linux要求bootloader在运行内核前,让系统进入 SVC 模式
(5)linux要求bootloader将平台号保存在 r1
5.uboot
uboot倒计时,由自启动脚本决定
bootargs:选择启动方式
交叉调试:gdb_server(交叉编译工具链里有)
CP到nfs挂载的路径下,
三、linux内核移植
1、内核概念
2、功能(linux内核的五大任务)
进程管理、内存管理、文件系统支持、设备管理(驱动)、网络协议
3、组织结构
4、配置内核(内核裁剪:make menuconfig)
(1)顶层Makefile
(2)kconfig(裁剪 菜单选项的来源,添加删除选项)
(3)arch/arm…/mach/…板级信息
(4)arch…/smdkc100.c 板级驱动配置信息
5、编译内核(make zImage)
6、添加驱动
(1)网卡
(2)LED
(3)Nand分区
(4)SD卡
(5)LCD
7、可能考的面试题
配置内核时,保留了什么,裁剪了什么?
项目中前期开发模式是nfs挂载的方式,所有配置了nfs服务,配置了DM9000的驱动,便于tftp下载;项目中主控端用到了zigbee模块,GPRS模块,所以分别配置了USB转串口驱动。项目中没有用到SPI驱动,所以把这部分裁剪了。
【注】make zImage:编译生成内核的可移植镜像
make modules:以M形式控制的部分才能编译
8.linux内核启动流程
(1)Bootloader:
a.硬件上电后跳到一个固定位置执行相应的代码
b.初始化相应的设备
c.加载内核的代码到内存
d.跳到内核代码起始位置执行
(2)Kernel
a.内核自解压
b.初始化静态编译进内核的驱动模块(需要访问rootfs)
c.挂载rootfs(需要访问、运行用户空间的程序)
d.直接执行第一个用户空间程序
(3)第一个用户空间程序
配置用户环境,执行服务进程
9.linux调试内核方法介绍
当console初始化以后,一般最为简单的内核调试方式为: printk
printk支持几种打印级别?
8种(0~7)
11、内核相关问题:
(1)编译内核镜像命令 make zImage
编译模块的命令 make modules
(2)第一次配置内核时,应使用的缺省内核配置文件是什么?
arch/arm/configs/s5pc100_defconfig
(3)存放平台代码的文件是什么(完整路径)?
arch/arm/mach-s5pc100/mach-smdkc100.c
(4)内核解压后的入口在哪个文件?
arch/arm/kernel/start.S
四、rootfs的制作
1.概念
存放运行、维护系统所必须的各种工具软件、库文件、脚本、配置文件和其他特殊文件的地方,也可以安装各种软件包。
2.rootfs制作流程
(1)采用bubybox创建基本命令
(2)创建基本的目录/lib /etc /var /tmp /dev /sys /proc等
(3)添加glibc基本动态库
(4)创建基本的设备节点
(5)添加启动配置和脚本程序(一般etc下有此四个文件)/etc/inittab /etc/fstab /etc/init.d/rcS
另外有一个文件profile也可以加,用来存放环境变量。
【inittab:定义了各种action。
如:在用busybox制作根文件系统时,如果要求在程序执行前按enter键进行确认,添加action:askfirst 】
【rcS:init进程调用的第一个脚本
一般都会有 mount -a(挂载所有fstab下的内容)】
(6)测试根文件系统
(7)制作根文件系统镜像,如ramdisk cramfs jffs2......
4、根文件系统特性
(1)内核挂载的第一个文件系统,
(2)根文件系统上存放有内核运行的第一个初始化程序init、命令、设备节点、配置文件以及共享库等等
(3)系统中只能有一个根文件系统
(4)嵌入式linux系统通常用bubybox工具集构建文件系统,以减小系统体积
5.init进程
(1)所有进程的祖宗进程
(2)所有孤儿进程的父进程
6、不同的文件系统的区别
(1)yaffs2、jffs2 文件系统可以运行在nand flash上,并具有可读写特性
(2)cramfs 文件系统可以运行在nand flash上,并具只读特性
(3)tmpfs 不占用任何磁盘空间的文件系统
ubifs针对大容量磁盘的文件系统。
yaffs,yaffs2的区别:yaffs按小页访问,yaffs2按大页访问。
yaffs文件系统有一个致命的bug,在开机时会扫描整个磁盘,速度慢,耗时。所以适用于小容量的磁盘(兆级以下的)。
以上是关于系统移植知识点总结的主要内容,如果未能解决你的问题,请参考以下文章