传统的移植内核都有搞什么nand分区,yaffs2文件系统,由于此内核是最简单的,纯净的内核,本人的意图是动手写每一行驱动,所以就不按照传统的方法走了。
1,添加网络驱动,在 gedit arch/arm/mach-s3c64xx/mach-my6410.c添加以下代码:
#define S3C64XX_PA_DM9000 (0x18000000) #define S3C64XX_SZ_DM9000 SZ_1M static struct resource dm9000_resources[] = { [0] = { .start = S3C64XX_PA_DM9000, .end = S3C64XX_PA_DM9000 + 3, .flags = IORESOURCE_MEM, }, [1] = { .start = S3C64XX_PA_DM9000 + 4, .end = S3C64XX_PA_DM9000 + S3C64XX_SZ_DM9000 - 1, .flags = IORESOURCE_MEM, }, [2] = { .start = IRQ_EINT(7), .end = IRQ_EINT(7), .flags = IORESOURCE_IRQ | IRQF_TRIGGER_HIGH, }, }; static struct dm9000_plat_data dm9000_setup = { .flags = DM9000_PLATF_16BITONLY, .dev_addr = { 0x08, 0x90, 0x00, 0xa0, 0x90, 0x90 }, }; static struct platform_device s3c_device_dm9000 = { .name = "dm9000", .id = 0, .num_resources = ARRAY_SIZE(dm9000_resources), .resource = dm9000_resources, .dev = { .platform_data = &dm9000_setup, } }; static struct platform_device *my6410_devices[] __initdata = { &s3c_device_dm9000, };退出后配置内核,关于配置内网络请参照我另一个博客 http://www.cnblogs.com/zuobaozhu/archive/2012/05/13/2498092.html#2380678 配置完后直接编译,然后用tftp下载到板子就会打印以下信息:
s3c6400-uart.1: ttySAC1 at MMIO 0x7f005400 (irq = 70) is a S3C6400/10
s3c6400-uart.2: ttySAC2 at MMIO 0x7f005800 (irq = 71) is a S3C6400/10
s3c6400-uart.3: ttySAC3 at MMIO 0x7f005c00 (irq = 72) is a S3C6400/10
brd: module loaded
loop: module loaded
S3C24XX NAND Driver, (c) 2004 Simtec Electronics
dm9000 Ethernet Driver, V1.31
eth0: dm9000a at d0814000,d0a00004 IRQ 108 MAC: 08:90:00:a0:90:90 (platform data)
PPP generic driver version 2.4.2
PPP BSD Compression module registered
PPP Deflate Compression module registered
PPP MPPE Compression module registered
NET: Registered protocol family 24
可以看出DM9000驱动已经OK了。
2.构建NFS文件系统。
2.1. 制作文件系统的工具就是传说中的瑞士军刀busybox在他的官网http://www.busybox.net 下载最新的版本为busybox-1.20.0
2.2. 修改busybox的makefile:
CROSS_COMPILE ?=arm-linux-
ARCH ?= arm
2.3. Make menuconfig配置busybox
Busybox Settings --->
BuildOptions --->
2.4. 编译busybox执行
Make install
这时候会提示一个错误提示说:
miscutils/ubi_tools.c:63:26: error: mtd/ubi-user.h: No suchfile or directory
miscutils/ubi_tools.c: In function 'ubi_tools_main':
miscutils/ubi_tools.c:133: error: 'UBI_DEV_NUM_AUTO' undeclared (first use inthis function)
miscutils/ubi_tools.c:133: error: (Each undeclared identifier is reported onlyonce
miscutils/ubi_tools.c:133: error: for each function it appears in.)
miscutils/ubi_tools.c:134: error: 'UBI_VOL_NUM_AUTO' undeclared (first use inthis function)
miscutils/ubi_tools.c:153: error: storage size of 'req' isn't known
miscutils/ubi_tools.c:161: error: 'UBI_IOCATT' undeclared (first use in thisfunction)
miscutils/ubi_tools.c:153: warning: unused variable 'req'
make[1]: ***[miscutils/ubi_tools.o] 错误 1
make: *** [miscutils] 错误 2
出现这么多的错误,核心问题就是出现在miscutils/ubi_tools.c:63:26:error: mtd/ubi-user.h: No such file or directory这个上面,无法找到mtd/ubi-user.h头文件,查阅了相关资料后,原来这是一个Linux下新支持的UBI文件系统,需要手工加入。从Linux3.3.5的include\mtd\ubi-user.h拷贝到busybox下的include\mtd下,如果 busybox下的include没有mtd文件夹,那就先建立一个mtd文件夹,然后复制了。这样做了之后,编译就OK了。出现下面的信息就说明编译成功了。
2.5. 建立根目录,这里我们直接写一个脚本程序运create_rootfs.sh行就可以了,脚本的内容如下:
#!/bin/sh
echo "------Create rootfs directons start...--------"
mkdir rootfs
cd rootfs
echo "--------Create root,dev....----------"
mkdir root dev etc boot tmp var sys proc lib mnt home usr
mkdir etc/init.d etc/rc.d etc/sysconfig
mkdir usr/sbin usr/bin usr/lib usr/modules
echo "make node in dev/console dev/null"
mknod -m 600 dev/console c 5 1
mknod -m 600 dev/null c 1 3
mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp
mkdir var/lib var/lock var/run var/tmp
chmod 777 tmp
chmod 777 var/tmp
echo "-------make direction done---------"
运行脚本执行:
./ create_rootfs.sh
ls rootfs
boot dev etc home lib mnt proc root sys tmp usr var
2.6. etc/inittab 系统init进程配置文件,并更改权限chmod +x inittab
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh #没有这就不行,就不能打开console控制台。
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff –a
2.7 etc/init.d/rcS系统启动加载项文件,并更改权限chmod +x etc/init.d/rcS
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts #用于telnet登录时使用
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /var/lock
/bin/hostname -F /etc/sysconfig/HOSTNAME
2.8. etc/fstab 系统挂载文件系统列表文件
#device mount-point type option dump fsck order
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
mdev /dev ramfs defaults 0 0
none /var ramfs defaults 0 0
none /tmp ramfs defaults 0 0
2.9 etc/profile用户环境配置文件
# Ash profile
# vim: syntax= sh
# No core file by defaults
# ulimit - S - c 0> / dev/ null 2> & 1
USER="id -un"
LOGNAME=$USER
PS1="[\u@\h \w]#" #\w 目录将显示全路径
PATH=$PATH
HOSTNAME= '/bin/hostname'
alias cls="clear"
export USER LOGNAME PS1 PATH
2.10. /etc/passwd shadow 用户文件以及密码
把主机的passwd shadow 文件拷贝到/etc下
# cp /etc/passwd rootfs/etc
# cp /etc/group rootfs/etc
# cp /etc/shadow rootfs/etc
2.11. etc/sysconfig/HOSTNAME的内容为你自己的名字即可,内容为"Pillar"
gedit /etc/sysconfig/HOSTNAME 然后键入 Pillar
2.12. 在busybox目录下会看见 _install目录,里面有/bin/sbin l inuxr三个文件
将这三个目录或文件拷到第一步所建的rootfs文件夹下。
#cp bin/ sbin/ linuxrc /home/rootfs -ra
在把_install目录的usr里面的bin,sbin也按照刚才的方法拷贝到rootfs目录下
切记一定要带上-a的参数,因为bin目录里大部分都是链接,如果不带-a的参数,拷过去之后会做相应的复制,不再是链接的形式
将交叉编译器下的lib下的库拷贝到lib文件夹下2.11. 修改uboot的bootargs为下面内容:
setenv bootargs noinitrd root=/dev/nfs ip=192.168.1.101:192.168.1.103:196.168.1.1:255.255.255.0::eth0:off nfsroot=192.168.1.103:/home/pillar/WORK/fs/rootfs,nolock,proto=tcp console=ttySAC0,115200
其中192.168.1.101为开发板的IP地址(用print命令可以查看)
192.168.1.103为虚拟机的IP地址
192.168.1.1为路由器的网关,在电脑上可以用ipconfig /all命令查看
255.255.255.0为子网掩码,在电脑上可以用ipconfig /all命令查看
先备份一下之前用yaffs2的启动
noinitrdroot=/dev/mtdblock3 rootfstype=yaffs2 console=ttySAC0 init=/linuxrcvideo=fb:AT070TN83
用cramfs启动
bootargs=root=/dev/mtdblock2 rootfstype=cramfs console=ttySAC0,115200
3.搭建NFS服务器
安装nfs:
#sudo apt-get install nfs-kernel-server
打开/etc/exports文件,在末尾加入:
/home/pillar/WORK/fs/rootfs *(rw,sync,no_root_squash)
注:nfs允许挂载的目录及权限,在文件/etc/exports中进行定义,各字段含义如下:
/home/pillar/WORK/fs/rootfs :要共享的目录
* :允许所有的网段访问
rw :读写权限
sync:资料同步写入内在和硬盘
no_root_squash:nfs客户端共享目录使用者权限
重启服务:
#sudo /etc/init.d/portmap restart <---重启portmap,很重要
#sudo /etc/init.d/nfs-kernel-server restart <---重启nfs服务
#showmount -e <---显示共享出的目录
注:nfs是一个RPC程序,使用它前,需要映射好端口,通过portmap设
命令执行情况如下:
xgc@xgc-VirtualBox:~$ sudo /etc/init.d/portmap restar
Rather than invoking init scripts through /etc/init.d, use the service(8)
utility, e.g. service portmap restart
Since the script you are attempting to invoke has been converted to an
Upstart job, you may also use the restart(8) utility, e.g. restart portmap
portmap start/running, process 474
xgc@xgc-VirtualBox:~$ sudo /etc/init.d/nfs-kernel-server restart
* Stopping NFS kernel daemon [ OK ]
* Unexporting directories for NFS kernel daemon... [ OK ]
* Exporting directories for NFS kernel daemon...
exportfs: /etc/exports [1]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/home/xgc".
Assuming default behaviour ('no_subtree_check').
NOTE: this default has changed since nfs-utils version 1.0.x
[ OK ]
* Starting NFS kernel daemon [ OK ]
xgc@xgc-VirtualBox:~$ showmount -e
Export list for xgc-VirtualBox:
/home/xgc *
现在可以在本机上试一下:
#sudo mount -t nfs localhost:/home/xgc /mnt
注:localhost为本机linux的IP地址
这样就把共享目录挂到了/mnt目录,取消挂载用:
#sudo umount /mnt
如果用在嵌入式设备上挂载,要加上参数-o nolock
启动内核:
就可以看到以下内容
Please press Enter to activate this console. Pillar [root@Pillar /]#ls bin dev home linuxrc proc sbin tmp var boot etc lib mnt root sys usr [root@Pillar /]#cd b