本文转自:http://www.arm32.com/post/11018.html
上接: [Linux学习内核移植相关笔记第2部分
第9步:完善内核 添加对yaffs 的支持
得到补丁包后,解压补丁,然后打上 yaffs2 的补丁,方法如下:
(解压得到补丁目录 cvs)
#tar xvfz cvs-root.tar.gz
进到 yaffs2 的补丁目录下:
#cd cvs/yaffs2/
执行补丁脚本,打补丁到内核中:
#./patch-ker.sh c /home/linux110423/step1/MyLinuxKernel/linux-2.6.30.4/
此时到内核源码 的“fs/”目录下面您将看到新添加了一个名为“yaffs2/”的目录,同时“fs/”目录
面的“Makefile”文件和“Kconfig”文件也添加了 yaffs2 的配置和编译条件。
第10步: 在配置单中添加对 yaffs 的支持
然后输入:#make menuconfig,进入配置单,然后配置如下所示:
说明:下面红色部分的选项只有在 Linux-2.6.30.4 的内核配合 256MB 或更大 Nand Flash 时才能选择, 其他情况不需要选择该选项(硬件 ECC 校验) ,否则会出现 yaffs2 文件系统挂载不上的情况。
原因:2.6.30.4 的内核支持了 2GB 以及更大容量选的 Nand Flash,驱动机制上和低于 2.6.30 的内核不一样,我们在 256MB 以及更大容量的 Nand Flash 需要选上硬件 ECC 校验的选项,否则会出现 yaffs2 文件系统不能挂载而导致系统起不来的情况;比如使用了 busybox 自带的 reboot 命令。
Device Drivers --->
<*> Memory Technology Device (MTD) support --->
<*> NAND Device Support --->
<*> NAND Flash support for S3C2410/S3C2440 SoC
[*] S3C2410 NAND Hardware ECC
Nand Flash Capacity select (256MB~1GB Nand for EmbedSky Board) --->
File systems --->
< > Second extended fs support
< > Ext3 journalling file system support
< > Kernel automounter support
< > Kernel automounter version 4 support (also supports v3)
< > Filesystem in Userspace support
CD-ROM/DVD Filesystems --->
<*> ISO 9660 CDROM file system support
[ ] Microsoft Joliet CDROM extensions
[ ] Transparent decompression extension
< > UDF file system support
DOS/FAT/NT Filesystems --->
<*> MSDOS fs support
<*> VFAT (Windows-95) fs support
(437) Default codepage for FAT
(iso8859-1) Default iocharset for FAT
< > NTFS file system support
Pseudo filesystems --->
[*] Virtual memory file system support (former shm fs)
[ ] Tmpfs POSIX Access Control Lists
<*> Userspace-driven configuration filesystem
Miscellaneous filesystems --->
<*> YAFFS2 file system support
-*- 512 byte / page devices
[] Use older-style on-NAND data format with pageStatus byte
[] Lets Yaffs do its own ECC
-*- 2048 byte (or larger) / page devices
[*] Autoselect yaffs2 format
[] Disable lazy loading
[ ] Turn off wide tnodes
[ ] Force chunk erase check
[ ] Cache short names in RAM
-*- Native language support --->
--- Native language support
(iso8859-1) Default NLS Option
<*> Codepage 437 (United States, Canada)
<*> Simplified Chinese charset (CP936, GB2312)
<*> NLS ISO 8859-1 (Latin 1; Western European Languages)
<*> NLS UTF-8
配置好之后,保存配置单为“.config”文件后,编译出镜像。
到这一步就算是把 yaffs 文件系统移植完毕了,下面我们就开始制作 yaffs 文件系统。
第11步:制作文件系统
制作文件系统,首先需要用 busybox 编译出文件系统所需要的应用程序,
然后我们再做文件系统。
1) : 获取 BusyBox 源码,
首先我们下载一个 busybox 的源码,到网页 http://www.busybox.net/downloads/,就可以下载了,这里我下载了 busybox-1.13.0.tar.bz2 这个压缩包。
这里我们使用的交叉编译器还是 4.3.3 的。
注意:由于 3.4.5(及以前的)和 4.3.3 的交叉编译器不同,所以,当您决定了用哪个编译器编译内核之后,对应的文件系统也要使用该编译器,文件系统中的所有程序也要使用该编译器编译。
2): 修改并配置 BusyBox
解压 busybox,使用命令
#tar xvfj busybox-1.13.0.tar.bz2 -C .
然后进到源码中,
#cd busybox-1.13.0
#gedit Makefile
修改 Makefile 文件,把 164 行修改为:
CROSS_COMPILE = arm-linux-
把 189 行修改为:
ARCH = arm
然后输入:#make menuconfig,进入配置单:
然后配置如下:(下面只列出需要注意的地方;其它未列出的地方,可以采用默认,可以自己添加)
Busybox Settings --->
General Configuration --->
Buffer allocation policy (Allocate with Malloc) --->
[*] Show verbose applet usage messages
[*] Store applet usage messages in compressed form
[*] Support --install [-s] to install applet links at runtime
[*] Enable locale support (system needs locale for this to work)
[*] Support for --long-options
[*] Use the devpts filesystem for Unix98 PTYs
[*] Support writing pidfiles
[*] Runtime SUID/SGID configuration via /etc/busybox.conf
[*] Suppress warning message if /etc/busybox.conf is not readable
(/proc/self/exe) Path to BusyBox executable
Build Options --->
[*] Build BusyBox as a static binary (no shared libs)
[*] Build with Large File Support (for accessing files > 2 GB)
Installation Options --->
[ ] Don't use /usr
Applets links (as soft-links) --->
(./_install) BusyBox installation prefix
Busybox Library Tuning --->
(6) Minimum password length
(2) MD5: Trade Bytes for Speed
[*] Faster /proc scanning code (+100 bytes)
[*] Command line editing
(1024) Maximum length of input
[*] vi-style line editing commands
(15) History size
[*] History saving
[*] Tab completion
[*] Fancy shell prompts
(4) Copy buffer size, in kilobytes
[*] Use ioctl names rather than hex values in error messages
[*] Support infiniband HW
Linux Module Utilities --->
(/lib/modules) Default directory containing modules
(modules.dep) Default name of modules.dep
[*] insmod
[*] rmmod
[*] lsmod
[*] modprobe
--- Options common to multiple modutils
[ ] Support version 2.2/2.4 Linux kernels
[*] Support tainted module checking with new kernels
然后 退 回 到 根 配 置 单 , 选 择 “ Save Configuration to an Alternate File” 选项 , 保 存 刚 刚 的 配 置 为config_Qinziqiang。
(注意这里的config_Qinziqiang,和内核配置保存后的文件名:“config_Qinziqiang”是分开的,不是同一个,分别在不同的文件夹下,(一个在内核MyLinuxKernel文件夹下,一个在刚刚解压的busybox-1.13.0文件夹下)即可)
3):编译并安装 BusyBox
然后退出配置单, 然后编译出 busybox 即可,使用命令:
编译:
# make
安装:
# make install
编译结束后会在 busybox-1.13.0 目录下面生成一个名为“_install”的目录。
完成 busybox 的编译之后,我们就可以进行文件系统的构建了。
注意:对于可能出现编译不过去的情况,可能不同的编译器对源码的解释不一样导致,我们可以根据错误信息查找到源码,然后修改源码;也可以修改配置单,不选择该选项。
第12步:制作文件系统
(说明:Linux-2.6.25.8 和 Linux-2.6.30.4 的内核可以使用相同的文件系统(主要部分相同,驱动模块不同)
所以下面讲解文件系统构建时以 2.6.30.4 为 主 , 同时有的软件需要从我们提供的制作好的文件系统中获取。
1):构建框架
在“/home/linux110423/step1/”目录下面建立一个“root_2.6.30.4”的目录,
#mkdir root_2.6.30.4
复制刚刚编译出来的 busybox 的“bin”
目录、 “sbin”目 录 、 “usr”目录和“linuxrc”到“root_2.6.30.4”目录下,然后新建“dev”、“etc”、“home”、
“lib”、“mnt”、“opt”、“proc”、“root”、“sys”、“tmp”、“var”和“web”目录,同时在原有的“usr”目录make下面新建一个“lib”和“share”目录。
使用命令:
#cp -rf /home/linux110423/step1/busybox-1.13.0/_install/* root_2.6.30.4
#cd root_2.6.30.4
#mkdir -p dev etc home/qin lib mnt/udisk mnt/sd opt proc root sys tmp usr/lib usr/share var
1):添加内容
下面的内容可以自己手工添加,也可以使用我们已经制作好的文件系统
“dev”目录
下面的内容在内核挂载完毕文件系统后,系 统会使用 mdev 自动建立。
不 过 mdev 是 调 用 init 进程来启动的, 在使用 mdev 构 建“dev”目 录 前 , init进程需要用到“/dev/console”和“/dev/null”这两个设备文件,所以,我们需要在制作文件系统时静态创建这两个设备文件,方法如下:
#cd dev
# mknod console c 5 1
# mknod null c 3 1
如果不创建这两个设备文件,在文件系统启动时会出现类似这样的错误信息: “Warning: unable to open an initial console.”。这句话来源于内核源码的“init/main.c”文件的 778 行的“init_post( ) ”函数,也就是没有打开控制台。
“etc”目录
用来存放系统的配置文件。
在“etc/”目录下面有如下常用的文件: (主要是下面的这几个,以后要添加文件时会说明的)
注意:以下讲到的文件可以从我们做好的文件系统中获取,也可以使用 vi 命令或者 gedit 命令新建文件,然后输入对应的内容,讲到的目录也需要自行建立。
fstab:指明需要挂载的文件系统;
group:用户组;
inittab:init 进程的配置文件;
passwd:密码文件;
profile:用户环境配置文件;
mdev.conf:因为 2.6.18 版本开始 linux 放弃使用 devfs 而采用 udev(mdev 是 udev 的简化版本)
,这里的mdev.conf 文件可以是空,也可以按照一定规则来编写,这里我们添加了自动挂载和卸载 SD 卡和 U 盘的脚本文件在其中;
resolv.conf:存放 DNS 信息的文件,访问外网时需要 DNS 的信息。
常用的目录有:
init.d 目录:启动文件目录,该目录下面有个“rcS”的文件,里面存放了系统启动时配置以及自启动加载的进程等;
sysconfig 目录:在我们的文件系统里面,该目录下面存放了名为“HOSTNAME”的文件,该文件内容为:
Qinziqiang,这句话就是我们在文件系统里面看到那个“[root@Qinziqiang /]”里面的 Qinziqiang;
rc.d 目录:在我们的文件系统里面用来存放一些自启动所要调用的脚步等;
boa 目录:我们的文件系统特有的目录,用来存放 web 服务 器的配置脚本。
下面分别列出“etc/”下面各个文件的内容。
注意:如果是全新建立一个文件系统,这些文件是需要自己建立的。
【fstab】 :
# /etc/fstab: static file system information.
#
# Use 'vol_id --uuid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /var tmpfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
【group】:
root:*:0:
daemon:*:1:
bin:*:2:
sys:*:3:
adm:*:4:
tty:*:5:
disk:*:6:
lp:*:7:lp
mail:*:8:
news:*:9:
uucp:*:10:
proxy:*:13:
kmem:*:15:
dialout:*:20:
fax:*:21:
voice:*:22:
cdrom:*:24:
floppy:*:25:
tape:*:26:
sudo:*:27:
audio:*:29:
ppp:x:99:
500:x:500:qin
501:x:501:qin
【inittab】 :参考 busybox 源码 下面的“examples/inittab”文件
# /etc/inittab
::sysinit:/etc/init.d/rcS
qin_serial0::askfirst:-/bin/sh
::ctrlaltdel:-/sbin/reboot
::shutdown:/bin/umount -a -r
::restart:/sbin/init
注意 1:上面红色部分在 busybox 的参考文件中是 ttySAC0,而在 s3c24xx 系列芯片的串口驱动里面我们用了qin_serial做为设备名 Linux-2.6.30.4 内核源码 的“drivers/serial/samsung.c”文件的 888 行,我们已经将其修改为 qin_serial了,敬请注意) ,然后我们又是用的串口 0 作为控制台的,所以这 里我们使用 qin_serial0。
注意 2:需要修改 inittab 文件的属性为可执行(建议使用 777 这个权限) ,
命令:#chmod 777 inittab。
【passwd】 :
我的passwd文件如下:(注这个和天嵌linux手册P43页不同)
root:x:0:0:Linux User,,,:/home/root:/bin/sh
天嵌linux手册提到的内容:
root::0:0:root:/:/bin/sh
ftp::14:50:FTP User:/var/ftp:
bin:*:1:1:bin:/bin:
daemon:*:2:2:daemon:/sbin:
nobody:*:99:99:Nobody:/:
sky:$1$8GIZx6d9$L2ctqdXbYDzkbxNURpE4z/:502:502:Linux User,,,:/home/sky:/bin/sh
注意:上面红色那部分是密码,是不可逆转的编码,获取方法:在文件系统做好之后,使用 passwd 命令然后设定密码,在打开这个文件,就有了。
【profile】 :
# Ash profile
# vim: syntax=sh
# No core files by default
#ulimit -S -c 0 > /dev/null 2>&1
USER="`id -un`"
LOGNAME=$USER
PS1='[\u@\h \W]# '
PATH=$PATH
HOSTNAME=`/bin/hostname`
export USER LOGNAME PS1 PATH
【mdev.conf】 :
sd[a-z]*[0-9] 0:0 0660 @(mount -t vfat -o iocharset=cp936 /dev/$MDEV /mnt/udisk)
sd[a-z]*[0-9] 0:0 0660 *(umount /mnt/udisk)
mmcblk[0-9]*p[0-9] 0:0 0660 @(mount -t vfat -o iocharset=cp936 /dev/$MDEV /mnt/sd)
mmcblk[0-9]*p[0-9] 0:0 0660 *(umount /mnt/sd)
说明 1:这里添加的内容主要实现两个功能:当 SD 卡或 U 盘插入时自动挂载 SD 卡和 U 盘到/mnt/目录下的对应目录中。
注意 1:默 认 使 用的是简体中文,对于使用繁体的用户,请将 iocharset=cp936 改为 iocharset=utf8。
注意 2:对于某些 SD 卡或 U 盘,比如 U 盘,插入后,在文件系统的“/dev”目录下显示为 sda1(默 认 是
这样) ,而特殊的 U 盘显示为:sda,没有后面的数字(即没有分区信息)
;SD 卡显示为 mmcblk0,而不是正常的 mmcblk0p1,那么此时我们需要修改脚本为:sd[a-z]*和 mmcblk[0-9]*,这个地方请根据实际情况作出修改,否则会导致没法自动挂载 U 盘和 SD 卡。
说明 2:更多 mdev.conf 的设置请阅读 busybox 的“docs/mdev.txt”文件。
【resolv.conf】 用于存放 DNS 的值:
nameserver 202.96.128.86
【init.d/rcS】:想要实现开机自动运行某些程序只需要在本脚本中添加运行指令即可。
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
#
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /var/lock
/bin/hostname -F /etc/sysconfig/HOSTNAME
注意 1:在上面红色部分是关于 mdev 的使用,请参考 busybox 的“docs/mdev.txt”文件。
注意 2:还需要修改 rcS 文件的属性为可执行(建议使用 777 这个权限) ,命令:#chmod 777 rcS。
【rc.d/init.d/httpd】:(rc.d和init.d都是目录, 用 mkdir就可以了)
#!/bin/sh
base=boa
# See how we were called.
case "$1" in
start)
/sbin/$base
;;
stop)
pid=`/bin/pidof $base`
if [ -n "$pid" ]; then
kill -9 $pid
fi
;;
esac
exit 0
【boa/boa.conf】(这个我没有建立,因为友善的好像也没有)
(内容省略,该文件的来历,请见 web 服务器移植 篇)
【sysconfig/HOSTNAME】:
Qinziqiang
暂时就在“ etc/”目录下添加这些内容。
“home”目录
存放用户文件的目录,在这里,我们建立一个名为“qin”的目录,还记得前面的 passwd 文件吧,里面有个用户名就是 qin,对应这里的“qin”的目录。
注意:qin这个目录需要将其设置权限为 777 或者将其用户组设置为 sky,否则在使用 ftp 发送数据时会出现无法操作该目录的情况,建议使用命令:#chmod 777 home/qin 设置其权限。
“lib”目录(这一步我没有像下面作,即我的lib文件夹中的内容是直接从天嵌制作好的“root_2.6.25.8_qt_1.7.0_tp.tar.bz2”中复制过来了。
用来存放常用的库文件,获取库文件的方法(从 EABI-4.3.3 的编译器中提取库) :
#cd /opt/EmbedSky/root_2.6.30.4
#cp -f /opt/EmbedSky/4.3.3/arm-none-linux-gnueabi/libc/armv4t/lib/*.so* lib -a
#cp -f /opt/EmbedSky/4.3.3/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*.so* lib -a
#rm -f lib/libwv* lib/libuniconf*
下面列出从 3.4.5 的编译器中提取库的步骤:
#cd /opt/EmbedSky/root_2.6.30.4
#cp -f /opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/arm-linux/lib/*.so* lib -a
#rm -f lib/libwv* lib/libuniconf*
这里拷贝了常用的库文件,如果需要特殊的库,需要再从相应的位置复制过来,上面删除的是 PPP 拨号软件所使用的库,这几个库文件大概有 8MB 左右,因为普通用户用不上 PPP 拨号,这里就删除了对应的库。
说明:我们提供的制作好的文件系统中的“lib/”目录下的*.so*文件均是在前面操作步骤中做过选择的,建议不熟悉库的用户直接复制我们提供的制作好的文件系统的“lib/”目录下的库文件过来使用。
“mnt”目录
我们一般用来挂载的 U 盘之类的外设,这里建立两个目录“udisk”和“sd”,分别用来挂载 U 盘和 SD卡。
“opt”目录
我们用来保存 Qt 的相关目录。
“proc”目录(默认为空)
提供一些目录和虚拟文件系统。
“root”目录
超级用户的目录。
“sys”目录(默认为空)
mdev 可能会在下面建立某些文件。
“tmp”目录(默认为空)
存放临时文件的目录。
“var”目录(默认为空)
存放临时文件的目录。
“web”目录
存放 web 服务器的相关文件的目录,建议直接从我们制作好的文件系统拷贝过来。
“usr/bin/”目录
从友善提供的制作好的文件系统中复制用于串口传输文件的命令到新建的这个文件系统中,
rb rx rz sb sx sz 到右边文件夹下 /usr/bin/
其中的 rz 和 sz 命令实现使用超级终端的 zmodem 进行接收和发送文件的功能,在开发板的串口终端
使用方法如下:
$rz
然后点击右键打开 zmodem 就可以向开发板发送文件了。
$sz filename
然后就从开发板向 PC 发送指定的文件。
到这里,文件系统的框架就基本搞好了,然后使用制作 yaffs 文件系统的软件,把它做出 yaffs 文件系统格式的镜像就可以使用了。使用如下命令制作:
#cd /opt/EmbedSky
## mkyaffs2image root_2.6.30.4 root_2.6.30.4.bin(注意这里是
mkyaffs2image 而不是天嵌linux手册上的mkyaffsimage_2 ,)因为我的交叉编译器是友善的,所以这里还只能按照友善的提供的命令去编译文件系统,)
注意:上面的操作命令直接的空格键, 制作针对 64MB 的 Nand Flash 的文件系统使用:mkyaffsimage_2 软件,制作针对 128MB 以上的 Nand Flash 的文件系统使用:mkyaffs2image 的软件,该软件在交叉编译器里面已经提供了,安装交叉编译器的同时也就安装了它,在“/usr/local/sbin/”目录下。
然后把制作好的镜像 root_2.6.25.8.bin 复制出来,烧写到开发 板中,就可以运行了。
注意:因为在“etc/inittab”文件中涉及到了串口的设置,所以,
这里建议先做了第13步:完善内核的串口驱动后(否则烧到开发板上,也无法输入命令“ls”查看刚刚建立的文件系统哦)再烧写内核镜像和文件系统(注意这里说了内核镜像和文件系统),然后就可以得到类似下面的结果了。
第13步:完善内核的串口驱动
1)修改源码
在内核里面只支持 2 个串口,也就是芯片的 UART0 和 UART1,而 UART2 的驱动是针对红外接口的,
而不是串口驱动,这里我们将其修改为串口驱动。(注意,我们开发板上和电脑连接诶的串口是UART0,即用串口0(qin_serial0)作为控制台,Tx,Rx分别对应GPH2和GPH3)
修改内核源码“arch/arm/mach-s3c2440/mach-smdk2440.c”文件的 99 行(Linux-2.6.30.4 为 100 行 ) ,将其改为:
.ulcon = 0x03,
修改 Linux-2.6.30.4 内核的“drivers/serial/samsung.c”文件的 53 行添加如下内容:
#include
然后在 433 行添加如下内容:
if (port->line == 2) {
s3c2410_gpio_cfgpin(S3C2410_GPH6, S3C2410_GPH6_TXD2);
s3c2410_gpio_pullup(S3C2410_GPH6, 1);
s3c2410_gpio_cfgpin(S3C2410_GPH7, S3C2410_GPH7_RXD2);
s3c2410_gpio_pullup(S3C2410_GPH7, 1);
}
然后再修改 888 行,内容如下所示:
.dev_name = "qin_serial",
然后重新编译出镜像,烧写到开发板中,三个串口都能使用了。
注意:我们在前面使用默认配置单 s3c2410_defconfig 时已经完成了对串口的配置。
下面列出串口配置的情况: (下面列出来的是 2.6.30.4 的配置情况,2.6.25.8 的类似)
Device Drivers --->
Character devices --->
Serial drivers --->
< > 8250/16550 and compatible serial support
*** Non-8250 serial port support ***
<*> Samsung SoC serial support
[*] Support for console on Samsung SoC serial port
<*> Samsung S3C2440/S3C2442 Serial port support
2)修改源码
下面是我开发板运行后的部分结果(从中可以看到“[root@Qinziqiang /]# ):
........
Please press Enter to activate this console.
[root@Qinziqiang /]# ls
bin home lost+found proc sys
dev lib mnt root tmp
etc linuxrc opt sbin usr
[root@Qinziqiang /]#
......
至此,内核linux2.6.30.4,NandFlash,串口,yaffs2文件系统移植基本结束,并能够在开发板的NandFlash中运行,以上大部分内容参考了天嵌和友善的资料。
结束时间:2011-03-26晚
下接:[Linux学习内核移植相关笔记第4部分