大家好,又见面了,我是你们的朋友全栈君。
本文打造一个迷你的LINUX系统,讲述了arm嵌入式设备的常用方法和过程。适合新手入门,当然最好还是知道什么是交叉编译,和懂得linux的基本命令。
先说说大致的思路,要在cubieboard板子上跑起来一个linux需要四大件:uboot,script-bin,linux内核(uImage),rootfs(这个我们自己做)
前面3个已经很多人写过相关的文章了,我们不厌其烦的也多做一遍。
本文所用的系统是FC17-i686的系统,工具琏是4.7.2,arm-unknown-linux-gnueabi-,网上找的
需要准备的源码:
busybox-1.21.0
google一搜一大吧。
linux 3.4.5
git clone https://github.com/linux-sunxi/linux-sunxi/tree/sunxi-3.4
sunxi-boards
git clone https://github.com/linux-sunxi/sunxi-boards
sunxi-tools
git clone https://github.com/linux-sunxi/sunxi-tools
u-boot-sunxi
git clone https://github.com/linux-sunxi/u-boot-sunxi
准备好这些东东,我们就可以了开始干活了,首先把SD卡拿出来,确保上面没有重要的数据资料。
我建议大家用root用户进行操作,不然经常使用sudo很麻烦
1.首先是给SD卡分区,假设你的卡是/dev/sdx
fdisk /dev/sdx
我的卡是8g的,我的分区如下:
/dev/sdb1 2048 34815 16384 83 Linux /dev/sdb2 34816 15122431 7543808 83 Linux
分区大小可以按自己喜好,但第一个区要从2048开始,这个切记。什么fdisk不会用?。。。。d是删除,n是创建,w是保存,q是退出。
分好区,就是要格式化了
mkfs.vfat /dev/sdx1
mkfs.ext4 /dev/sdx2
现在把它们mount到本地
mount /dev/sdx1 /mnt/card1
mount /dev/sdx2 /mnt/card2,没有card目录请自己创建。
在开始所有的编译之前,我们要把交叉编译工具加入到PATH的环境变量
比方我的工具包放在/tools下,arm-unknown-linux-gnueabi-在/tools/bin目录下,那么
代码语言:javascript复制export PATH="/tools/bin:$PATH"
这个只对当前终端和其子终端有效。
2.编译uboot,
uboot是一个bootloader,有关他的介绍很多,我们在这里不多做介绍了。
进入uboot-sunxi目录:
代码语言:javascript复制make distclean CROSS_COMPILE=arm-unknown-linux-gnueabi-
make cubieboard CROSS_COMPILE=arm-unknown-linux-gnueabi-
编译完,执行命令
代码语言:javascript复制dd if=spl/sunxi-spl.bin of=/dev/sdb1 bs=1024 seek=8
dd if=u-boot.bin of=/dev/sdb1 bs=1024 seek=32
在tools/下有个文件叫mkimage,以后编内核和boot.src会用上,把它拷贝到/usr/bin目录下吧。如果你有的话,可以不这么做。
cp tools/mkimage /usr/bin
3.编译sunxi-tools
不需要什么config,直接make
没有看到error,就说明成功了,请直接到4,不成功继续往下看。
如果出现报错:
Package libusb-1.0 was not found in the pkg-config search path. Perhaps you should add the directory containing `libusb-1.0.pc’ to the PKG_CONFIG_PATH environment variable No package ‘libusb-1.0’ found fel.c:21:20: 致命错误:libusb.h:没有那个文件或目录 编译中断。 make: *** [fel] 错误 1
如果是ubuntu用户,用apt-get install libusb-dev可以搞定。
但是如果和我一样是用fedora用户的话,就稍微麻烦点了。首先要去下一个叫libusb-1.0.9(版本号无所谓了)的包,解压进入目录
代码语言:javascript复制./configure
make CROSS_COMPILER=arm-unknown-linux-gnueabi-
make install
cp libusb/libusb.h /usr/include
cp libusb-1.0.pc /usr/share/pkgconfig
4.编译script-bin
这个最简单
代码语言:javascript复制cd sunxi-boards/sys_config/a10/
../../../sunxi-tools/fex2bin cubieboard.fex script.bin
把script.bin拷贝到/mnt/card1
cp script.bin /mnt/card1
5.编译uImage
这个时间会稍微长点。其实也很简单。不过有点要注意的,在linux下面解压unzip有时候会缺少文件,建议大家用7zip
代码语言:javascript复制make ARCH=arm sun4i_defconfig
make ARCH=arm CROSS_COMPILE=arm-unknown-linux-gnueabi- uImage
同样,把arch/arm/boot/uImage 拷贝到/mnt/card1
cp arch/arm/boot/uImage /mnt/card1
6.创建boot.src
代码语言:javascript复制cd /mnt/card1
touch boot.cmd
vi boot.cmd
#按i输入下面内容:
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 init=/sbin/init rootwait panic=10 ${extra}
fatload mmc 0 0x43000000 script.bin
fatload mmc 0 0x48000000 uImage
bootm 0x48000000
#按esc 再按:wq保存退出
mkimage -C none -A arm -T script -d boot.cmd boot.scr
现在你的/mnt/card1下面应该有4个文件:
boot.scr ; boot.cmd; uImage;script.bin;
启动分区的工作到此为止了。
7.编译busybox
代码语言:javascript复制make ARCH=arm defconfig
make ARCH=arm menuconfig
busybox settings–>
build option –>
Build BusyBox as a static binary (no shared libs) 把这个选上,意思是静态编译
Cross Compiler prefix 输入交叉编译器前缀,我这里是:arm-unknown-linux-gnueabi-
networking Utilities –>
inetd 这个去掉,选上的话编译会有问题。
如果出现错误:
miscutils/nandwrite.c:49:26: fatal error: mtd/mtd-user.h: No such file or directory compilation terminated. make[1]: *** [miscutils/nandwrite.o] 错误 1 make: *** [miscutils] 错误
则使用命令,拷贝相应文件
cp -Rv /usr/include/mtd/ include/
如果还缺少其它的,一样道理
编译完毕,
make install
默认装在_install文件夹下面
8.创建根文件系统
把_install 下面的东东都拷贝到/mnt/card2
cp -Rv _install/* /mnt/card2
cp -Rv examples/bootfloppy/etc /mnt/card2
在mkdir下面创建文件夹/dev /proc /sys /var /home /tmp /mnt /run等目录
修改etc下面的fstab文件如下:
代码语言:javascript复制proc /proc proc nosuid,noexec,nodev 0 0
sysfs /sys sysfs nosuid,noexec,nodev 0 0
devpts /dev/pts devpts gid=4,mode=620 0 0
tmpfs /tmp tmpfs defaults 0 0
devtmpfs /dev devtmpfs mode=0755,nosuid 0 0
/dev/mmcblk0p1 /boot vfat defaults 0 2
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
修改initab文件如下:
代码语言:javascript复制::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
好了,umount 它们,尝试启动一下系统吧。
当你看到Please press Enter to activate this console,按一下,就可以进入终端了
网卡设备还没启动。如果要启动的话,也是可以的。不过不在这里一一说明了。呵呵
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/163059.html原文链接:https://javaforall.cn