基于三星S5PV210上的LinuxKernel的移植.docx
《基于三星S5PV210上的LinuxKernel的移植.docx》由会员分享,可在线阅读,更多相关《基于三星S5PV210上的LinuxKernel的移植.docx(13页珍藏版)》请在冰豆网上搜索。
基于三星S5PV210上的LinuxKernel的移植
5.2Linux系统启动流程分析
Ubuntu的启动过程主要包括四个步骤:
BIOS自检:
识别主机上可以启动的设备,一次只能从一个设备上启动,如果一个启动设备失效,就可以使用下一个候选启动设备。
通常是硬盘启动。
启动驻留在硬盘主引导记录MBR中的引导程序Grub或lilo。
Grub/lilo引导启动:
如果主机中安装多个操作系统,用户通过Grub或lilo,引导启动UbuntuLinux系统。
此时操作系统还没有装入内存,引导程序只是将控制权转移给内核。
装载Linux内核:
在最初的引导过程完成之后,引导程序开始加载Linux内核,Ubuntu将Linux内核置于/boot目录下。
系统初始化:
内核的初始化阶段将启动系统进程和脚本,init进程是系统开始的第一个工作,它是其他所有进程的父进程,并一直处于运行状态。
使用top命令查看进程,可以发现init进程id号永远是第一个。
init进程读取初始化脚本,完成系统相关的管理任务。
图5-1linux系统启动流程
6基于S5PV210的linux内核移植
6.1交叉开发环境的搭建
在自己的linux中建立交叉开发环境:
安装交叉编译工具链:
a解压“Linux-Android\toolchain”目录下的“arm-none-eabi-4.2.2.tgz”到根“/usr/local”目录下,在“/usr/local”目录下会生成“arm”目录:
执行命令:
#tarzxvfarm-none-eabi-4.2.2.tgz
b修改环境变量“PATH”:
$sudovim/etc/environment
将路径(下面的红色字体,不加引号)添加到PATH变量的最后面,省略号代表原来PATH的值:
PATH=……:
/usr/local/arm/4.2.2-eabi/usr/bin”
c保存退出后执行:
$source/etc/environment
这样修改的环境变量会立即生效,于是我们就得到交叉编译工具:
6.2BootLoader移植
Bootloader引导程序在操作系统内核运行之前运行一个程序,一般应被写入为0x00开始的物理地址。
有了这个代码,可以初始化硬件设备,初始化如CPU,SDRAM,闪存,串口,以太网口等,下载文件到开发板,闪存擦除和编程,起到一定的引导和装载内核映像的作用。
通常情况下,引导程序是依赖于硬件实现的,特别是在嵌入式系统。
引导加载不同的体系结构需要不同的Bootloader,除了结构中,引导程序也取决于板级的嵌入式设备的具体结构。
因此,建立一个共同的Bootloader几乎是不可能的,而是要建立一个总的框架则是可能的。
Bootloader种类和分析:
现在bootloader的种类是非常多的,下面的表中列出了几种,关于bootloader的种类这里介绍的比较简单,因为知道有多少种并没有什么太大的作用,之所以在这里列出是为了介绍下面bootloader的分类。
Bootloader分类见下表6-1:
表6-1bootloader分类
这里的分类实际上是依据上面的bootloader的操作模式来进行划分的,根据一个系统是否支持上面的下载模式我们这里将bootloader划分为bootloader和monitor。
这里”bootloader”是指只是引导设备与执行主程序的固件,而”monitor”是指不仅拥有bootloader功能的,还能够进入下载模式的固件。
在本系统中,使用U-Boot作为开发板的BootLoader。
拷贝“Linux-Android\源码”目录下的“uboot-s5pv210.tar.bz2”到目标目录下,然后执行命令:
#tarjxvfuboot-s5pv210.tar.bz2
#makesmdkc100_config
#make
在源码根目录(uboot-samsung)下会生成“u-boot.bin”。
6.3linux内核镜像移植
Linux内核的移植,是针对Linux的操作系统做在目标平台上安装后必须裁剪才能正常运行特定的目标平台。
Linux内核第一阶段的引导,初始化相关的代码首先被执行,初始化硬件寄存器,存储器等。
然后控制代码转向内核,在代码移植工作中,主要改变在体系结构相关的部分。
移植Linux内核,它是一个乏味的任务,主要包含修改启动代码,加载内核引导参数传递等。
其基本结构如表6-2所示:
表6-2linux体系结构
系统调用接口
进程管理
内存管理
内存管理
调度
程序
块设备
管理
字符设备管理
TCP/IP协议
网络事务管理
体系结构相关代码
硬件平台
移植步骤:
1、拷贝“Linux\源码”目录下的“Linux-2.6.29-samsung.tar.bz2”到目标目录下,然后解压
#tarjxvfLinux-2.6.29-samsung.tar.bz2
2、执行:
#makemenuconfig
进入配置界面
配置内核编译选项,需要注意的是要按照自己的实际情况选择Framebuffer显示设备的类型,选项位于:
->DeviceDrivers
->Graphicssupport
->Supportforframebufferdevices(FB[=y])
->S3CFramebuffersupport(FB_S3C[=y])
->SelectLCDType([=y])
如果开发板接480*272的LCD屏,应该选择:
(X)Innolux4.3inch(480x272)
如果开发板接800*600的VGA显示器,应该选择:
(X)VGA800x600
如果开发板接1024*768的VGA显示器,应该选择:
(X)VGA1024x768
3、执行:
#makezImage
编译内核,生成的zImage位于:
arch/arm/boot/下
6.3.1Linux网卡驱动移植
网卡是嵌入式产品最常用的设备,这里我们需要完成网卡驱动的移植。
FS_S5PV210使用的是DM9000网卡,我们通过这个实验能够了解如何在内核中添加网卡驱动及网络功能的基本配置。
平台设备列表的添加:
在smdkc100_device[]结构体数组中添加如下内容:
#ifdefined(CONFIG_DM9000)
&s5pv210_device_dm9000,
#endif
配置内核
$makemenuconfig
网络配置:
[*]Networkingsupport(NEW)--->
Networkingoptions--->
<*>Packetsocket
<*>Unixdomainsockets
[*]TCP/IPnetworking
[*]IP:
multicasting
[*]IP:
kernellevelautoconfiguration
[*]IP:
BOOTPsupport
网卡驱动配置
DeviceDrivers--->
[*]Networkdevicesupport--->
[*]Ethernet(10or100Mbit)--->
<*>DM9000support
编译内核,并拷贝到tftpboot目录下:
$makezImage
$cparch/arm/boot/zImage/tftpboot
启动开发板,修改内核启动参数,通过NFS方式挂载根文件系统。
6.3.2Linux文件系统编译
Nandflash是嵌入式系统最常用的外部存储设备,这里介绍Nandflash驱动移植的过程。
添加针对我们平台的Nandflash驱动,拷贝s3c_nand.c到drivers/mtd/nand下,拷贝regs-nand.h到arch/arm/mach-s5pv210/include/mach下,针对平台上的nandflash设备,修改drivers/mtd/nand/nand_base.c文件。
添加平台设备列表
在smdkc100_device[]结构体数组中添加如下内容:
#ifdefined(CONFIG_MTD_NAND_S3C)
&s5pv210_device_nand,
#endif
修改arch/arm/plat-samsung/include/plat/nand.h添加如下内容:
structs3c_nand_mtd_info{
uintchip_nr;
uintmtd_part_nr;
structmtd_partition*partition;
};
配置内核
$makemenuconfig
DeviceDrivers--->
<*>MemoryTechnologyDevice(MTD)support--->
[*]MTDpartitioningsupport
<*>CachingblockdeviceaccesstoMTDdevices
<*>NANDDeviceSupport--->
<*>NANDFlashsupportforS3CSoC
[*]S3CNANDHardwareECC
FileSystems--->
PartitionTypes--->
[*]Advancedpartitionselection
[*]PCBIOS(MSDOSpartitiontables)support
[*]BSDdisklabel(FreeBSDpartitiontables)support
编译内核并拷贝到tftpboot下
$makezImage
$cparch/arm/boot/zImage/tftpboot
启动目标板,在目标板上完成如下操作:
#cat/proc/mtd
dev:
sizeerasesizename
mtd0:
0010000000020000"bootloader"
mtd1:
0030000000020000"kernel"
mtd2:
0040000000020000"rootfs"
mtd3:
0f80000000020000"usrfs"
6.3.3Linux内核调试
(1)修改driver/video/s3c-fb.c,在s3c_fb_probe函数中intret=0;下增加下面语句:
int*ptr=NULL;
*ptr=0xff;
(3)编译内核下载到开发板上,内核启动会出现如类似下信息:
UnabletohandlekernelNULLpointerdereferenceatvirtualaddress00000000
LRisatplatform_drv_probe+0x1c/0x24
pc:
[]lr:
[]psr:
a0000013
sp:
cfc29f0cip:
cfc457c0fp:
00000000
r10:
00000000r9:
00000000r8:
c03ad4f8
r7:
c03a93d0r6:
c03a93d0r5:
c0395258r4:
00000000
r3:
000000ffr2:
cfc28000r1:
00000000r0:
c0395250
可以看出使用了空指针。
找出函数调用关系:
PCisats3c_fb_probe+0xc/0x67c,表示出错指令为s3c_fb_probe函数中偏移为0xc的指令。
pc:
[]表示出错指令的地址为c0290a28。
(5)对于大多数情况,从反汇编代码定位到C代码并不会如此容易,需要有较强的阅读汇编代码的能力。
(6)另外一种方法是通过addr2line去定位
arm-none-linux-gnueabi-addr2line0xc001abc4-evmlinux–f
6.4Linux文件系统移植
Linux操作系统安装文件系统的选择过程;
1)EXT2文件系统:
ext2文件系统应该说是Linux早期的文件系统,但随着技术的发展,大多数Linux发行版目前不使用这个文件系统;如红帽和Fedora大多数都建议使用ext3,ext3文件系统是ext2的演变。
支持ext2的反删除(取消删除),如果不小心删除的文件,可以恢复;ext2支持大文件;ext2文件系统的官方主页是:
http:
//
2)ext3文件系统:
从ext2文件系统演变而来,ext3是Linux日志文件系统),ext3支持大型文件;它不支持反删除(反删除)操作;RedHat和Fedora一般使用ext3文件系统。
3)ReiserFS文件系统:
reiserfs文件系统是一个很好的文件系统,能支持大文件,支持恢复删除(反删除)操作;ReiserFS文件系统性能最出色的是:
几乎能恢复90%以上的数据,有时可以恢复到100%。
支持Linux的文件系统,目前Linux支持几乎所有的类Unix文件系统,除了我们在安装Linux操作系统被选中的ext3,reiserfs的和ext2,支持其他Unix操作系统的文件系统,当然,Linux还支持Windows文件系统NTFST和fat文件系统,但不支持NTFS的写入;对于FAT文件系统支持读写Linux,另外Linux还支持网络文件系统,如NFS等;Linux的文件系统见图6-1所示。
图6-1Linux虚拟文件系统VFS
在嵌入式Linux应用中,主存储装置的RAM(DRAM,SDRAM)和ROM(常采用FLASH存储器),基于存储设备的类型通常使用的文件系统包括:
jffs2的,YAFFS,CRAMFS,ROMFS,虚拟盘,RAMFS/TMPFS等,对于移植到开发板的存储设备Nandflash来说,大多采用cramfs文件系统。
移植步骤如下:
(1)软件准备Busybox
Busybox有一个很形象的称呼,那就是linux系统中的“瑞士军刀”,从这个称呼中看出,busybox是一个集多种功能于一身的工具。
Busybox在设计上就充分考虑了硬件资源受限的特殊工作环境。
它采用一种很巧妙的办法减少自己的体积:
所有的命令都通过“插件”的方式集中到一个可执行文件中。
在busybox的编译过程中,可以非常方便地裁剪它的功能,类似于组态一样将所有的功能天添加或者删除,最后编译成一个可以使用的文件系统。
Busybox的编译过程是先使用makemenuconfig进行配置,在这一点上与内核的编译过程很相似。
(2)源码下载
我们选择的版本是busybox-1.17.3.tar.bz2下载路径为:
(3)解压源码
$tarxvfbusybox-1.17.3.tar.bz2
(4)进入源码目录
$tarxvfbusybox-1.17.3.tar.bz2
(5)配置源码
$makemenuconfig
BusyboxSettings--->
BuildOptions--->
[*]BuildwithLargeFileSupport(foraccessingfiles>2GB)
(arm-none-linux-gnueabi-)CrossCompilerprefix
()AdditionalCFLAGS
编译:
$make
安装:
busybox默认安装路径为源码目录下的_install
$makeinstall
进入安装目录下:
$cd_install
$ls
binlinuxrcsbinusr
添加其他需要目录
$mkdirdevetcmntprocvartmpsysroot
添加库,将交叉工具链中的库文件拷贝到_install目录下
$cp/home/linux/toolchain/arm-none-linux-gnueabi/lib/./
删除lib下的所有目录、.o文件和.a文件,对库进行瘦身以减小文件系统的大小
$arm-none-linux-gnueabi-striplib/*
添加linux系统的启动文件,在etc下添加文件inittab,文件内容如下:
在etc下添加文件fstab,文件内容如下:
#devicemount-pointtypeoptionsdumpfsckorder
proc/procprocdefaults00
tmpfs/tmptmpfsdefaults00
sysfs/syssysfsdefaults00
tmpfs/devtmpfsdefaults00
在本次的移植中我们挂载内核的文件系统有三个,分别是proc、sysfs和tmpfs,linux内核中默认都支持proc和sysfs,tmpfs是没有支持的,我们需要添加tmpfs的支持。
修改内核配置:
Filesystems--->
[*]Virtualmemoryfilesystemsupport(formershmfs)
[*]TmpfsPOSIXAccessControlLists
重新编译linux内核源码。
在etc下创建init.d目录,并在init.d下创建rcS文件,在rcS写入内容:
#!
/bin/sh
/bin/mount-a
为rcS添加可执行权限:
#chmod+xinit.d/rcS
在etc下添加profile文件,其中文件的内容为:
#!
/bin/sh
exportHOSTNAME=farsight
exportUSER=root
exportHOME=root
#exportPS1="\[\u@\h\W\]\$"
exportPS1="[$USER@$HOSTNAME\W]\#"
PATH=/bin:
/sbin:
/usr/bin:
/usr/sbin
文件系统中设备文件的创建,在根文件系统中,有一个设备节点非常重要,需要必须创建,那就是在dev下创建console节点
$mknoddev/consolec51
(6)cramfs文件系统镜像制作
由于系统提供制作cramfs文件系统的工具,则可以利用。
具体操作如下;
$mkfs.cramfsrootfsrootfs.cramfs
(1)将rootfs.cramfs拷贝到/tftpboot目录下
$cprootfs.cramfs/tftpboot
(2)将rootfs.cramfs烧写到nandflash的第三个分区上
u-boot下执行如下命令
#tftp30008000rootfs.cramfs
#nanderase500000800000
#nandwrite30008000500000800000
(3)重新设置u-boot启动参数
#setenvbootcmdtftp33000000zImage\;go33000000
#setenvbootargsroot=/dev/mtdblock2init=/linuxrcconsole=ttySAC0,115200
#savenv
启动开发板,进行测试。
7测试
Linux内核在硬件平台上移植成功后,编写简单的驱动程序进行测试。
本设计运用c程序语言编写了画面切换的驱动程序,编译成功后下载到开发板上,观察是否得到预测结果。
得到结果如下图所示:
图7-1内核移植测试
画面切换功能实现,说明linux内核移植成功。
8结论
本设计完成了修改linux内核与硬件相关部分后将其移植到目标平台三星S5PV210的工作,并且编写了简单的驱动程序对移植成果进行测试。
应用了大学所学的c语言、arm及单片机的知识,达到了制作毕业设计的目的。
完成本毕业设计需要研究和理解linux内核源码,并对三星S5PV210硬件平台的结构及功能有所认识,只有掌握这些相关知识,才能使自己修改的内核源码与S5PV210匹配,得到理想结果。
内核修改工作繁琐,在完成设计的过程中必须认真细心,否则会遇到很多问题。
有时候甚至因为一个参数未能成功修改导致设计失败。
本设计的结果提供了一个嵌入式开发平台,最终目的是希望利用此平台进行设计,开发更多功能的嵌入式产品。