linux26302内核移植.docx
《linux26302内核移植.docx》由会员分享,可在线阅读,更多相关《linux26302内核移植.docx(28页珍藏版)》请在冰豆网上搜索。
![linux26302内核移植.docx](https://file1.bdocx.com/fileroot1/2023-2/8/c636f723-1e39-436d-a8fe-0466d9f931a0/c636f723-1e39-436d-a8fe-0466d9f931a01.gif)
linux26302内核移植
宁波普天通信技术有限公司
Linux2.6.30.4移植
硬件部
2009/12/9
文档的摘要为对文档内容的简短总结。
目录
目录2
一、简介3
二、内核基本配置4
2.1获取资源4
2.2解压缩源码4
2.3在内核中添加对ARM的支持4
2.4修改平台时钟频率4
2.5制作内核的配置单4
三、NandFlahs移植7
3.1修改源码7
3.2添加对应的驱动配置8
四、完善串口驱动9
4.1修改源码9
4.2添加对应的驱动配置9
五、增加内核对yaffs和cramfs的支持10
5.1在内核中添加对yaffs的支持10
5.2在配置单中添加对yaffs和cramfs的支持10
六、编译Busybox12
6.1修改并配置Busybox12
6.2编译并安装Busybox13
七、构建文件系统14
7.1构建框架14
7.2添加内容15
7.3利用mkcramfs制作文件系统镜像20
八、网卡驱动移植22
8.1修改修和源码22
8.2配置内核24
一、简介
本文主要介绍针对S3C2440微处理器的linux内核和文件系统的移植,linux内核版本为2.6.30.4,文件系统采用cramfs+yaffs。
交叉编译环境为Cross4.3.3-EABI。
二、内核基本配置
2.1获取资源
移植工作首先要先准备好如下工具:
linux2.6.30.4的源码一份,Cross4.3.3-EABI编译器,busybox(制作根文件系统),mkcramfs(制作cramfs文件系统镜像)。
以上工具均会随文档附上。
2.2解压缩源码
将linux-2.6.30.4_20090826.tar.bz2和EABI_4.3.3_EmbedSky_20090812.tar.bz2文件放置到虚拟机的根目录下。
使用解压缩命令#tarxvfjlinux-2.6.30.4_20090826.tar.bz2和#tarjxvfEABI_4.3.3_EmbedSky_20090812.tar.bz2将内核和交叉编译器解压缩到PCLinux环境中。
其中EABI_4.3.3_EmbedSky_20090812.tar.bz2文件中包含了mkcramfs和mkyaffsimage等制作文件系统镜像的工具。
2.3在内核中添加对ARM的支持
进入到内核源码,修改“Makefile”文件,在193行“ARCH?
=(SUBARCH)”和194行“CORSS_COMPILE?
=”,将其修改为”ARCH=arm“和”CROSS_COMPILE=/opt/EmbedSKY/4.3.3/bin/arm-linux-“,然后对文件进行保存。
2.4修改平台时钟频率
在“arch/arm/mach-s3c2440/mach-smdk2440.c文件的大约第318行,将s3c24xx_init_clock函数的参数改为12000000(如图2.4.1所示)。
因为核心板上的外部晶振的频率为12M。
图2.4.1
2.5制作内核的配置单
此处,采用在内核默认配置单上进行修改的方式来对内核的各个模块进行增加和删减。
在内核目录下输入#makemenuconfig进入内核的配置界面。
2.5.1选择系统类型
进入到“SystemType”界面,在ARMsystemtype中选择处理器为三星的S3C2440系列。
之后,如下配置各个平台:
2.5.2在配置单中添加自己的信息
其中,Localversion前面的NBPT即自己所添加的信息。
2.5.3选择支持EABI
4.3.3版本的交叉编译器是支持EABI功能的,故需选上内核对于EABI的支持。
其中,第三行和第四行即内核对于EABI的支持。
2.5.4保存配置单
在最初的配置完成后,选择“SaveanAlternateConfigurationFile”选项来将其保存为.config文件,在内核编译的时候会对该配置文件进行调用。
保存完成后,退出内核配置的界面。
2.5.5编译镜像
输入#makeclean来对内核中的一些文件进行清理。
清理完成后,输入#makezImage对内核进行编译。
编译完成后,内核镜像会放置在”arch/arm/boot”文件夹下,文件名为”zImage”。
将内核烧写到芯片之中并运行,会有如下系统信息:
该信息表示,我们配置的linux内核已经能够在S3C2440芯片中成功运行了。
其中,内核版本为2.6.30.4,后面的“NBPT”即我们自己所添加的内核信息。
”gccversion4.3.3”表示我们所使用的交叉编译器的版本。
三、NandFlahs移植
在linux里面已经做好了NandFlash的驱动,我们只需要进行修改就可以使用了。
3.1修改源码
修改内核源码“arch/arm/plat-s3c24xx/common-smdk.c”文件,在109行,修改名为“smdk_default_nand_part[]”的结构体,该结构体存放的是nandflash的分区信息,其中的分区信息要和bootloader中的分区信息对应,否则可能导致系统无法正常启动和运行。
修改如下所示:
staticstructmtd_partitionsmdk_default_nand_part[]={
[0]={
.name="boot",
.offset=0x00000000,
.size=0x00100000,
},
[1]={
.name="bootParam",
.offset=0x00100000,
.size=0x00040000,
},
[2]={
.name="kernel",
.offset=0x00140000,
.size=0x00300000,
},
[3]={
.name="fs_cramfs",
.offset=0x00440000,
.size=0x01000000,
},
[4]={
.name="fs_yaffs",
.offset=0x01440000,
.size=0x00bc0000,
},
[5]={
.name="fs_yaffs",
.offset=0x02000000,
.size=0x06000000,
}
};
其中,第0分区存放bootloader;第2分区存放内核;第3分区存放cramfs文件系统;第4分区为yaffs文件系统,主要存放init.p文件夹下的启动配置,第5分区为yaffs文件系统,存放用户的应用程序和资料。
修改NandFlash的读写配置时间,修改smdk_nand_info结构体:
staticstructs3c2410_platform_nandsmdk_nand_info={
.tacls=0,
.twrph0=30,
.twrph1=0,
.nr_sets=ARRAY_SIZE(smdk_nand_sets),
.sets=smdk_nand_sets,
};
修改内核源码”driver/mtd/nand/s3c2410.c”中第752行,将“chip->eccmode=NADN_ECC_SOFT”改为”chip->eccmode=NAND_EDD_NONE”。
3.2添加对应的驱动配置
在内核的配置单中添加上对NandFlash支持的配置选项,输入:
#makemenuconfig,进入配置单选项,然后配置如下所示:
这些配置增加了内核对于MTD和NandFlash的支持。
3.3驱动的使用情况
编译出内核镜像,烧写到芯片中,会看到如下打印信息,表示内核中的NandFlash驱动已正常工作。
四、完善串口驱动
4.1修改源码
在内核里面只支持2个串口,也就是芯片的UART0和UART1,而UART2的驱动是针对红外接口的,而不是串口驱动,这里我们将其修改为串口驱动。
修改内核源码”arch/arm/mach-s3c2440/mach-smdk2440.c”文件约103行,将其修改为:
”.ulcon=0x03,”。
修改内核”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=“s3c2410_serial”
4.2添加对应的驱动配置
保存配置,重新编译出镜像,这样三个串口都能使用了。
串口的设备名为”s3c2410_serialx”。
五、增加内核对yaffs和cramfs的支持
5.1在内核中添加对yaffs的支持
将补丁包cvs-root.tar.gz导入到虚拟机中的linux环境中(该补丁包随文档附上),当上yaffs2的补丁,从而在内核中添加对于yaffs2的支持,方法如下:
#tarzxvfcvs-root.tar.gz
#cdcvs/yaffs2/
#./patch-ker.shc/opt/EmbedSky/linux-2.6.30.4/
此时,内核的”fs”目录下面能够看到一个新添加了的名为”yaffs2”的目录,同时”fs”目录下面的”Makefile”文件和”Kconfig”文件也添加了yaffs2的配置和编译条件。
5.2在配置单中添加对yaffs和cramfs的支持
输入#makemenuconfig,进入配置单,做如下配置:
配置完成后,保存配置,编译出内核镜像。
现在已经在内核中添加了对yaffs2和cramfs文件系统的支持,下一步要开始制作cramfs文件系统。
六、编译Busybox
我们采用的busybox版本为1.13.0,该工具也会随文档附上,编译busybox-1.13.0仍然用4.3.3的交叉编译器。
注意:
当您决定了用哪个编译器编译内核之后,对应的文件系统也要使用该编译器,文件系统中的所有程序也要使用该编译器编译。
6.1修改并配置Busybox
将busybox-1.13.tar.bz工具包导入到虚拟机的linux环境中。
使用命令#tarjxvfbusybox-1.13.0.tar.bz2进行解压缩。
修改Makefile文件,令其采用Cross-4.3.3交叉编译器进行编译。
修改164行:
CROSS_COMPILE=arm-linux-;修改189行:
ARCH=arm。
保存好对Makefile的修改后,输入#makemenuconfig,进入配置单:
上述配置只接触了需要注意的地方,其他未列出的地方,可以采用默认,也可自己增删。
完成配置后,选择”SaveConfigurationtoanAlternateFile”选项,对刚才的配置进行保存。
6.2编译并安装Busybox
退出配置单后,使用命令#makeinstall对busybox进行编译,编译结束后会在busybox-1.13.0目录下面生成一个名为”_install”的目录,在该目录下具有三个名为”bin”,”sbin”,”usr”的子目录和一个名为”linuxrc”的文件。
此时,我们就可以进行文件系统的构建了。
注意:
对于可能出现编译不过去的情况,可能是不同的编译器对于源码的解释不一样而导致的,我们可以根据错误信息查找到源码,然后修改源码;也可以修改配置单,不选择该选项。
七、构建文件系统
7.1构建框架
建立一个”root_2.6.30.4”的目录,将刚刚编译好的busybox的”bin”目录,”sbin”目录,“usr”目录和”linuxrc”文件复制到”root_2.6.30.4”目录下,然后新建”dev”,“dev/pts”,“dev/shm”,“init.p”,“etc”,“home”,“home/nbpt”“lib”,“mnt”,“mnt/sd”,“mnt/udisk”,“proc”,“root”,“sys”,“tmp”和“var”目录,同时在原有的”usr”目录下面新建”lib”,”share”,“local/nbpt”,“init.p”,“etc”目录。
使用命令:
#mkdir–p/opt/EmbedSky/root_2.6.30.4
#cd/opt/EmbedSky/root_2.6.30.4
#cp–rf/opt/EmbedSky/busybox-1.13.0/_install/*.
#mkdir–pdevdev/ptsdev/shminit.petchome/nbptlibmntmnt/sdmnt/udiskprocrootsystmpvarusr/libusr/shareusr/local/nbptusr/init.pusr/etc
如下图所示:
7.2添加内容
7.2.1“dev”目录
“dev”目录下面的内容在内核挂载文件系统完毕后,系统会使用mdev自动建立。
但是mdev是调用init进程来启动的,在使用mdev构建”dev”目录前,init进程需要用到”/dev/console”和”/dev/null”两个设备文件,所以,我们需要在制作文件系统时静态创建这两个设备文件,方法如下:
#cd/opt/EmbedSky/root_2.6.30.4/dev
#mknodconsolec51
#mknodnullc13
如果不创建这两个设备文件,在文件系统启动时会出现类似这样的错误信息:
”Warning:
unabletoopenaninitialconsole.”。
表示没有打开控制台。
7.2.2“etc”目录
在”etc”目录下面有如下常用的文件:
Fstab:
知名需要挂载的文件系统;
Group:
用户组;
Inittab:
init进程的配置文件;
Passwd:
密码文件;
Profile:
用户环境配置文件;
Resolev.conf:
存放DNS信息的文件,访问外网时需要DNS的信息。
Init.d目录:
启动文件目录,该目录下面有个”rcS”文件,里面存放了系统启动时配置以及自启动加载的进程等;
【fstab】:
#devicemount-pointtypeoptiondumpfsckorder
none/procprocdefaults00
none/dev/ptsdevptsmode=062200
tmpfs/dev/shmtmpfsdefaults00
【group】:
root:
x:
0:
root
bin:
x:
1:
root,bin,daemon
daemon:
x:
2:
root,bin,daemon
sys:
x:
3:
root,bin,adm
adm:
x:
4:
root,adm,daemon
tty:
x:
5:
disk:
x:
6:
root
lp:
x:
7:
daemon,lp
mem:
x:
8:
kmem:
x:
9:
wheel:
x:
10:
root
mail:
x:
12:
mail
news:
x:
13:
news
uucp:
x:
14:
uucp
man:
x:
15:
games:
x:
20:
gopher:
x:
30:
dip:
x:
40:
ftp:
x:
50:
lock:
x:
54:
nobody:
x:
99:
users:
x:
100:
rpm:
x:
37:
floppy:
x:
19:
vcsa:
x:
69:
utmp:
x:
22:
nscd:
x:
28:
slocate:
x:
21:
sshd:
x:
74:
rpc:
x:
32:
rpcuser:
x:
29:
nfsnobody:
x:
65534:
mailnull:
x:
47:
smmsp:
x:
51:
pcap:
x:
77:
xfs:
x:
43:
ntp:
x:
38:
gdm:
x:
42:
desktop:
x:
80:
nbpt:
x:
500:
test:
x:
501:
【inittab】:
:
:
sysinit:
/etc/init.d/rcS
s3c2410_serial0:
:
askfirst:
-/bin/sh
:
:
ctrlaltdel:
/sbin/reboot
:
:
shutdown:
/bin/umount-a–r
注意1:
在s3c24xx系列芯片的串口驱动中我们用了s3c2410_serial作为设备名(内核源码”drivers/serial/Samsung.c”文件第888行),由于用串口0作为控制台,所以这里使用s3c2410_serial0。
注意2:
需要修改inittab文件的属性为可执行,输入命令:
#chmod777inittab
【passwd】:
root:
x:
0:
0:
root:
/:
/bin/sh
bin:
*:
1:
1:
bin:
/bin:
/sbin/nologin
daemon:
x:
2:
2:
daemon:
/sbin:
/sbin/nologin
ftp:
x:
14:
50:
FTPUser:
/var/ftp:
/sbin/nologin
nobody:
*:
99:
99:
Nobody:
/:
/sbin/nologin
sshd:
x:
74:
74:
Privilege-separatedSSH:
/var/empty/sshd:
/sbin/nologin
desktop:
x:
80:
80:
desktop:
/var/lib/menu/kde:
/sbin/nologin
nbpt:
x:
500:
500:
nbpt:
/home/nbpt:
/bin/sh
test:
x:
501:
501:
:
/home/test:
/bin/sh
【profile】:
#!
/bin/sh
exportQTDIR=/usr
exportQPEDIR=/usr
exportLD_LIBRARY_PATH=/usr/lib
exportHOME=/usr/etc/tmp
exportLD_PRELOAD=/lib/preloadable_libiconv.so
PS1=’#’
exportPS1
【mdev.conf】:
Sd[a-z]*[0-9]0:
00660@(mount–tvfat–oiocharset=cp936/dev/$MDEV/mnt/udisk)
Sd[a-z]*[0-9]0:
00660*(umount/mnt/udisk)
Mmcblk[0-9]*p[0-9]0:
00660@(mount–tvfat–oiocharset=cp936/dev/$MDEV/mnt/sd)
Mmcblk[0-9]*p[0-9]0:
00660*(umount/mnt/sd)
说明:
这里添加的内容主要实现两个功能:
当SD卡或U盘插入时自动挂载SD卡和U盘到/mnt/目录下的对应目录中。
注意:
对于某些SD卡或U盘,比如U盘,插入后,在文件系统的”/dev”目录下显示为sda1,而特殊的U盘显示为:
sda,没有后面的数字(即没有分区信息),那么我们需要修改脚本为sd[a-z],这个地方请根据实际情况作出修改,否则会导致没法自动挂载U盘和SD卡。
【resolv.conf】:
用于存放DNS的值。
searchlocaldomain
nameserver202.96.104.25
nameserver202.96.104.28
nameserver211.136.17.108
【init.d/rcs】:
开机自动加载项
#!
/bin/sh
mount-a
mount-ttmpfsmdev/dev
mount-tsysfssysfs/sys
/sbin/mdev-s
echomountprocdevptssoon
mount-tdevptsdevpts/dev/pts
echomount/etc
mount-n-tramfsramfs/etc
cp-a-r-f/usr/etc/*/etc/
mount-n-tramfsramfs/var
/bin/mkdir-m0777/var/empty
/bin/mkdir-m0777/var/lib
/bin/mkdir-m0777/var/lock
/bin/mkdir-m0777/var/log
/bin/mkdir-m0777/var/run
/bin/mkdir-m0777/var/state
/bin/mkdir-m0777/var/tmp
/bin/mkdir-m0777/var/www
echoqlx-1983@
mount-n-tramfsramfs/home/nbpt
/sbin/vsftpd&
/sbin/telnetd&
echomountyaffs2on/init.p/
/bin/mount-tyaffs2/dev/mtdblock4/init.p
echomountyaffson/usr/local/nbpt/
/bin/mount-tyaffs2/dev/mtdblock5/usr/local/nbpt/
myFile="/init.p/rcP"
if[!
-f"$myFile"];then
cp-a/usr/init.p/rcP/init.p/
/init.p/rcP
echoyoucanenjoyfscramfsversion1.1.
else
/init.p/rcP
echoyoucanenjoyfscramfsversion1.1.
fi
说明1:
”mount–a”该句去运行etc目录下的fstab文件来挂载