zynq开发学习记录:Linux内核、设备树编译及文件系统制作

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内核

你可能感兴趣的:(zynq,Linux)