根文件系统制作: 手动创建基本目录结构,各目录的功能了解; 从下载busybox-1.9.1.tar.bz2源码包并解压; 修改makefile: ARCH ?= $(SUBARCH) CROSS_COMPILE ?= 改为 ARCH ?= arm CROSS_COMPILE ?= arm-linux- Make defconfig Make menuconfig 配置(编译器上面已经修改)及安装路径;选择ash; Make Make install Bootloader中内核参数init=/linuxrc,内核启动后首先执行/linuxrc(busybox的一个符号链接): 设置信号处理程序; 初始化console; 解析/etc/inittab文件; 执行系统初始化脚本,默认是/etc/init.d/rcS; 执行inittab中的wait程序; 执行inittab中的once程序; 此后init程序循环执行以下步骤: 执行inittab中类型为respawn的程序,若终止,再次执行它; 收到用户请求,执行inittab中类型askfirst程序; Linuxrc需要读取设备文件/dev/console和/dev/null,手动创建这些: Cd rootfs/dev; sudo mknod –m 600 console c 5 1; sudo mknod –m 666 null c 1 3 常见文件的设备号可查看Document/devices.txt文件中查看; rcS中,mount –a 作用是根据/etc/fstab配置文件提供的信息mount一些文件系统: rootfs/etc/fstab: proc /proc proc defaults 0 0 sys /sys sysfs defaults 0 0 接下来系统会执行到/sbin/getty 115200 s3c2410_serial0 所以需要创建设备文件: Cd Rootfs/dev; sudo mknod –m 600 s3c2410_serial0 c 204 64 可查看/Document/arm/Samsung-S3C24XX/Overview.txt中设备号; 打开虚拟终端后会提示输入用户名和密码: 创建passwd和group: Passwd: root::0:0:root:/:/bin/sh Group: root::0: 这样创建了一个root帐号,没有密码,如需要密码,可以把主机/etc/shadow文件中root帐号那行放入开发板根文件系统中; 由于busybox需要glibc支持,关于共享库的查找规则: 首先在LD_LIBRARY_PATH所记录的路径中查找; 然后从缓存文件/etc/ld.so.cache中查找。 将路径写入/etc/ld.so.conf然后执行ldconfig命令即可生成; 然后到系统默认路径/lib /usr/lib下查找; 前面制作交叉编译工具时已经编译了glibc,拷贝库到根文件系统: Cp –a /opt/crosstool/gcc-4.0.2-glibc-2.3.6/arm-linux/arm-linux/lib/* ~/rootfs/lib/ Busybox中不含ldconfig,将前面生成的ldconfig拷贝到根文件系统: Cp crosstool-0.43/build/arm-linux/gcc-4.0.2-glibc-2.3.6/build-glibc/elf/ldconfig rootfs/sbin/ 现在可以通过NFS启动系统了; mdev是裁剪过的udev,mdev需要一个配置文件/etc/mdev.conf,用touch建立一个; rcS中: mount –t tmpfs mdev /dev mdev –s mkdir /dev/input ln –s /dev/mice /dev/input/mice 重新启动,开发板/dev/下面创建了许多设备文件; 系统时钟: 将主机的时区文件拷贝到根文件系统: Cp /etc/localtime ~/rootfs/etc/ rcS中添加: hwclock –hctosys,读取硬件时钟到系统; 命令hwclock –systohc可以将时间写入RTC; 网络配置: 如果是flash根文件系统启动,需要重新配置IP地址和激活网络接口,rcS中: Ifup –a 并且添加一个配置文件: Rootfs/etc/network/interfaces: Auto lo Iface lo inet loopback Auto eth0 Iface eth0 inet static Address 192.168.1.11 Netmask 255.255.255.0 Gateway 192.168.1.111 Httpd配置: rcS中: httpd –h /srv/www mkdir –p /srv/www/cgi-binVivi的使用: Para show Para set ip “192.168.1.11” Para set host “192.168.1.111” Para set gw “192.168.1.11” Para save Part show Part del usr Part add root 0x00200000 0x03e00000 0 Load flash kernel t $ atftp –l ./zImage –p 192.168.1.11 Load flash root t $ atftp –l rootfs-basic.cramfs –p 192.168.1.11 Para set linux_cmd_line “noinitd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0” Para save Boot (none)login:root 制作根文件系统:mkcramfs ~/rootfs rootfs.cramfsNFS Root: /etc/exports: /home/USERNAME/rootfs *(rw,sync,no_root_squash) 采用rpcinfo –p查看服务是否启动,exportfs查看导出目录; Para set linux_cmd_line “noinitrd root=/dev/nfs rw ip=192.168.1.11:192.168.1.111::255.255.255.0:::off nfsroot=/home/USERNAME/rootfs/ init=/linuxrc console=ttySAC0” Para saveYAFFS Root: Flash_eraseall /dev/mtd3 Mount –t yaffs /dev/mtdblck3 /mnt 从根文件系统中拷贝文件到flash分区: Cp –a bin etc lib linuxrc opt sbin srv tmp usr /mnt/ Mkdir –p /mnt/proc /mnt/sys /mnt/dev /mnt/mnt /mnt/var/run Mknod /mnt/dev/console –m 600 c 5 1 Mknod /mnt/dev/null -m 666 c 1 3 Umount mnt RebootPara set linux_cmd_line “noinitrd root=/dev/mtdblock3
init=/linuxrc console=ttySAC0”
Boot
编译内核:
解压内核源码包,进入目录;
修改 Makefile ,找到
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
改为
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
~/linux-2.6.17.14$ patch –p1 < ../patch-2.6.17.14-board
Cp arch/arm/configs/smdk2410_defconfig .config
Make menuconfig
进行选项配置
然后, make ,结果在 arch/arm/boot/zImage ;
交叉工具链编译:
Binutils-2.16.1.tar.bz2
Gcc-4.0.2.tar.bz2
Glibc-2.3.6.tar.bz2
Glibc-linuxthreads-2.3.6.tar.bz2
Linux-2.6.15.4.tar.bz2
Linux-libc-headers-2.6.12.0.tar.bz2
步骤:
根据目标平台配置内核源代码,生成内核头文件;
编译 binutils ;
编译器的自举 (bootstrap) ,也就是先编译出 gcc 的部分功能;
编译 glibc ;
编译完整的 gcc ;
也可采用制作交叉编译器的脚本 ,执行该脚本会自动从官网下源代码,自动打补丁,然后自动完成编译步骤;
下载 crosstool-0.43.tar.gz ,解压后进入目标,修改 demo-arm.sh 脚本,采用
Eval `cat arm.dat gcc-4.0.2-glibc-2.3.6.dat` sh all.sh –notest
注意脚本开头
TARBALLS_DIR=$HOME/downloads 下载源码的位置
RESULT_TOP=/opt/crosstool 最后结果的位置
给 /opt 目录增加写权限, sudo chmod a+w /opt
修改 arm.dat,
TARGET=arm-linux
编译需要: patch,bison,flex 等软件包;
Ubuntu的 sh 指向 bash : sudo ln –sf bash sh
准备就绪后,在 crosstool-0.43 目录下运行 demo-arm.sh 开始编译,完成后可执行文件在:
/opt/crosstool/gcc-4.0.2-glibc-2.3.6/arm-linux/bin目录下; **************************uboot usage******************************* ==TFTP的配置 1. 首先需要安装tftpd的相关软件包 $ sudo apt-get install xinetd tftpd tftp 2.设置xinetd的tftp服务,具体为在/etc/xinetd.d/目录下创建一个tftp文件,并将如下的内容拷贝到该文件中 service tftp { protocol = udp port = 69 socket_type = dgram wait = yes user = nobody server = /usr/sbin/in.tftpd server_args = /tftpboot disable = no } 这里的server_args 后面的参数tftpboot为tftp的存取目录 3. 创建tftp文件的存取目录tftpboot,并修改其目录的权限 $ sudo mkdir /tftpboot $ sudo chmod -R 777 /tftpboot $ sudo chown -R nobody /tftpboot 4. 重启xinetd服务 $ sudo /etc/init.d/xinetd restart $ sudo ifconfig eth0 192.168.1.21 up ==NFS的配置 1. 首先需要安装nfs服务的相关软件包 sudo apt-get install nfs-kernel-server 2.创建nfs的存取目录rootfs,并修改其目录的权限 $ sudo mkdir /rootfs $ sudo chmod -R 777 /rootfs $ sudo chown -R nobody /rootfs 3. 配置要输出的目录,可以在 /etc/exports 文件中添加该目录 /rootfs *(rw,no_root_squash,subtree_check,async) /nfs_root *(rw,sync,no_root_squash) 4.重新启动nfs服务 sudo /etc/init.d/nfs-kernel-server restart ==编译可运行于NandFlash上的uboot 编译完成后,在目录下应该能生成一个 u-boot.bin,将该文件拷贝到 tftp 的导出目录中并重命名 $ sudo mv u-boot.bin /tftpboot/u-boot-nand.bin ==编译可以运行在内存中可以进行调试的u-boot $ make clean $ make TEXT_BASE=0x33000000 编译完成后在目录下同样会生成一个u-boot.bin的文件,将该文件拷贝到tftp的导出目录中并重命名 $ sudo mv u-boot.bin /tftpboot/u-boot-ram.bin ==将调试版本的u-boot加载到内存中运行 如果开发板上装有vivi的情况下可以利用vivi的load和go命令来进行,这里介绍的是利用u-boot的功能来加载u-boot的方法。首先应该确认主机上的tftp的配置已经完成,具体的配置可以参考1.3.1节的介绍。具体的步骤如下: 1. 对uboot的ip进行配置,这里设主机的ip为192.168.1.21,分配给开发板的ip为192.168.1.22 ,则应该在u-boot的命令行上输入 setenv ipaddr 192.168.1.22 setenv netmask 255.255.255.0 setenv serverip 192.168.1.21 saveenv 可以利用printenv来查看所设置的env是否正确,整个过程如下图所示 2. 确定主机和开发板之间的网线连接正确,这可以利用u-boot中的ping命令进行验证 ping 192.168.1.21 3.确定之前的u-boot-ram.bin拷贝到tftp的导出目录tftpboot中 sudo cp u-boot-ram.bin /tftpboot 4.利用tftp命令将u-boot-ram.bin加载到0x33000000上 tftpboot 0x33000000 u-boot-ram.bin 5.利用go命令跳转到加载的u-boot上执行 go 0x33000000 ==将uboot烧到开发板的Nandflash中 这里介绍通过u-boot的命令将u-boot烧写到NandFlash上的方法 1. 首先通过tftp将u-boot的nand版本加载到内存,这里设为0x32000000 tftpboot 0x32000000 u-boot-nand.bin 2.在写入NandFlash前应先将Flash地址0x0上的内容擦除 nand erase 0x0 0x50000 3.将内存中的u-boot-nand.bin写到Flash中 nand write 0x32000000 0x0 0x50000 4.输入reset重启开发板 reset ==利用实现的myboot命令启动Linux核心 1. 按照实验3-1的描述编译并生成一个Linux核心,并将生成的核心zImage放到tftp的配置目录/rootfs中 sudo cp zImage /tftpboot 2.利用tftpboot命令将zImage通过网络加载到内存0x30008000 tftpboot 0x30008000 zImage 3.利用myboot命令将引导核心 myboot 0x30008000 ==NFS-uboot启动: 1. 启动开发板,设置如下的一些环境变量 setenv bootmode nfs setenv init /sbin/init setenv gateway 192.168.1.21 setenv nfsroot /home/USERNAME/de-2440/rootfs/nfs_root saveenv 2. 利用 tftpboot 命令将核心加载到内存的 0x30008000 处,并使用 myboot 引导核心 tftpboot 0x30008000 zImage myboot 0x30008000 ==RD-uboot启动: setenv bootmode ramdisk setenv rdsize 0x800000 setenv init /sbin/init saveenv tftpboot 0x30008000 zImage tftpboot 0x30800000 myext2fs.img myboot 0x30008000 nand erase kernel burn to nandflash: nand write 0x30008000 kernel 0x200000 nand write 0x30800000 ext2 0x1000000 setenv bootcmd nand read 0x30008000 kernel 0x200000\; nand read 0x30800000 ext2 0x1000000\; myboot 0x30008000 setenv bootcmd nand read 0x30008000 kernel 0x200000\; myboot 0x30008000
阅读(1439) | 评论(0) | 转发(0) |