本文以是三星tiny4412芯片为例,操作系统为Linux。
通过串口连接开发板请看我上一篇播客,此时开发板是没有Linux内核的,本篇文章将说明内核移植以及文件系统挂载。
一、内核
1.概念
这里的内核指的就是linux的操作系统,操作系统是管理计算机软件和硬件的计算机的程序,这是一个大型的复杂的计算机程序,操作系统是由内核+文件系统组成的。
操作系统是一个管理者:
管理文件
管理设备
管理网络
管理进程
管理内存
2.linux内核的文件夹
arch 架构相关的文件夹
存放的都是架构初始化相关的代码
初始化所需要的头文件
\linux-3.5-20141114\linux-3.5\arch\arm\mach-exynos
Documentation:说明文档
drivers:驱动相关的源代码
include:标准的头文件
net :网络相关的文件
sound:声卡相关的
Makefile :管理整个工程的makefile文件
如下三个文件比较重要:
tiny4412_android_defconfig 当编译安卓的内核使用的配置文件
tiny4412_linux_defconfig 当编译linux内核使用的配置文件
tiny4412_ubuntu_defconfig ubuntu的配置文件
这三个配置文件,是友善之臂提供的配置好的文件,假如我们自己要想配置内核,这个工作量很大。自己配置的时候,我们需要借助于make menuconfig 界面,要想能够进入menuconfig 必须安装一个库。
sudo apt-get install libncurses5-dev
在make menuconfig配置完成之后 会将配置文件放入到.config。文件里makefile就会根据.config 来编译内核。
要想使用友善之臂提供的配置文件
cp tiny4412_linux_defconfig ./.config
3.linux内核的配置和编译
1.拷贝配置文件 替代原有的配置
cp tiny4412_linux_defconfig ./.confi
2.去掉内核的保护机制
在linux内核的根目录 执行 make menuconfig
通过上下键选择 system type,按回车进入,按空格键将如图所示的选项前边的*变成 空格
3.修改配置文件
在linux内核的根目录执行
gedit kernel/timeconst.pl 打开配置文件
在373行有一句
if (!defined(@val)) { 改成 if (! (@val)) {
保存退出。
4.执行编译的命令
编译
make && make zImage
5.当出现如下两句话则表示内核已经编译完成了
Kernel: arch/arm/boot/Image is ready
Kernel: arch/arm/boot/zImage is ready
编译完成的内核位置为
linux-3.5/arch/arm/boot
6.烧录中断向量表
将sd卡插入到电脑上 并且让虚拟机识别。
sudo dd iflag=dsync oflag=dsync if=/uboot_tiny4412-sdk1506/sd_fuse/tiny4412/E4412_tzsw.bin of=/dev/sdb seek=705
7.烧录内核
sudo dd iflag=dsync oflag=dsync if=./zImage of=/dev/sdb seek=1057
8.将sd卡插回到开发板上,上电。
在mobx出现如下界面则表示内核烧录成功 。
二、文件系统
制作文件系统一般是先制作三个文件夹bin、sbin、usr,制作这三个文件必须使用busybox。
1.文件系统制作
1.将busybox压缩包拷贝到虚拟机
2.解压压缩包
tar xvf busybox-1.21.1.tar.bz2
3.进入到解压后busybox目录busybox-1.21.1
4.在busybox的根目录执行
make menuconfig
5.设置共享库
依次进入如下图所示
6.指定交叉编译工具
没有交叉编译工具可以自行下载,以后会出一篇交叉编译的博库(如果有时间的话,我把编译工具放本篇开头的资料里,需要的可以自取)
7.设置文件系统的安装的位置。
此路径不唯一,这个文件夹在挂载成功以后更新的数据会实时同步到开发板上。
8.添加模块化命令
9.保存退出
10.编译并安装
make && make install
11.编译安装完成之后 会在指定的位置生成一个文件夹
12.进入到生成的文件夹里
13.拷贝文件系统所用到的库
cp /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib/ ./ -rap
14.补全目录
mkdir dev etc/init.d home proc sys root opt tmp var -p
15.创建设备节点
mknod dev/console c 5 1
mknod dev/null c 1 3
16.创建/etc/fstab
vim etc/fstab
添加如下内容
# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
17.创建inittab文件
vim etc/inittab
添加入如下内容
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
18.创建rcS文件
vim etc/init.d/rcS
添加如下内容
#!/bin/sh
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
/bin/hostname XYD
19.给rcS文件加上可执行权限
chmod +x etc/init.d/rcS
20.创建etc/profile文件
vim etc/profile
添加如下内容
USER="`id -un`"
LOGNAME=$USER
PS1='[\u@\h \W]# '
PATH=$PATH
HOSTNAME=`/bin/hostname`
export USER LOGNAME PS1 PATH
21.拷贝用户密码和组相关文件
cp /etc/group /etc/passwd ./etc/
2.配置虚拟机
1.安装nfs服务器端 要保证网络是通畅的
sudo apt-get install nfs-kernel-server
2.配置nfs服务
sudo vim /etc/exports
添加如下一句话 共享文件夹
/home/duan/work/20230620202/rootfs *(rw,sync,no_root_squash)
3.如果开发板上的nfs服务的版本比较老
需要修改一个配置,让他向下兼容
sudo vim /etc/default/nfs-kernel-server
在文件的最后加上
RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog"
4.重启nfs服务
sudo /etc/init.d/nfs-kernel-server restart
5.设置网络
点击 右上角的 + 号
此处ip信息可以随意填写,但一定要与配置开发板上的ip信息相对应。
6.配置虚拟机的网络链接的方式 先挂起虚拟机
桥接到有线网卡。
3.配置开发板
1.将开发板网线跟电脑链接一起,启动开发板 在倒计时结束之前 按任意键进入命令行模式
set bootargs 'noinitrd root=/dev/nfs nfsroot=192.168.15.2:/home/dsp/rootfs ip=192.168.15.5:192.168.15.2:192.168.15.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0 lcd=S70'
此处信息要与虚拟机ip设置的信息相对应,不然ping不通。
2.保存配置
save
3.重启uboot
reset
4.当出现如下界面的时候 表示文件系统挂载成功
注意点:
虚拟机防火墙要关闭。
sudo ufw disable
物理机的防火墙也要关闭。
其他会出现的问题我放到本章的资料中,如有需要请到相应资源中下载。
挂载文件系统很难一次成功,如果有问题可以多操作几次,也可以参考我资料中系统挂载问题总结的PDF。