kernel(二)网卡(DM9000)及nfs文件系统

参考帮助文档: Documentation/networking/dm9000.txt
        在 arch/arm/mach-s5pv210/mach-smdkv210.c 中已经配置了 DM9000 的平台设备相关的数据,我们只需要修改就行了。

        在 arch/arm/mach-s5pv210/include/mach/map.h 中只定义了 S5PV210_PA_SROM_BANK5 的基地址,TQ210 开发板的 DM9000 接在 BANK1,因此我们需要在这个文件中定义 S5PV210_PA_SROM_BANK1 的基地址

/*片选信号使用的是XM0CSn1,查看S5PV210的芯片手册内存映射一节可以找到SROM BANK1的地址范围是0x8800_0000 --0x8FFF_FFFF,    则访问这个范围的地址时会激活片选使能信号XM0CSn1*/

然后修改 arch/arm/mach-s5pv210/mach-smdkv210.c 中的 DM9000 配置

TQ210 开发板的 DM9000 使用外部中断 10,另外,在 smdkv210_machine_init 函数中调用了smdkv210_dm9000_init 函数,这个函数进行 SROM 控制器的初始化,由于我在 u-boot 中已经初始化了,所以把它屏蔽掉

然后配置内核支持网络,由于现在还没移植 NAND FLASH,因此只有使用网络文件系统来启动开发板,所以需要配置内核支持网络文件系统(NFS)

# make menuconfig
[*] Networking support --->
	Networking options --->
		<*> Packet socket
		<*> Packet: sockets monitoring interface
		<*> Unix domain sockets
		<*> UNIX: socket monitoring interface
		        [*] TCP/IP networking
			[*] IP: multicasting
			[*] IP: advanced router
			[*] IP: kernel level autoconfiguration
			[*] IP: DHCP support
			[*] IP: BOOTP support
			[*] IP: RARP support
Device Drivers --->
	[*] Network device support --->
		[*] Ethernet driver support (NEW) --->
		    <*> DM9000 support
将其他的设备全部去掉,只保留 DM9000
File systems --->
	[*] Network File Systems (NEW) --->
		<*> NFS client support
			[*] Root file system on NFS

执行 make uImage 编译,成功生成 uImage

现在需要从 NFS 启动开发板,因此需要先制作一个根文件系统
首先需要下载 busybox,我下载的是 busybox-1.21.1.tar.bz2

root@ubuntu:~/code# tar -xf busybox-1.21.0.tar.bz2
root@ubuntu:~/code# cd busybox-1.21.1
root@ubuntu:~/code/busybox-1.21.0# make menuconfig
Busybox Settings --->
    General Configuration --->
        [ ] Enable options for full-blown desktop systems
我们使用的是嵌入式系统,如果不取消,在执行 ps 命令时不会显示进程状态

Busybox Settings --->   
    Build Options --->
        (arm-linux-) Cross Compiler prefix
指定交叉编译器前缀

Busybox Settings ---> 
    Installation Options ("make install" behavior) --->
        (./_install) BusyBox installation prefix (NEW)
指定安装路径(我使用的是默认路径)

Init Utilities --->
    [ ] Be _extra_ quiet on boot
取消可以在系统启动时显示 busybox 版本号加载和卸载内核模块

Linux Module Utilities --->
    [ ] Simplified modutils
我们不适应简单的,我们需要使用 insmod 等工具
    [*] insmod
    [*] rmmod
    [*] lsmod
    [*] modprobe
    [*] depmod

配置完毕,现在编译和安装
root@ubuntu:~/code/busybox-1.21.0# make && make install

BusyBox中文支持设置https://blog.csdn.net/chenlong12580/article/details/7259965

最新busybox-1.28.1制作根文件系统https://blog.csdn.net/liebao_han/article/details/79450086

创建根文件系统目录结构,可以使用如下脚本mkrootfs.sh,给脚本加可执行权限(即chmod a+x mkrootfs)并运行脚本:

#!/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"
sudo mknod -m 600 dev/console c 5 1
sudo 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 1777 tmp
chmod 1777 var/tmp
echo "-------make direction done---------"
然后拷贝 busybox 生成的内容到 rootfs
root@ubuntu:~/code# cp busybox-1.21.0/_install/* rootfs/ -a
root@ubuntu:~/code# cp busybox-1.21.0/examples/bootfloppy/etc/ rootfs/ -r

拷贝虚拟机系统的 passwd、 group、 shadow 到根文件系统
root@ubuntu:~/code/rootfs# cp /etc/passwd etc/
root@ubuntu:~/code/rootfs# cp /etc/group etc/
root@ubuntu:~/code/rootfs# cp /etc/shadow etc/

把 passwd 文件中的第一行: root:x:0:0:root:/root:/bin/bash 中的/bin/bash,改成/bin/ash
root:x:0:0:root:/root:/bin/ash

因为文件系统的 bin 目录下没有 bash 这个命令,而是用 ash 代替 bash,所以在用用户名密
码登录的时候(如 telnet),会出现“cannot run /bin/bash: No such file or directory”的错误
进入 rootfs 目录,创建相关目录

然后从交叉编译器拷贝库到 rootfs 的 lib 目录,交叉编译器的库所在路径为
/opt/arm-cortex_a8-linux-gnueabi-4.7.3/arm-cortex_a8-linux-gnueabi/sysroot/usr/lib/

对库进行瘦身以减小文件系统的大小
root@ubuntu:~/code/rootfs# arm-linux-strip lib/*

修改 rootfs/etc/inittab 文件
root@ubuntu:~/code/rootfs# vim etc/inittab
# /etc/inittab
# This is run first except when booting in single-user mode.
::sysinit:/etc/init.d/rcS
# Note below that we prefix the shell commands with a "-" to indicate to the
# shell that it is supposed to be a login shell
# Start an "askfirst" shell on the console (whatever that may be)
::askfirst:-/bin/sh
# Start an "askfirst" shell on /dev/tty2
#tty2::askfirst:-/bin/sh
# Stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a –r

修改 rootfs/ etc/fstab
root@ubuntu:~/code/rootfs# vim etc/fstab 
#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0

修改 rootfs/etc/init.d/rcS
root@ubuntu:~/code/rootfs# vim etc/init.d/rcS
#!/bin/sh
#This is the first script called by init process
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev>/proc/sys/kernel/hotplug
mdev –s

修改 rootfs/etc/profile
root@ubuntu:~/code/rootfs# vim etc/profile
# /etc/profile: system-wide .profile file for the Bourne shells

echo
echo -n "Processing /etc/profile... "
# no-op
#!/bin/sh
`hostname Louis`
HOSTNAME=`hostname`
USER=`id -un`
LOGNAME=$USER
HOME=$USER
PS1="[\u@$\h: \W]\# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH HOSTNAME USER PS1 LOGNAME HOME
alias ll="ls -l"
echo "Processing /etc/profile... "
echo "Done"

参考 Documentation/filesystems/nfs/nfsroot.txt 给 u-boot 设置传给内核的命令行参数。

set bootargs root=/dev/nfs nfsroot=192.168.5.136:/root/code/rootfs ip=192.168.5.187 init=/init console=ttySAC0,115200 rw

nfsroot 指定了服务器的 IP 和根文件系统在服务器的路径, ip 指定了开发板中的 Linux 内核的 IP。

现在开启虚拟机中 ubuntu 系统的 NFS 服务

root@ubuntu:~/code/rootfs# apt-get install nfs-kernel-server
root@ubuntu:~/code/rootfs# vi /etc/exports

/root/code/rootfs *(rw,sync,no_subtree_check,no_root_squash)

       执行

# /etc/init.d/rpcbind restart
# /etc/init.d/nfs-kernel-server restart

 在 exports 配置文件中指定根文件系统的路径,如果不指定 no_root_squash,客户端(开发板)没法修改网络文件系统的内容。

成功启动,有个小问题: dm9000 dm9000: read wrong id 0x01010101
这是 dm9000 驱动在读取 ID 时的错误,驱动中会连续读取 8 次,这里第一次读取错误,我们可以在
第一次读取之前加上一个延时,就可以解决这个错误。 在移植 u-boot 中就加了一个延时。

我制作的根文件系统下载:https://download.csdn.net/download/jerrygou/10484876

问题-1:Ubuntu18.04启动nfs失败,打印VFS: Unable to mount root fs via NFS, tryin1g floppy.

原因 1、:Ubuntu 17.10 之后 nfs 默认就只支持协议3和协议4,但是 uboot 默认启动的是协议2,若想要求 nfs 支持协议2,就在/etc/default/nfs-kernel-server末尾加一句:RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog",然后重启一下 nfs 。大功告成!

原因 2、:重启nfs-kernel-server

问题-2:启动nfs失败,报错

FATAL: kernel too old
Kernel panic - not syncing: Attempted to kill init!

原因:这是因为有些交叉编译器在制作时限制了使用的最低内核版本,不要比这个版本低就可以了。
比如配置glibc时使用–enable-kernel参数指定版本2.6.28,那么做出的文件系统一定不适合2.6.27或更低版本的。
如果想确认文件系统要求的最低内核,可以使用file命令查看libc-*.so文件,例如:
$ file libc-2.13.so
libc-2.13.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.10.2, stripped

解决:

root@ubuntu:/usr/local/arm/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/lib# cp * ~/code/rootfs/lib
root@ubuntu:/usr/local/arm/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/lib#

问题-3:启动nfs失败,报错

Kernel panic - not syncing: Requested init linuxrc failed (error -5)

原因:rootfs根目录下缺少linuxrc文件,在busybox-1.29.3\_install下生成

Kernel panic - not syncing: Requested init /init failed (error -2)

原因:rootfs根目录下缺少init文件,在busybox-1.29.3\_install下生成的linuxrc文件改名为init并拷贝到rootfs根目录下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值