讯为iTOP-4412嵌入式学习。Linux最小系统制作与烧写
环境
- ubuntu 12.04 (GCC版本降为4.4)
1
2
3
4
5
6
7
8
9
10
11
12
13apt-get install gcc-4.4 g++-4.4 g++-4.4-multilib gcc-4.4-multilib
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 100
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 50
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.4 100
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 50
update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.4 100
update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.6 50
gcc -v
#恢复原来的gcc版本
update-alternatives --remove cpp-bin /usr/bin/cpp-4.4
update-alternatives --remove g++ /usr/bin/c++-4.4
update-alternatives --remove gcc /usr/bin/gcc-4.4 - win 7 (烧写)
- busybox 1.22.1 (开源,下载地址:https://busybox.net/)
- arm交叉编译器 arm-2009q3 (将提供的arm编译器arm-2009q3解压到/usr/local/arm,并在~/.bashrc中添加环境变量 export PATH=$PATH:/usr/local/arm/arm-2009q3/bin)
制作Linux最小系统
- 下载busybox 1.22.1 至ubuntu,并解压。
进入解压路径busybox-1.22.1,进行编译设置make menuconfig
(图形界面设置)
- Busybox Setting —> Build Option —> cross compiler prefix —> 填写 “arm-none-linux-gnueabi-”
- Busybox Setting —> Installation Options —> (./__install)Busybox installation prefix —> 更改为“../system” 将系统内核文件生成在上层目录的system中
保存设置
【tips】make menuconfig 命令依赖ncurses库的支持。如果没有安装该库会报错“scripts/kconfig/lxdialog/dialog.h:31:20: fatal error: curses.h: No such file or directory”
安装相应的库:sudo apt-get install libncurses5-dev libncursesw5-dev
3. make
编译安装busybox.
4. make install
将编译生成的二进制文件装入../system中
5. 这时候system路径中是如下的:
1
2
3
4
5|--system
|--bin
|--linuxrc
|--sbin
|--usr
完善Linux最小系统
制作文件系统还需要 /dev /mnt /lib /etc /proc /sys /tmp /var 等文件路径mkdir /dev /mnt /lib /etc /proc /sys /tmp /var
配置文件/etc
建立/etc/eth0-setting文件, 并将权限改为755
1
2
3
4
5IP=192.168.1.230
Mask=255.255.255.0
Gateway=192.168.1.1
DNS=192.168.1.1
MAC=08:90:90:90:90:90建立/etc/init.d/ifconfig-eth0文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#!/bin/sh
echo -n Try to bring eth0 interface up......>/dev/ttySAC2
if [-f /etc/eth0-setting]; then
source /etc/eth0-setting
if grep -q "^/dev/root / nfs " /etc/mtab ; then
echo -n NFS root ...> /dev/ttySAC2
else
ifconfig eth0 down
ifconfig eth0 hw ether $MAC
ifconfig eth0 $IP netmask $Mask up
route add default gw $Gateway
fi
echo nameserver $DNS > /etc/resolv.conf
else
if grep -q "^/dev/root / nfs " /etc/mtab ; then
echo -n NFS root ... > /dev/ttySAC2
else
/sbin/ifconfig eth0 192.168.253.12 netmask 255.255.255.0 up
fi
fi
echo Done > /dev/ttySAC2建立/etc/init.d/rcS文件,更改755权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
#
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
trap ":" INT QUIT TSTP
/bin/hostname iTOP-4412
#/bin/mount -n -t proc none /proc
#/bin/mount -n -t sysfs none /sys
#/bin/mount -n -t usbfs none /proc/bus/usb
#/bin/mount -t ramfs none /dev
[ -e /proc/1 ] || /bin/mount -n -t proc none /proc
[ -e /sys/class ] || /bin/mount -n -t sysfs none /sys
[ -e /dev/tty ] || /bin/mount -t ramfs none /dev
echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
#/bin/hotplug
# mounting file system specified in /etc/fstab
mkdir -p /dev/pts
mkdir -p /dev/shm
/bin/mount -n -t devpts none /dev/pts -o mode=0622
/bin/mount -n -t tmpfs tmpfs /dev/shm
#/bin/mount -n -t ramfs none /tmp
#/bin/mount -n -t ramfs none /var
mkdir -p /var/empty
mkdir -p /var/log
mkdir -p /var/log/boa
mkdir -p /var/lock
mkdir -p /var/run
mkdir -p /var/tmp
ln -sf /dev/ttyS2 /dev/tty2
ln -sf /dev/ttyS2 /dev/tty3
ln -sf /dev/ttyS2 /dev/tty4
syslogd
/etc/rc.d/init.d/netd start
echo " " > /dev/tty1
echo "Starting networking..." > /dev/tty1
#sleep 1
#/etc/rc.d/init.d/httpd start
#echo " " > /dev/tty1
#echo "Starting web server..." > /dev/tty1
#sleep 1
#/etc/rc.d/init.d/leds start
#echo " " > /dev/tty1
#echo "Starting leds service..." > /dev/tty1
#echo " "
#sleep 1
#echo "*************************************" > /dev/ttySAC2
#echo " http://www.topeet.com.cn " > /dev/ttySAC2
#echo "*************************************" > /dev/ttySAC2
#echo "*************************************"
#echo " http://www.topeet.com.cn "
#echo "*************************************"
mkdir /mnt/disk
sleep 1
/sbin/ifconfig lo 127.0.0.1
/etc/init.d/ifconfig-eth0建立/etc/passwd文件
1
2
3
4root::0:0:root:/:/bin/sh
bin:*:1:1:bin:/bin:
daemon:*:2:2:daemon:/sbin:
nobody:*:99:99:Nobody:/:建立/etc/profile文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14# Ash profile
# vim: syntax=sh
# No core files by default
ulimit -S -c 0 > /dev/null 2>&1
USER="`id -un`"
LOGNAME=$USER
PS1='[$USER@HOSTNAME]# '
PATH=$PATH
HOSTNAME=`/bin/hostname`
export USER LOGNAME PS1 PATH建立/etc/rc.d/init.d/netd, 修改755权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#!/bin/sh
base=inetd
# See how we were called.
case "$1" in
start)
/usr/sbin/$base
;;
stop)
pid=`/bin/pidof $base`
if [ -n "$pid" ]; then
kill -9 $pid
fi
;;
esac
exit 0
库文件/lib
交叉编译环境与内核编译环境相同,编译器是arm-2009q3. Busybox编译生成的二进制文件以动态链接库的形式运行,所以要拷贝编译器里边的库文件到lib目录下cp /usr/local/arm/arm-2009q3/arm-none-linux-gnueadi/libc/lib/* [lib dir]
日志目录 /var
在该目录下建立 ./lib ./lock ./log ./run ./tmp等五个目录
到这里就制作好了文件系统
安装打包软件和编译
打包工具make_ext4fs用来将文件系统制作成二进制文件。提供的linux_tools.tgz, 解压到/
目录下
在最小linux系统/system路径下,使用命令make_ext4fs -s -l 314572800 -a root -L linux system.img system
生成system.img文件系统镜像。
烧写最小系统
在win7下,通过Hyper Terminal 串口与版子进行连接,注意串口UART不支持热插拔
在Hyper Terminal下,命令
1 | fdisk -c 0 |
将板子的OTG与win7连接起来,查看电脑是否能识别android phone,如果没有的话要安装驱动(位于文件02_编译器与烧写工具/tools/usb_otg_driver中,关注自己win7的版本)
在cmd.exe中运行(注意在cmd中,更改路径为 cd /d platform_tools)
1 | fastboot.exe flash kernel file/zImage |
交叉编译一个helloworld文件,并做进system/tmp中
代码交叉编译helloworld.c
- 保证环境变量将arm-2009a3/bin加进PATH
arm-none-linux-gnueabi-gcc helloworld.c -o helloworld -static
-static静态链接将运用到的库静态链接进入可执行文件,因为现在的linux最小系统/usr中并没有包括glibc的动态链接库。注意这个helloworld文件在ubuntu下是不能执行的,因为是按照arm指令集进行编译的,而不是x86系统下的gcc编译的。- 将编译好的helloworld可执行文件cp到linux最小系统的/tmp路径下,将最小系统进行烧写。
- 在Hyper Terminal下运行helloworld。