海思3518E开发笔记1.6——rootfs及其启动流程分析

~ # cd /etc/
/etc # ls
fs-version  group       inittab     passwd      profile     services
fstab       init.d      mtab        passwd-     protocols   udev

这块芯片的根文件系统里有这么多东西
在这里插入图片描述
这些都是提前做好的

挂载根文件系统后第一个启动的就是/etc/init.d/rcS文件

/etc/fstab

其中/etc/fstab的作用是挂载文件系统
在这里插入图片描述

fs-version

fs-version是版本号

~/Hi3518E_SDK_V1.0.3.0/osdrv/pub/rootfs_uclibc/etc$ cat fs-version 
01000100	rootbox	nohelp info

group

group用于管理用户组

~/Hi3518E_SDK_V1.0.3.0/osdrv/pub/rootfs_uclibc/etc$ cat group 
root::0:

3518E登录后提示符是#不是$,就是这里的设置,里面的值为root::0:导致开发板登入时为root用户

profile

profile :启动的时候会默认去调用里面的东西,与环境变量设置相关

echo &PATH /usr/bin:/usr/sbin:/bin:/sbin
表示环境变量
echo "${GREEN}Welcome to HiLinux.${NORMAL}"

表示开始启动的Welcome to HiLinux.这句话用绿色打印出来,然后再把颜色设置为NORMAL

udev

udev详解
udev目录用来做即插即用的,usb、sd卡等,其中rules.d是拔插的规则(拔插会造成的结果),这一套就能够保证设备能识别到插入的卡

init

init.d目录
在这里插入图片描述
现在比较新的设备中都是这种格式


rcS

其中,rcS用来调用其余文件

#! /bin/sh

/bin/mount -a

echo "
            _ _ _ _ _ _ _ _ _ _ _ _
            \  _  _   _  _ _ ___
            / /__/ \ |_/
           / __   /  -  _ ___
          / /  / /  / /
  _ _ _ _/ /  /  \_/  \_ ______
___________\___\__________________
"
for initscript in /etc/init.d/S[0-9][0-9]*
do
	if [ -x $initscript ] ;
	then
		echo "[RCS]: $initscript"
		$initscript
	fi
done

程序上电后第一个执行的就是rcS
执行的/bin/mount -a就是把mount/table里面的东西全部挂上

然后使用echo打印海思的Hi 的logo
for initscript in /etc/init.d/S[0-9][0-9]*
就是将这个文件夹中除了rcS本身,其他的文件都算上
然后用for循环挨个拿出来
在这里插入图片描述
再用do进行检验
if [ -x $initscript ] ;括号中表示可执行且为真
括号内为真就去打印文件的名字再执行
在这里插入图片描述
启动的打印如上图所示


S00devs

S00devs文件内容如下:创建设备节点

#!/bin/sh

mknod /dev/console c 5 1
mknod /dev/ttyAMA0 c 204 64
mknod /dev/ttyAMA1 c 204 65
mknod /dev/ttyS000 c 204 64
mknod /dev/null	   c 1 3

在自己制作根文件系统的时候着重处理的是nullconsole
ttyAMA0ttyAMA1ttyS000会在驱动中自动产生

注意:其实我们在做文件系统的时候已经做了console、ttyAMA0、null打印就会提示文件已经存在

mknod: /dev/console: File exists
mknod: /dev/ttyAMA0: File exists
mknod: /dev/null: File exists

如果需要去了解这里为什么要自己做,就需要去研究海思改过的内核。但是去研究他们修改的内核就没有必要了。
每一家公司的工程师做事都有其习惯,他内核里面怎么设计的和他根文件系统中怎么对应的都有不同厂商各自的玩法。

在实际工作中,只要稍微看一下,顺着他的玩法走下去就行了。


S01udev

S01udev文件内容如下:

#!/bin/sh

mkdir /dev/pts
mount -t devpts devpts /dev/pts

mkdir -p /dev/.udev
udevd --daemon
udevadm trigger

先创建/dev/pts目录,再把devpts这个文件系统挂载上去
再在/dev/底下创建.udev
执行udevd,udev其实就是linux中的一个应用程序
udevd是一个应用程序,–daemon 就是创建那个守护进程,进程创建后内核就可以检测即插即拔的设备


S80network

S80network文件内容如下:

#!/bin/sh

ipaddr=
bootp=
gateway=
netmask=
hostname=
netdev=
autoconf=

for ipinfo in `cat /proc/cmdline`
do
	case "$ipinfo" in
	ip=*)
		for var in  ipaddr bootp gateway netmask hostname netdev autoconf
		do
			eval read $var
		done << EOF
		`echo "$ipinfo" | sed "s/:/\n/g" | sed "s/^[ 	]*$/-/g"`
EOF
		ipaddr=`echo "$ipaddr" | cut -d = -f 2`
		[ x$ipaddr == x ] && ipaddr=x
		;;
	esac
done

[ -z "$ipaddr" ] && exit 0

echo "      IP: $ipaddr"
echo "   BOOTP: $bootp"
echo " GATEWAY: $gateway"
echo " NETMASK: $netmask"
echo "HOSTNAME: $hostname"
echo "  NETDEV: $netdev"
echo "AUTOCONF: $autoconf"

if [ x$ipaddr == x- ] ; then
	# use DHCP
	:
else
	cmd="ifconfig $netdev $ipaddr"
	[ x$netmask != x- ] && cmd="$cmd netmask $netmask"
	eval $cmd
	[ x$gateway != x- ] && route add default gw $gateway
fi

ifconfig lo 127.0.0.1
for ipinfo in `cat /proc/cmdline` 

cat /proc/cmdline输入给设备

~ # cat /proc/cmdline
mem=32M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1024K(boot),3072K(kernel),12288K(rootfs)

这就是之前我们在配置的时候输入给putargscmdline

这个文件就是将这个cmdline拿过来,以空格为分隔,一个一个拿出来,看看有没有和网络有关的

在这里插入图片描述
这里的case是判断cmdline中有没有ip地址
显然我们之前的输入没有
如果有的话,那么就打印出来

再往下走
[ -z "$ipaddr" ] && exit 0
-z用于测试ipaddr长度是否为0,如果ipaddr长度为0则成立,则执行exit 0退出

如果执行了
在这里插入图片描述
最后将ip地址设置为127.0.0.1
在命令行输入ifconfig -a
在这里插入图片描述
可以看到,虽然有两张网卡,但是都没有网络连接
这就是因为cmdline中没有ip地址然后退出,下面全部没有执行

所以,若将来想要修改ip地址,就需要将相应的内容放在[ -z "$ipaddr" ] && exit 0前面


S90hibernate

S90hibernate文件内容如下:

#!/bin/sh

echo "/root/pm_callback" > /proc/sys/kernel/pm_notifier

cmdline=`cat /proc/cmdline`
hbtype=resume

for str in $cmdline
do
	case $str in 
	     hbtype=*)
	     hbtype=`echo "$str" | awk -F"=" '{print $2}'`
	esac
done

if [ "$hbtype"x = "snap"x ]; then
	echo "hibernate start"
	echo disk > /sys/power/state
fi

echo "/root/pm_callback" > /proc/sys/kernel/pm_notifier与电源管理相关

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要搭建海思3518环境,你需要参考官方文档和相关教程。可以参考Hi3516EV200R002C05SPC012\ReleaseDoc\zh\01.software\board\OSDRV\Hi35xx Huawei LiteOS 开发环境用户指南和Hi3516EV200R002C05SPC012\ReleaseDoc\zh\01.software\board\Hi3516EV200╱Hi3516EV300╱Hi3518EV300 Huawei LiteOS SDK 安装以及升级使用说明中的指南和说明。这些文档会提供详细的步骤和说明,帮助你完成环境搭建的过程。另外,你还可以参考基于3519av100的SDK开发环境搭建过程,这可以起到触类旁通的作用,帮助你尽快上手海思35系列的开发工作。在搭建过程中,可能会涉及到网络设置,你可以使用命令"sudo ifconfig ens33 down"重启网卡,然后使用"sudo ifconfig ens33 up"启动网卡。通过参考这些文档和教程,你应该能够成功搭建海思3518环境。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [海思Hi3518—开发环境搭建](https://blog.csdn.net/s19933183110/article/details/114752066)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [华为海思35xx开发板的SDK环境搭建](https://download.csdn.net/download/weixin_27219587/19749555)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Spark!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值