【转载】Mini6410启动过程
这段时间在尝试使用uBoot来替代友善的Superboot,让板子支持从SD卡启动,所以就仔细研究了一下友善提供的内核和它的启动参数,发现 友善真的蛮聪明,把电脑的启动方式借鉴到它们自己的开发板上了。现在就把6410启动的过程分享出来,可能还有不完善的地方,希望了解的人也能指出我文章 里面的不足。
initramfs启动
以前在X86平台上做过一个最小的U盘启动小系统,用的就是initramfs的方式,只是在最后阶段不要让它切换根目录。对于initramfs 的启动方式网上有很多相关的文章,Linux内核的文档也有相应的介绍。这里只简单说一下它的原理,initramfs将归档好的文件系统添加到img 中,在启动的时候就只需要指定少量的内核启动参数,在启动过程中的临时文件系统所运行的脚本都是此文件系统中的程序和脚本,当然,这个文件系统其实就是一 个简单的linux系统,可以进行简单的操作,如果要扩展功能又不想把img做得很大,可以考虑用mount文件系统然后转换的方式来做。
这样就将启动过程分成两个阶段,第一阶段就是用编入内核的文件系统做初始化,然后用定制的文件系统来跑应用程序。不仅减少了更新内核的负担,而且在更新的时候不需要更新应用程序的文件系统,文件系统和内核的更新可以分开来做,提高了效率。
init脚本
Linux启动后执行的第一个程序就根目录下的ini,友善通过init脚本来完成启动过程。其主要工作就是声明一些环境,加载要运行的文件系统,然后做文件系统的切换。因为不像X86下那么复杂,所以设备的初始化相对而言较为简单。启动脚本和注释如下:
#! /bin/sh #初始化环境变量
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask
export PATH runlevel prevlevel #
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
trap ":" INT QUIT TSTP
#设置主机名
/bin/hostname FriendlyARM
#mount proc文件系统
/bin/mount -n -t proc proc /proc #获取U-boot启动参数,主要设置文件系统内型、根目录、init等
cmdline=`cat /proc/cmdline` #声明初始化启动相关参数,并设置默认值
ROOT=none
ROOTFLAGS=
ROOTFSTYPE=
NFSROOT=
IP=
INIT=/sbin/init #从获取的命令中获取启动参数
for x in $cmdline ; do
case $x in
root=*)
ROOT=${x#root=}
;;
rootfstype=*)
ROOTFSTYPE="-t ${x#rootfstype=}"
;;
rootflags=*)
ROOTFLAGS="-o ${x#rootflags=}"
;;
init=*)
INIT=${x#init=}
;;
nfsroot=*)
NFSROOT=${x#nfsroot=}
;;
ip=*)
IP=${x#ip=}
;; esac
done if [ ! -z $NFSROOT ] ; then
#网络文件系统启动
echo $NFSROOT | sed s/:/\ /g > /dev/x ; read sip dir < /dev/x echo $IP | sed s/:/\ /g > /dev/x; read cip sip2 gip netmask hostname device autoconf < /dev/x
rm /dev/x mount -t nfs $NFSROOT /r -o nolock,proto=tcp elif [ ! -z $run_fs_image ] ; then
#制定的文件系统启动,这个环境变量还不知道是如何导出的,所以还需要了解,
#看到友善提供的配置文件需要制定启动的文件系统,感觉应该是和那个地方相关,
#但是又不能确定,高手可以指点一下
ROOTFSTYPE="-t ext3" #设置文件系统类型
#重复加载SD卡,重复尝试5次
for i in ; do
/bin/mount -n -o sync -o noatime -o nodiratime -t vfat /dev/mmcblk0p1 /sdcard && break
echo Waiting for SD Card...
sleep
done
#加载文件系统
/sbin/losetup /dev/loop0 /sdcard/$run_fs_image
/bin/mount $ROOTFSTYPE /dev/loop0 /r
mount -o move /sdcard /r/sdcard
else
#直接用指定的启动参数加载文件系统
/bin/mount -n $ROOTFLAGS $ROOTFSTYPE $ROOT /r
fi #检测并设置触摸屏的校正参数,可无
ONE_WIRE_PROC=/proc/driver/one-wire-info
ETC_BASE=/r/etc
[ -d /r/system/etc ] && ETC_BASE=/r/system/etc
[ -e $ETC_BASE/ts.detected ] && . $ETC_BASE/ts.detected
[ -z $CHECK_1WIRE ] && CHECK_1WIRE=Y
if [ $CHECK_1WIRE = "Y" -a -e $ONE_WIRE_PROC ] ; then
if read lcd_type fw_ver tail < $ONE_WIRE_PROC ; then if [ x$lcd_type = "x0" -a x$fw_ver = "x0" ] ; then TS_DEV=/dev/touchscreen else TS_DEV=/dev/touchscreen-1wire echo "1Wire touchscreen OK" fi if [ -e $ETC_BASE/friendlyarm-ts-input.conf ]; then sed "s:^\(TSLIB_TSDEVICE=\).*:\1$TS_DEV:g" $ETC_BASE/friendlyarm-ts-input.conf > $ETC_BASE/ts-autodetect.conf
mv $ETC_BASE/ts-autodetect.conf $ETC_BASE/friendlyarm-ts-input.conf -f
echo "CHECK_1WIRE=N" > $ETC_BASE/ts.detected
sync
fi
fi
fi [ -e /r/etc/friendlyarm-ts-input.conf ] && . /r/etc/friendlyarm-ts-input.conf
[ -e /r/system/etc/friendlyarm-ts-input.conf ] && . /r/system/etc/friendlyarm-ts-input.conf
export TSLIB_TSDEVICE #exec /bin/sh #文件系统替换
umount /proc
exec switch_root /r $INIT /r/dev/console >&
被“欺骗”的脚本
当初以为ext3的文件系统就是实际启动时执行的操作,但是那个却是一个错误的认识,之所以认为那个是启动的文件系统,是因为内核的一个配置参数和此文件系统包含了一些脚本,所以在启动时走了不少的弯路。
首先是对initramfs的认识不够,内核中有下面一个配置项:
1 |
General setup ---> |
2 |
(scripts/FriendlyARM.cpio) Initramfs source file (s) |
看了文件后,我以为是友善的一个加密程序,是为了保护自己的知识产权,所以以为它只是打包进去,到了加载初始化文件系统的时候从内核配置的地址读取文件系统,然后再用这个程序解密。其次那个启动的参数加深了我的这个认识,让我误入歧途,脚本如下:
1 |
Boot options ---> |
2 |
(console=ttySAC0,115200 root=/dev/ ram init=/linuxrc initrd=0x51000000,6M ramdisk_size=6144) |
所以我一直以为是我的文件系统没有拷贝到正确的物理地址,导致内核死掉;一直在尝试文件系统到内存并设置u-boot的环境变量,然后反复重新启 动,但是一直是无解,最后我绝望了。在网上看了很多资料,发现Initramfs source file配置的应该是文件系统,再看看这个配置项就感觉像是一个cpio命令归档的文件系统,然后果断尝试能否将他解压。用如下命令解压它的归档文件:
1 |
cpio -ivmd < FriendlyARM.cpio |
发现神奇般的解压开了,然后发现它就是一个文件系统,只是友善打包好了,然后配合它的Superboot来启动它的文件系统。然后就可以看到友善的 第一步启动过程,其脚本也在上一节做了一些注释(一开始我还是死脑子地认为init也是一个可执行文件,琢磨一段时间后才考虑直接打开的)。其实上面的 Boot options是使用ramdisk启动Linux所用到的配置项,用initramfs这个配置项是不必要的。
这样也就知道了mini6410的全部启动过程,前面走过的弯路总算有一个较好的结局了。
总结
其实Linux启动过程的介绍网上有很多,制作自己的最小启动系统的资料也不少,但是用了友善的开发板后总觉得它会保密,所以在理解它的一些机制的 时候总会有定向思维,不敢放手去做,总是觉得自己哪里做错了。其实应该大胆去尝试,毕竟搞开发的人不会去把简单问题复杂化。冷静的思考其实也很重要,看到 那个FriendlyARM.cpio时,我没有想到他是一个文件系统的归档文件,以为是和cpio命令相关的应用程序,这才让我走了很多弯路,其实可以 通过file命令查看一下它到底是什么文件,那样也不至于走那么多的弯路。还是自己的经验尚浅啊~~不过走了一些弯路应该会记得更加清楚。
【转载】Mini6410启动过程的更多相关文章
- [转载] Linux启动过程详解-《别怕Linux编程》之八
本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket.为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. = ...
- (转载)Linux启动过程详解
启动第一步--加载BIOS当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬盘 ...
- Android(java)学习笔记162:Android启动过程(转载)
转载路径为: http://blog.jobbole.com/67931/ 1. 关于Android启动过程的问题: 当按下Android设备电源键时究竟发生了什么? Android的启动过程是怎么样 ...
- 转载:oracle 启动过程--oracle深入研究
Oracle数据库的启动-nomount状态深入解析 通常所说的Oracle Server主要由两个部分组成:Instance和Database.Instance是指一组后台进程(在Windows上是 ...
- Android(java)学习笔记105:Android启动过程(转载)
转载路径为: http://blog.jobbole.com/67931/ 1. 关于Android启动过程的问题: 当按下Android设备电源键时究竟发生了什么? Android的启动过程是怎么样 ...
- 【转载】Linux启动过程
转自:http://cizixs.com/2015/01/18/linux-boot-process 简介 我们都知道:操作系统运行的代码是在硬盘上的,最终要跑到内存和 CPU 上,才能被我们使用. ...
- 【转载】简述Linux的启动过程
原文:简述Linux的启动过程 本文将简单介绍一下Linux的启动过程,希望对那些安装Linux的过程中遇到了问题的朋友有些帮助 声明:本人没用过UEFI模式和GPT分区格式,所有关于这两部分的内容都 ...
- 【转载】【凯子哥带你学Framework】Activity启动过程全解析
It's right time to learn Android's Framework ! 前言 一个App是怎么启动起来的? App的程序入口到底是哪里? Launcher到底是什么神奇的东西? ...
- Openfire的启动过程与session管理
说明 本文源码基于Openfire4.0.2. Openfire的启动 Openfire的启动过程非常的简单,通过一个入口初始化lib目录下的openfire.jar包,并启动一个 ...
随机推荐
- css中文本超出部分省略号代替
p{ width: 100px; //设置p标签宽度 white-space: nowrap; //文本超出P标签宽度不换行,而是溢出 overflow: hidden; //文本超出P标签,超出部分 ...
- 有关eclipse的内存溢出问题
一:前言 最近在做的项目在启动tomcat时就报“内存溢出的错误”,其实也不是自己第一次遇到,但是每次都是在网上查询后敲进去,所以这次我觉得自己记载下来吧. 二:内容 我自己的配置大小,这里的配置位置 ...
- HDU2544最短路---(Dijkstra)
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- Python基础(9)三元表达式、列表解析、生成器表达式
一.三元表达式 三元运算,是对简单的条件语句的缩写. # if条件语句 if x > f: print(x) else: print(y) # 条件成立左边,不成立右边 x if x > ...
- kettle基础操作
ETL:抽取(extract).转换(transform).加载(load)至目的端的过程: Kettle是ETL工具代表之一,是pentaho中的一个数据整合的一个组件.Kettle里包括多个Job ...
- unity下的Line of Sight(LOS)的绘制
先说说什么是Linf of Sight.在很多RTS游戏中,单位与单位之间的视野关系经常会受到障碍物遮挡.Line of Sight指的就是两个物体之间是否没有障碍物遮挡. 比如在dota中,玩家的视 ...
- BZOJ1037 DP
2013-11-15 21:51 原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1037 拿到这道题想到了DP,后来发现三维无法确定的表示状 ...
- POJ3264(线段树求区间最大最小值)
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 41162 Accepted: 19327 ...
- BigDecimal常用操作
import java.math.BigDecimal; public class BigDecimalUtil { /** * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 ...
- python中deque类详解
最近在pythonTip做题的时候,遇到了deque类,以前对其不太了解,现在特此总结一下 deque类是python标准库collections模块中的一项,它提供了两端都可以操作的序列,这意味着, ...