Chinaunix首页 | 论坛 | 博客
  • 博客访问: 348926
  • 博文数量: 112
  • 博客积分: 5245
  • 博客等级: 大校
  • 技术积分: 1120
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-07 09:20
个人简介

静下来,定好方向,好好干。

文章分类
文章存档

2017年(1)

2012年(1)

2011年(5)

2010年(6)

2009年(16)

2008年(59)

2007年(24)

我的朋友

分类: LINUX

2009-05-01 15:54:34

根文件系统制作:
手动创建基本目录结构,各目录的功能了解;
从下载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-bin

Vivi的使用:
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.cramfs

NFS 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 save

YAFFS 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
Reboot

Para 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
阅读(1397) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~