Linux系统在嵌入式硬件上的移植
========================= 基本常识 =========================
一、 Linux系统的基本构成:
1、 loader
2、 kernel
3、 filesystem
二、 启动步骤:
1、 CPU从ROM(如果有的话)的0x0地址开始读取代码,执行loader;
2、 Loader初始化ram,并从rom中拷贝uboot或kernel的镜像到ram的指定地址,执行镜像;
3、 如果有uboot,则uboot执行启动前的设置,可以初始化部分硬件,可以手动进入uboot环境,等等,最后拷贝kernel的镜像到ram的指定地址;如果没有uboot,那么跳过这一步;
4、 前面的步骤称为loader部分。Kernel被加载到ram后,kernel的bootargs会被覆盖,kernel启动;
5、 加载驱动程序;
6、 加载文件系统,读取并执行/etc/inittab.
三、 交叉编译器:
arm-linux-gnueabihf-gcc
四、 Makefile文件和make的使用
(太容易了,,,,另行说明)
========================= 移植系统 =========================
一、 交叉编译器的配置:
修改 ~/.bashrc:
export PATH=/home/hexh/toolchain/hfcctool/bin:$PATH #shell任意目录下均可执行gcc
export CROSS_COMPILE=arm-linux-gnueabihf- # 编译loader、kernel所需要的一个变量
重启下shell,或者source ~/.bashrc
二、 编译loader和内核:
1、 公司一般基于开发板修改得到自己的产品,因此第一次编译要严格参照官方资料(这个资料都没有,或者编不过,那就是扯蛋了),熟悉后可自行修改源码;
2、 内核配置命令:make ARCH=arm menuconfig;
三、 最简易的文件系统:
1、 编译busybox
执行 make menuconfig
(1) 修改Build Options --> Cross Compiler prefix
(2) 菜鸟必须选中Build Options --> no shared libs
(3) 修改 Installation Options ("make install" behavior) à BusyBox installation prefix 为../target,将会在工程目录的target下生成最小根文件系统;
make && make install
进入target目录,补齐文件系统的文件夹,标黄的部分必须确保存在:
bin etc lib mnt proc run sys usr
dev home linuxrc opt root sbin tmp var
/bin /sbin /usr, 这几个文件夹已经被busybox配置过了,不需要自行添加东西,/etc目录需要包含所有的配置信息,busybox没有对这个文件夹进行处理,需要自行定制。
2、 /etc/inittab
该文件配置系统启动的默认动作,如果该文件无法读取,会导致kernel panic
在busybox中,和PC机略有不同,文件格式:
输出设备::运行等级:命令
常用运行等级:sysinit(开机自启动项) respawn(保持运行)
例:
# 初始化根文件系统
null::sysinit:/bin/mkdir -p /dev/pts
null::sysinit:/bin/mkdir -p /dev/shm
null::sysinit:/bin/mount –a
# 初始化hostname(需要在/etc/hostname文件中存入机器名称)
null::sysinit:/bin/hostname -F /etc/hostname
# 执行启动脚本(可自由订制)
::sysinit:/etc/init.d/rcS
# 在串口0开放登录,并自动登录root(无密码的情况下)
ttyS0::respawn:/bin/login -f root
3、 /etc/fstab
命令 mount –a 需要使用的文件,在init初始化工作结束前,需要在/proc /tmp /sys /dev 创建对应的文件系统
内容:
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
4、 /etc/passwd 和 /etc/shadow
这两个文件为账户数据,对inittab中的工作不重要,但登入用户环境有利于调试工作,设置密码也能有效阻止外部破解产品的途径。
这两个文件每行的第二段数据决定
例:Root用户无密码的配置
[root@A5 /etc]# cat passwd
root:x:0:0:root:/mnt/root:/bin/sh
[root@A5 /etc]# cat shadow
root::10933:0:99999:7:::
5、 /etc/profile
Profile这个脚本会在用户登录的时候自动执行,对inittab阶段不会产生影响。
内容:
# 初始化shell
USER="$(id -un)"
LOGNAME=$USER
PS1='[\u@\h \w]# '
PATH=$PATH:/mnt/bin:/mnt/usr/bin:/mnt/sbin:/mnt/usr/sbin
HOSTNAME='/bin/hostname'
export USER LOGNAME PS1 PATH LD_LIBRARY_PATH
四、 文件系统镜像的制作:
在此会介绍4种文件系统镜像的制作方法:fat ext4 cramfs ubifs
1、 格式化工具 fdisk
例:格式化U盘 --> fdisk /dev/sdb
常用命令:
m:帮助;
p:打印分区列表;
n:新建分区;
t:修改分区格式(但不格式化);
a:设置可启动分区;
2、 Fat格式制作方法(在sd卡上运行系统)
例:格式化u盘 à mkfs.vfat /dev/sdb1
3、 Ext4格式制作方法(在sd卡上运行系统)
例:格式化u盘 à mkfs.ext4 /dev/sdb1
4、 Cramfs制作方法(启动镜像)
例:mkfs.cramfs -b 4096 -N little ${SOURCE} ${IMAGE}
5、 Ubifs制作方法
需要使用两个工具:mkfs.ubifs ubinize
先用mkfs.ubifs将根文件目录制作成ubifs文件系统,再用ubinize将ubifs文件系统制作成ubi镜像;
例:
mkfs.ubifs -r ${SRC} -e 0x1f000 -c 2048 -m 0x800 -o rootfs.ubifs
ubinize -o rootfs.ubi -m 0x800 -p 0x20000 -s 2048 ubinize.cfg
ubinize.cfg的内容:
[ubifs]
mode=ubi
image=rootfs.ubifs
vol_id=0
vol_type=dynamic
vol_name=rootfs
vol_alignment=1
vol_flags=autoresize
Linux系统在嵌入式硬件上的移植的更多相关文章
- FFMPEG在嵌入式硬件上应用之 —— 基本环境搭建及编译
前段时间在翻看电脑里面资料时,发现了以前做的在嵌入式硬件上面运行以ffmepg为基础,以嵌入式硬件解码的多媒体播放工作,发现都快忘记完了.今日得闲整理温习了一下ffmpeg在嵌入式上的运用,这里给大家 ...
- linux系统相关、硬件、资源 - 相关命令
分类命令: 1.1.系统 # uname -a # 查看内核/操作系统/CPU信息# head -n 1 /etc/issue # 查看操作系统版本 # ...
- Linux系统中的硬件问题如何排查?(6)
Linux系统中的硬件问题如何排查?(6) 2013-03-27 10:32 核子可乐译 51CTO.com 字号:T | T 在Linux系统中,对于硬件故障问题的排查可能是计算机管理领域最棘手的工 ...
- Linux系统中的硬件问题如何排查?(5)
Linux系统中的硬件问题如何排查?(5) 2013-03-27 10:32 核子可乐译 51CTO.com 字号:T | T 在Linux系统中,对于硬件故障问题的排查可能是计算机管理领域最棘手的工 ...
- Linux系统中的硬件问题如何排查?(4)
Linux系统中的硬件问题如何排查?(4) 2013-03-27 10:32 核子可乐译 51CTO.com 字号:T | T 在Linux系统中,对于硬件故障问题的排查可能是计算机管理领域最棘手的工 ...
- Linux系统中的硬件问题如何排查?(3)
Linux系统中的硬件问题如何排查?(3) 2013-03-27 10:32 核子可乐译 51CTO.com 字号:T | T 在Linux系统中,对于硬件故障问题的排查可能是计算机管理领域最棘手的工 ...
- Linux系统中的硬件问题如何排查?(2)
Linux系统中的硬件问题如何排查?(2) 2013-03-27 10:32 核子可乐译 51CTO.com 字号:T | T 在Linux系统中,对于硬件故障问题的排查可能是计算机管理领域最棘手的工 ...
- Linux 系统时钟(date) 硬件时钟(hwclock)
/********************************************************************* * Linux 系统时钟(date) 硬件时钟(hwclo ...
- Linux运维面试题:请简要说明Linux系统在目标板上的启动过程?
Linux运维面试题:请简要说明Linux系统在目标板上的启动过程? 该问题是Linux运维面试最常见的问题之一,问题答案如下: 1.用户打开PC的电源,BIOS开机自检,按BIOS中设置的启动设备( ...
随机推荐
- Studio-----快捷键大全
Ctrl+Alt+Space 类名或接口名提示; 补充布局的提示: 26. Ctrl+Alt+Space是类名自动完成 Ctrl+X 删除行 Ctrl+D 复制行 Alt+回车 导入包,自动修正 Cr ...
- 如何给ubuntu虚拟机添加硬盘和快捷键(转载)
From:http://os.51cto.com/art/201003/188721.htm 刚开始建立Ubuntu虚拟机时间,把容量设置为8Gb 了,然后没过几天就没有地方了,郁闷!查了一下,有几种 ...
- storyBoard中切换应用启动的切入点方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...
- (转)关于rdlc报表的数据源
rdlc 报表字符类数据分为文本数据和表数据,区别就在于文本数据只有一个,表数据可以有多行,然而有很多数据只需要一个传入就可以比如打印某个用户的基本信息,很多信息都是唯一的,如果此时报表传入的数据 ...
- mycat未配置对应表导致报错
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: can't find table define in sch ...
- Maven pom.xml 配置详解
http://niuzhenxin.iteye.com/blog/2042102 http://blog.csdn.net/u012562943/article/details/51690744 po ...
- Python之几个技巧特点
今天偶然看到一篇文章<你可能不知道的30个Python语言的提点技巧>,虽然做python有几年了,但中间还是好多不知道或没想到,特在这里做下摘抄. 原文地址: http://soft.c ...
- Highcharts 对数组的要求
function Reflush(phaid,proid) { $.post('GetProjectSummer.ashx', { proid: proid, phaid: phaid }, func ...
- [HDU 1011] Starship Troopers (树形dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 dp[u][i]为以u为根节点的,花了不超过i元钱能够得到的最大价值 因为题目里说要访问子节点必 ...
- [POJ 1787]Charlie's Change (动态规划)
题目链接:http://poj.org/problem?id=1787 题意:有4种货币分别是1元,5元,10元,20元.现在告诉你这四种货币分别有多少个,问你正好凑出P元钱最多可以用多少货币.每种货 ...