1.Linux内核预编译
开发者可以从xilinx的github源码库中下载各个版本的Linux内核,这里选用评估板提供的版本,将linux-xlnx-xilinx-v2015.4.zip压缩包通过虚拟机与主机共享方式拷贝至虚拟机共享目录中,并右键提取到此处。
- cd /home/work/linux-xlnx-xilinx-v2015.4/
- make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi-xilinx_zynq_defconfig
- make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- uImage LOADADDR=0x00008000
- 如果出现mkimage 工具无法找到,需要将u-boot的工具目录添加到环境变量export PATH:$PATH: /home/work/u-boot-xlnx-xilinx-v2017.4/tools
或指令安装u-boot-tools:apt-get install u-boot-tools
2.Linux内核裁剪
裁剪sd卡、多媒体、usb以及输入设备等功能:
- cd /home/work/linux-xlnx-xilinx-v2015.4/arch/arm/configs
- 修改xilinx_zynq_defconfig文件
- 注释SDHC的配置选项
- 注释USB的配置选项
- 注释Video配置选项
- 注释Sound配置选项
- 注释Input配置选项
- 退出并保存配置
- make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- menuconfig
- 取消设备驱动scsi 设备选项
- 取消设备驱动鼠标设备ps2选项
- 保存退出
- make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- uImage LOADADDR=0x00008000 重新编译
3.设备树编译
在终端linux目录下编译设备树文件,在编译之前将上次生成的device.dtb文件删除,编译指令:
- ./scripts/dtc/dtc -I dts -O dtb -o device.dtb ./arch/arm/boot/dts/zynq-zed.dts
4.Linux文件系统制作
在新制作的单板中,没有采用emmc,Sata等大容量存储设备,所以选用uramdisk.image.gz作为linux的根文件系统。制作步骤如下:
- cd /home/work
- git clone git://git.busybox.net/busybox
- cd busybox
- make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- defconfig 进行默认配置
- make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- menuconfig 进行图形化配置
- busybox settings->installation option->busybox installation->destination path for make install->prefix 图形化界面设置busy生成安装路径/home/work/rootfs
- miscellaneous utility->图形化界面然后设置flash erase_all,flashcp等工具
- Linux System Utilities—>nsenter,去掉该选项
- Coreutils--->sync选项去掉
- 保存配置文件退出
- make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- install 安装busybox工具到/home/work/rootfs
- cd ../root fs
- mkdir dev etc etc/init.d mnt opt proc root sys tmp var var/log var/www
- 将交叉编译工具链中的库文件拷贝到rootfs
mkdir lib
cp /home/work/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/arm-xilinx-linux-gnueabi/libc/lib/* lib/ -r
cp /home/work/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/arm-xilinx-linux-gnueabi/libc/sbin/* sbin/ -r
cp /home/work/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/arm-xilinx-linux-gnueabi/libc/usr/bin/* usr/bin/ -r
- gedit etc/fstab
LABEL=/ / tmpfs defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
none /proc proc defaults 0 0
none /sys sysfs defaults 0 0
none /tmp tmpfs defaults 0 0
- gedit etc/inittab
::sysinit:/etc/init.d/rcS
# /bin/ash
#
# Start an askfirst shell on the serial ports
ttyPS0::respawn:-/bin/ash
# What to do when restarting the init process
::restart:/sbin/init
# What to do before rebooting
::shutdown:/bin/umount -a –r
- gedit etc/init.d/rcS
#!/bin/sh
echo "Starting rcS..."
echo "++ Mounting filesystem"
mount -t proc none /proc
mount -t sysfs none /sys
mount -t tmpfs none /tmp
echo "++ Setting up mdev"
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /dev/pts
mkdir -p /dev/i2c
mount -t devpts devpts /dev/pts
echo "++ Starting telnet daemon"
telnetd -l /bin/sh
echo "++ Starting http daemon"
httpd -h /var/www
echo "++ Starting ftp daemon"
tcpsvd 0:21 ftpd ftpd -w /&
/sbin/ifconfig lo 127.0.0.1
/sbin/ifconfig eth0 192.168.31.230 netmask 255.255.255.0 up
/bin/hostname –F /etc/hostname
echo "rcS Complete"
- chmod 755 etc/init.d/rcS
- chown root:root etc/init.d/rcS
- gedit passwd 设置用户密码(小技巧:可以设置无密码,在文件系统运行后用passwd命令改动想要的同户名密码,绕后将新生成的密文passwd文件重新更新到文件系统当中,密码就被固定下来)
root:oJrTEY43dlHQI:0:0:root:/root:/bin/sh
/*这是我的密码,仅供参考*/
- gedit hostname
GMT
- gedit profile
HOSTNAM='/bin/hostname'
PS1='[\u@\h \w]\#'
export PS1 HOSTNAME
根文件系统的所有文件基本配置完毕,将根文件系统压缩成uramdisk.image.gz,在终端中运行以下指令:
- cd ..
- dd if=/dev/zero of=ramdisk16M.image bs=1024 count=16384
- mke2fs -F ramdisk16M.image -L "ramdisk" -b 1024 -m 0
- tune2fs ramdisk16M.image -i 0
- chmod 777 ramdisk16M.image
- mkdir ramdisk
- mount -o loop ramdisk16M.image ramdisk/
- cp -R /home/work/rootfs/* ramdisk
- umount ramdisk/
- gzip -9 ramdisk16M.image
- mkimage -n 'uboot ext2 ramdisk' -A arm -O linux -T ramDisk -C gzip -d ramdisk16M.image.gz uramdisk.image.gz
- 生成的uramdisk.image.gz可以用作rootfs启动linux内核