2024年1月26日发(作者:司寇若星)
. .
5.2 Linux系统启动流程分析
Ubuntu的启动过程主要包括四个步骤:
BIOS自检:识别主机上可以启动的设备,一次只能从一个设备上启动,如果一个启动设备失效,就可以使用下一个候选启动设备。通常是硬盘启动。启动驻留在硬盘主引导记录MBR中的引导程序Grub或lilo。
Grub/lilo引导启动:如果主机中安装多个操作系统,用户通过Grub或lilo,引导启动Ubuntu Linux系统。此时操作系统还没有装入内存,引导程序只是将控制权转移给内核。
装载Linux内核:在最初的引导过程完成之后,引导程序开场加载Linux内核,Ubuntu将Linux内核置于/boot目录下。
系统初始化:内核的初始化阶段将启动系统进程和脚本,init进程是系统开场的第一个工作,它是其他所有进程的父进程,并一直处于运行状态。使用top命令查看进程,可以发现init进程id号永远是第一个。init进程读取初始化脚本,完成系统相关的管理任务。
设备加电BIOS自检Grub/Lilo引导启动装载Linux内核系统初始化用户登录
图 5-1 linux系统启动流程
. v .
. .
6 基于S5PV210的linux内核移植
6.1 穿插开发环境的搭建
在自己的linux中建立穿插开发环境:
安装穿插编译工具链:
a 解压“Linux-Androidtoolchain〞目录下的“〞到根“/usr/local〞目录下,在“/usr/local〞目录下会生成“arm〞目录:
b 修改环境变量“PATH〞:
$ sudo vim /etc/environment
将路径(下面的红色字体,不加引号)添加到PATH变量的最后面,省略号代表原来PATH的值:
PATH=……:/usr/local/arm/4.2.2-eabi/usr/bin〞
c 保存退出后执行:
$ source /etc/ environment
. v .
. .
这样修改的环境变量会立即生效,于是我们就得到穿插编译工具:
6.2 Boot Loader移植
Bootloader引导程序在操作系统内核运行之前运行一个程序,一般应被写入为0x00开场的物理地址。有了这个代码,可以初始化硬件设备,初始化如CPU,SDRAM,闪存,串口,以太网口等,下载文件到开发板,闪存擦除和编程,起到一定的引导和装载内核映像的作用。
通常情况下,引导程序是依赖于硬件实现的,特别是在嵌入式系统。引导加载不同的体系构造需要不同的Bootloader,除了构造中,引导程序也取决于板级的嵌入式设备的具体构造。因此,建立一个共同的Bootloader几乎是不可能的,而是要建立一个总的框架那么是可能的。
Bootloader种类和分析:
现在bootloader的种类是非常多的,下面的表中列出了几种,关于bootloader的种类这里介绍的比拟简单,因为知道有多少种并没有什么太大的作用,之所以在这里列出是为了介绍下面bootloader的分类。Bootloader分类见下表6-1:
表6-1
bootloader分类
. v .
. .
这里的分类实际上是依据上面的bootloader的操作模式来进展划分的,根据一个系统是否支持上面的下载模式我们这里将bootloader划分为bootloader和monitor。
这里〞bootloader〞是指只是引导设备与执行主程序的固件,而〞monitor〞是指不仅拥有bootloader功能的,还能够进入下载模式的固件。
在本系统中,使用U-Boot作为开发板的Boot Loader。
拷贝“Linux-Android源码〞目录下的“〞到目标目录下,然后执行命令:
# tar jxvf
# make smdkc100_config
# make
在源码根目录〔uboot-samsung〕下会生成“〞。
6.3 linux内核镜像移植
Linux内核的移植,是针对Linux的操作系统做在目标平台上安装后必须裁剪才能正常运行特定的目标平台。
. v .
. .
Linux内核第一阶段的引导,初始化相关的代码首先被执行,初始化硬件存放器,存储器等。然后控制代码转向内核,在代码移植工作中,主要改变在体系构造相关的局部。
移植Linux内核,它是一个乏味的任务,主要包含修改启动代码,加载内核引导参数传递等。其根本构造如表6-2所示:
表6-2
linux体系构造
系统调用接口
进程管理
内存管理
内存管理
调度
块设备
字符设备管理
管理
网络事务管理
体系构造相关代码
硬件平台
TCP/IP协议
程序
移植步骤:
1、拷贝“Linux源码〞目录下的“2〞到目标目录下,然后解压
2、执行:
# make menuconfig
进入配置界面
. v .
. .
配置内核编译选项,需要注意的是要按照自己的实际情况选择Framebuffer显示设备的类型,选项位于:
-> Device Drivers
-> Graphics support
-> Support for frame buffer devices (FB [=y])
-> S3C Framebuffer support (FB_S3C [=y])
-> Select LCD Type (
如果开发板接480*272的LCD屏,应该选择:
(X)Innolux 4.3 inch (480x272)
如果开发板接800*600的VGA显示器,应该选择:
(X) VGA 800x600
如果开发板接1024*768的VGA显示器,应该选择:
(X) VGA 1024x768
. v .
. .
3、执行:
# make zImage
编译内核,生成的zImage位于:arch/arm/boot/下
6.3.1 Linux网卡驱动移植
网卡是嵌入式产品最常用的设备,这里我们需要完成网卡驱动的移植。FS_S5PV210使用的是DM9000网卡,我们通过这个实验能够了解如何在内核中添加网卡驱动及网络功能的根本配置。
平台设备列表的添加:
在smdkc100_device[]构造体数组中添加如下内容:
#if defined(CONFIG_DM9000)
&s5pv210_device_dm9000,
. v .
. .
#endif
配置内核
$ make menuconfig
网络配置:
[*] Networking support (NEW) --->
Networking options --->
<*> Packet socket
<*>Unix domain sockets
[*] TCP/IP networking
[*] IP: multicasting
[*] IP: kernel level autoconfiguration
[*] IP: BOOTP support
网卡驱动配置
Device Drivers --->
[*] Network device support --->
[*] Ethernet (10 or 100Mbit) --->
<*> DM9000 support
编译内核,并拷贝到tftpboot目录下:
$ make zImage
. v .
. .
$ cp arch/arm/boot/zImage /tftpboot
启动开发板,修改内核启动参数,通过NFS方式挂载根文件系统。
6.3.2 Linux文件系统编译
Nand flash 是嵌入式系统最常用的外部存储设备,这里介绍Nand flash驱动移植的过程。
添加针对我们平台的Nand flash驱动,拷贝s3c_nand.c到drivers/mtd/nand下,拷贝regs-nand.h到arch/arm/mach-s5pv210/include/mach下,针对平台上的nand flash设备,修改drivers/mtd/nand/nand_base.c文件。
添加平台设备列表
在smdkc100_device[]构造体数组中添加如下内容:
#if defined(CONFIG_MTD_NAND_S3C)
&s5pv210_device_nand,
#endif
修改arch/arm/plat-samsung/include/plat/nand.h添加如下内容:
struct s3c_nand_mtd_info {
uint chip_nr;
uint mtd_part_nr;
struct mtd_partition *partition;
};
配置内核
. v .
. .
$ make menuconfig
Device Drivers --->
<*> Memory Technology Device (MTD) support --->
[*] MTD partitioning support
<*> Caching block device access to MTD devices
<*> NAND Device Support --->
<*> NAND Flash support for S3C SoC
[*] S3C NAND Hardware ECC
File Systems --->
Partition Types --->
[*] Advanced partition selection
[*] PC BIOS (MSDOS partition tables)
[*] BSD disklabel (FreeBSD
support
编译内核并拷贝到tftpboot下
$ make zImage
$ cp arch/arm/boot/zImage /tftpboot
启动目标板,在目标板上完成如下操作:
# cat /proc/mtd
dev: size erasesize name
. v .
support
partition tables)
. .
mtd0: 00100000 00020000 "bootloader"
mtd1: 00300000 00020000 "kernel"
mtd2: 00400000 00020000 "rootfs"
mtd3: 0f800000 00020000 "usrfs"
6.3.3 Linux内核调试
〔1〕修改driver/video/s3c-fb.c,在s3c_fb_probe函数中int ret=0;下增加下面语句:
int *ptr =NULL;
*ptr=0xff;
〔3〕编译内核下载到开发板上,内核启动会出现如类似下信息:
Unable to handle kernel NULL pointer dereference at virtual address 00000000
LR is at platform_drv_probe+0x1c/0x24
pc : [
sp : cfc29f0cip : cfc457c0 fp : 00000000
r10: 00000000 r9 : 00000000r8 : c03ad4f8
r7 :c03a93d0r6 : c03a93d0r5 : c0395258r4 : 00000000
r3 : 000000ffr2 : cfc28000r1 : 00000000r0 : c0395250
可以看出使用了空指针。找出函数调用关系:PC is at s3c_fb_probe+0xc/0x67c,表示出错指令为s3c_fb_probe函数中偏移为0xc的指令。pc:[
〔5〕对于大多数情况,从反汇编代码定位到C代码并不会如此容易,需要有较强的阅读汇编代码的能力。
. v .
. .
〔6〕另外一种方法是通过addr2line去定位
arm-none-linux-gnueabi-addr2line 0xc001abc4 -e vmlinux –f
6.4 Linux文件系统移植
Linux操作系统安装文件系统的选择过程;
1〕EXT2文件系统:ext2文件系统应该说是Linux早期的文件系统,但随着技术的开展,大多数Linux发行版目前不使用这个文件系统;如红帽和Fedora大多数都建议使用ext3,ext3文件系统是ext2的演变。支持ext2的反删除〔取消删除〕,如果不小心删除的文件,可以恢复;ext2支持大文件;ext2文件系统的官方主页是: :///。
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所示。
. v .
. .
目录树虚拟文件系统(VFS)JFFS2MTD字符设备YAFFSMTD块设备RamfsMTD设备驱动NOR FLASHNAND FLASHRAM
图6-1 Linux虚拟文件系统VFS
在嵌入式Linux应用中,主存储装置的RAM〔DRAM,SDRAM〕和ROM〔常采用FLASH存储器〕,基于存储设备的类型通常使用的文件系统包括:jffs2的,YAFFS,CRAMFS,ROMFS,虚拟盘,RAMFS/ TMPFS等,对于移植到开发板的存储设备Nandflash来说,大多采用cramfs文件系统。移植步骤如下:
〔1〕软件准备Busybox
Busybox有一个很形象的称呼,那就是linux系统中的“瑞士军刀〞,从这个称呼中看出,busybox是一个集多种功能于一身的工具。
Busybox在设计上就充分考虑了硬件资源受限的特殊工作环境。它采用一种很巧妙的方法减少自己的体积:所有的命令都通过“插件〞的方式集中到一个可执行文件中。
在busybox的编译过程中,可以非常方便地裁剪它的功能,类似于组态一样将所有的功能天添加或者删除,最后编译成一个可以使用的文件系统。
Busybox的编译过程是先使用make menuconfig进展配置,在这一点上与内核的编译过程很相似。
〔2〕源码下载
. v .
. .
我们选择的版本是2下载路径为: :///downloads/
〔3〕解压源码
〔4〕进入源码目录
〔5〕配置源码
$ make menuconfig
Busybox Settings --->
Build Options --->
编译:
$ make
安装:busybox默认安装路径为源码目录下的_install
$ make install
进入安装目录下:$ cd _install
$ ls
bin linuxrc sbin usr
添加其他需要目录
$ mkdir dev etc mnt proc var tmp sys root
添加库,将穿插工具链中的库文件拷贝到_install目录下
$ cp /home/linux/toolchain/arm-none-linux-gnueabi/lib/ ./
. v .
[ *] Build with Large File Support (for accessing files > 2 GB)
(arm-none-linux-gnueabi-) Cross Compiler prefix
() Additional CFLAGS
. .
删除lib下的所有目录、.o文件和.a文件,对库进展瘦身以减小文件系统的大小
$ arm-none-linux-gnueabi-strip lib/*
添加linux系统的启动文件,在etc下添加文件inittab,文件内容如下:
在etc下添加文件fstab,文件内容如下:
#device mount-point type options dump fsckorder
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
在本次的移植中我们挂载内核的文件系统有三个,分别是proc、sysfs和tmpfs,linux内核中默认都支持proc和sysfs,tmpfs是没有支持的,我们需要添加tmpfs的支持。
修改内核配置:
File systems --->
[*] Virtual memory file system support (former shm fs)
[*] Tmpfs POSIX Access Control Lists
重新编译linux内核源码。
在etc下创立init.d目录,并在init.d下创立rcS文件,在rcS写入内容:
#!/bin/sh
/bin/mount -a
. v .
. .
为rcS添加可执行权限:
# chmod +x init.d/rcS
在etc下添加profile文件,其中文件的内容为:
#!/bin/sh
export HOSTNAME=farsight
export USER=root
export HOME=root
#export PS1="[u@h W]$ "
export PS1="[$USER@$HOSTNAME W]# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
文件系统中设备文件的创立,在根文件系统中,有一个设备节点非常重要,需要必须创立,那就是在dev下创立console节点
$ mknod dev/console c 5 1
〔6〕cramfs文件系统镜像制作
由于系统提供制作cramfs文件系统的工具,那么可以利用。具体操作如下;
$ rootfs
〔1〕将拷贝到/tftpboot目录下
$ cp /tftpboot
〔2〕将烧写到nand flash的第三个分区上
u-boot下执行如下命令
# tftp 30008000
# nand erase 500000 800000
# nand write 30008000 500000 800000
. v .
. .
〔3〕重新设置u-boot启动参数
# setenv bootcmd tftp 33000000 zImage; go 33000000
# setenv bootargs root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200
# savenv
启动开发板,进展测试。
7 测试
Linux 内核在硬件平台上移植成功后,编写简单的驱动程序进展测试。
本设计运用c程序语言编写了画面切换的驱动程序,编译成功后下载到开发板上,观察是否得到预测结果。
得到结果如下列图所示:
图7-1 内核移植测试
画面切换功能实现,说明linux内核移植成功。
. v .
. .
8 结论
本设计完成了修改linux内核与硬件相关局部后将其移植到目标平台三星S5PV210的工作,并且编写了简单的驱动程序对移植成果进展测试。应用了大学所学的c语言、arm及单片机的知识,到达了制作毕业设计的目的。
完本钱毕业设计需要研究和理解linux内核源码,并对三星S5PV210硬件平台的构造及功能有所认识,只有掌握这些相关知识,才能使自己修改的内核源码与S5PV210匹配,得到理想结果。
内核修改工作繁琐,在完成设计的过程中必须认真细心,否那么会遇到很多问题。有时候甚至因为一个参数未能成功修改导致设计失败。
本设计的结果提供了一个嵌入式开发平台,最终目的是希望利用此平台进展设计,开发更多功能的嵌入式产品。
. v .
2024年1月26日发(作者:司寇若星)
. .
5.2 Linux系统启动流程分析
Ubuntu的启动过程主要包括四个步骤:
BIOS自检:识别主机上可以启动的设备,一次只能从一个设备上启动,如果一个启动设备失效,就可以使用下一个候选启动设备。通常是硬盘启动。启动驻留在硬盘主引导记录MBR中的引导程序Grub或lilo。
Grub/lilo引导启动:如果主机中安装多个操作系统,用户通过Grub或lilo,引导启动Ubuntu Linux系统。此时操作系统还没有装入内存,引导程序只是将控制权转移给内核。
装载Linux内核:在最初的引导过程完成之后,引导程序开场加载Linux内核,Ubuntu将Linux内核置于/boot目录下。
系统初始化:内核的初始化阶段将启动系统进程和脚本,init进程是系统开场的第一个工作,它是其他所有进程的父进程,并一直处于运行状态。使用top命令查看进程,可以发现init进程id号永远是第一个。init进程读取初始化脚本,完成系统相关的管理任务。
设备加电BIOS自检Grub/Lilo引导启动装载Linux内核系统初始化用户登录
图 5-1 linux系统启动流程
. v .
. .
6 基于S5PV210的linux内核移植
6.1 穿插开发环境的搭建
在自己的linux中建立穿插开发环境:
安装穿插编译工具链:
a 解压“Linux-Androidtoolchain〞目录下的“〞到根“/usr/local〞目录下,在“/usr/local〞目录下会生成“arm〞目录:
b 修改环境变量“PATH〞:
$ sudo vim /etc/environment
将路径(下面的红色字体,不加引号)添加到PATH变量的最后面,省略号代表原来PATH的值:
PATH=……:/usr/local/arm/4.2.2-eabi/usr/bin〞
c 保存退出后执行:
$ source /etc/ environment
. v .
. .
这样修改的环境变量会立即生效,于是我们就得到穿插编译工具:
6.2 Boot Loader移植
Bootloader引导程序在操作系统内核运行之前运行一个程序,一般应被写入为0x00开场的物理地址。有了这个代码,可以初始化硬件设备,初始化如CPU,SDRAM,闪存,串口,以太网口等,下载文件到开发板,闪存擦除和编程,起到一定的引导和装载内核映像的作用。
通常情况下,引导程序是依赖于硬件实现的,特别是在嵌入式系统。引导加载不同的体系构造需要不同的Bootloader,除了构造中,引导程序也取决于板级的嵌入式设备的具体构造。因此,建立一个共同的Bootloader几乎是不可能的,而是要建立一个总的框架那么是可能的。
Bootloader种类和分析:
现在bootloader的种类是非常多的,下面的表中列出了几种,关于bootloader的种类这里介绍的比拟简单,因为知道有多少种并没有什么太大的作用,之所以在这里列出是为了介绍下面bootloader的分类。Bootloader分类见下表6-1:
表6-1
bootloader分类
. v .
. .
这里的分类实际上是依据上面的bootloader的操作模式来进展划分的,根据一个系统是否支持上面的下载模式我们这里将bootloader划分为bootloader和monitor。
这里〞bootloader〞是指只是引导设备与执行主程序的固件,而〞monitor〞是指不仅拥有bootloader功能的,还能够进入下载模式的固件。
在本系统中,使用U-Boot作为开发板的Boot Loader。
拷贝“Linux-Android源码〞目录下的“〞到目标目录下,然后执行命令:
# tar jxvf
# make smdkc100_config
# make
在源码根目录〔uboot-samsung〕下会生成“〞。
6.3 linux内核镜像移植
Linux内核的移植,是针对Linux的操作系统做在目标平台上安装后必须裁剪才能正常运行特定的目标平台。
. v .
. .
Linux内核第一阶段的引导,初始化相关的代码首先被执行,初始化硬件存放器,存储器等。然后控制代码转向内核,在代码移植工作中,主要改变在体系构造相关的局部。
移植Linux内核,它是一个乏味的任务,主要包含修改启动代码,加载内核引导参数传递等。其根本构造如表6-2所示:
表6-2
linux体系构造
系统调用接口
进程管理
内存管理
内存管理
调度
块设备
字符设备管理
管理
网络事务管理
体系构造相关代码
硬件平台
TCP/IP协议
程序
移植步骤:
1、拷贝“Linux源码〞目录下的“2〞到目标目录下,然后解压
2、执行:
# make menuconfig
进入配置界面
. v .
. .
配置内核编译选项,需要注意的是要按照自己的实际情况选择Framebuffer显示设备的类型,选项位于:
-> Device Drivers
-> Graphics support
-> Support for frame buffer devices (FB [=y])
-> S3C Framebuffer support (FB_S3C [=y])
-> Select LCD Type (
如果开发板接480*272的LCD屏,应该选择:
(X)Innolux 4.3 inch (480x272)
如果开发板接800*600的VGA显示器,应该选择:
(X) VGA 800x600
如果开发板接1024*768的VGA显示器,应该选择:
(X) VGA 1024x768
. v .
. .
3、执行:
# make zImage
编译内核,生成的zImage位于:arch/arm/boot/下
6.3.1 Linux网卡驱动移植
网卡是嵌入式产品最常用的设备,这里我们需要完成网卡驱动的移植。FS_S5PV210使用的是DM9000网卡,我们通过这个实验能够了解如何在内核中添加网卡驱动及网络功能的根本配置。
平台设备列表的添加:
在smdkc100_device[]构造体数组中添加如下内容:
#if defined(CONFIG_DM9000)
&s5pv210_device_dm9000,
. v .
. .
#endif
配置内核
$ make menuconfig
网络配置:
[*] Networking support (NEW) --->
Networking options --->
<*> Packet socket
<*>Unix domain sockets
[*] TCP/IP networking
[*] IP: multicasting
[*] IP: kernel level autoconfiguration
[*] IP: BOOTP support
网卡驱动配置
Device Drivers --->
[*] Network device support --->
[*] Ethernet (10 or 100Mbit) --->
<*> DM9000 support
编译内核,并拷贝到tftpboot目录下:
$ make zImage
. v .
. .
$ cp arch/arm/boot/zImage /tftpboot
启动开发板,修改内核启动参数,通过NFS方式挂载根文件系统。
6.3.2 Linux文件系统编译
Nand flash 是嵌入式系统最常用的外部存储设备,这里介绍Nand flash驱动移植的过程。
添加针对我们平台的Nand flash驱动,拷贝s3c_nand.c到drivers/mtd/nand下,拷贝regs-nand.h到arch/arm/mach-s5pv210/include/mach下,针对平台上的nand flash设备,修改drivers/mtd/nand/nand_base.c文件。
添加平台设备列表
在smdkc100_device[]构造体数组中添加如下内容:
#if defined(CONFIG_MTD_NAND_S3C)
&s5pv210_device_nand,
#endif
修改arch/arm/plat-samsung/include/plat/nand.h添加如下内容:
struct s3c_nand_mtd_info {
uint chip_nr;
uint mtd_part_nr;
struct mtd_partition *partition;
};
配置内核
. v .
. .
$ make menuconfig
Device Drivers --->
<*> Memory Technology Device (MTD) support --->
[*] MTD partitioning support
<*> Caching block device access to MTD devices
<*> NAND Device Support --->
<*> NAND Flash support for S3C SoC
[*] S3C NAND Hardware ECC
File Systems --->
Partition Types --->
[*] Advanced partition selection
[*] PC BIOS (MSDOS partition tables)
[*] BSD disklabel (FreeBSD
support
编译内核并拷贝到tftpboot下
$ make zImage
$ cp arch/arm/boot/zImage /tftpboot
启动目标板,在目标板上完成如下操作:
# cat /proc/mtd
dev: size erasesize name
. v .
support
partition tables)
. .
mtd0: 00100000 00020000 "bootloader"
mtd1: 00300000 00020000 "kernel"
mtd2: 00400000 00020000 "rootfs"
mtd3: 0f800000 00020000 "usrfs"
6.3.3 Linux内核调试
〔1〕修改driver/video/s3c-fb.c,在s3c_fb_probe函数中int ret=0;下增加下面语句:
int *ptr =NULL;
*ptr=0xff;
〔3〕编译内核下载到开发板上,内核启动会出现如类似下信息:
Unable to handle kernel NULL pointer dereference at virtual address 00000000
LR is at platform_drv_probe+0x1c/0x24
pc : [
sp : cfc29f0cip : cfc457c0 fp : 00000000
r10: 00000000 r9 : 00000000r8 : c03ad4f8
r7 :c03a93d0r6 : c03a93d0r5 : c0395258r4 : 00000000
r3 : 000000ffr2 : cfc28000r1 : 00000000r0 : c0395250
可以看出使用了空指针。找出函数调用关系:PC is at s3c_fb_probe+0xc/0x67c,表示出错指令为s3c_fb_probe函数中偏移为0xc的指令。pc:[
〔5〕对于大多数情况,从反汇编代码定位到C代码并不会如此容易,需要有较强的阅读汇编代码的能力。
. v .
. .
〔6〕另外一种方法是通过addr2line去定位
arm-none-linux-gnueabi-addr2line 0xc001abc4 -e vmlinux –f
6.4 Linux文件系统移植
Linux操作系统安装文件系统的选择过程;
1〕EXT2文件系统:ext2文件系统应该说是Linux早期的文件系统,但随着技术的开展,大多数Linux发行版目前不使用这个文件系统;如红帽和Fedora大多数都建议使用ext3,ext3文件系统是ext2的演变。支持ext2的反删除〔取消删除〕,如果不小心删除的文件,可以恢复;ext2支持大文件;ext2文件系统的官方主页是: :///。
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所示。
. v .
. .
目录树虚拟文件系统(VFS)JFFS2MTD字符设备YAFFSMTD块设备RamfsMTD设备驱动NOR FLASHNAND FLASHRAM
图6-1 Linux虚拟文件系统VFS
在嵌入式Linux应用中,主存储装置的RAM〔DRAM,SDRAM〕和ROM〔常采用FLASH存储器〕,基于存储设备的类型通常使用的文件系统包括:jffs2的,YAFFS,CRAMFS,ROMFS,虚拟盘,RAMFS/ TMPFS等,对于移植到开发板的存储设备Nandflash来说,大多采用cramfs文件系统。移植步骤如下:
〔1〕软件准备Busybox
Busybox有一个很形象的称呼,那就是linux系统中的“瑞士军刀〞,从这个称呼中看出,busybox是一个集多种功能于一身的工具。
Busybox在设计上就充分考虑了硬件资源受限的特殊工作环境。它采用一种很巧妙的方法减少自己的体积:所有的命令都通过“插件〞的方式集中到一个可执行文件中。
在busybox的编译过程中,可以非常方便地裁剪它的功能,类似于组态一样将所有的功能天添加或者删除,最后编译成一个可以使用的文件系统。
Busybox的编译过程是先使用make menuconfig进展配置,在这一点上与内核的编译过程很相似。
〔2〕源码下载
. v .
. .
我们选择的版本是2下载路径为: :///downloads/
〔3〕解压源码
〔4〕进入源码目录
〔5〕配置源码
$ make menuconfig
Busybox Settings --->
Build Options --->
编译:
$ make
安装:busybox默认安装路径为源码目录下的_install
$ make install
进入安装目录下:$ cd _install
$ ls
bin linuxrc sbin usr
添加其他需要目录
$ mkdir dev etc mnt proc var tmp sys root
添加库,将穿插工具链中的库文件拷贝到_install目录下
$ cp /home/linux/toolchain/arm-none-linux-gnueabi/lib/ ./
. v .
[ *] Build with Large File Support (for accessing files > 2 GB)
(arm-none-linux-gnueabi-) Cross Compiler prefix
() Additional CFLAGS
. .
删除lib下的所有目录、.o文件和.a文件,对库进展瘦身以减小文件系统的大小
$ arm-none-linux-gnueabi-strip lib/*
添加linux系统的启动文件,在etc下添加文件inittab,文件内容如下:
在etc下添加文件fstab,文件内容如下:
#device mount-point type options dump fsckorder
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
在本次的移植中我们挂载内核的文件系统有三个,分别是proc、sysfs和tmpfs,linux内核中默认都支持proc和sysfs,tmpfs是没有支持的,我们需要添加tmpfs的支持。
修改内核配置:
File systems --->
[*] Virtual memory file system support (former shm fs)
[*] Tmpfs POSIX Access Control Lists
重新编译linux内核源码。
在etc下创立init.d目录,并在init.d下创立rcS文件,在rcS写入内容:
#!/bin/sh
/bin/mount -a
. v .
. .
为rcS添加可执行权限:
# chmod +x init.d/rcS
在etc下添加profile文件,其中文件的内容为:
#!/bin/sh
export HOSTNAME=farsight
export USER=root
export HOME=root
#export PS1="[u@h W]$ "
export PS1="[$USER@$HOSTNAME W]# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
文件系统中设备文件的创立,在根文件系统中,有一个设备节点非常重要,需要必须创立,那就是在dev下创立console节点
$ mknod dev/console c 5 1
〔6〕cramfs文件系统镜像制作
由于系统提供制作cramfs文件系统的工具,那么可以利用。具体操作如下;
$ rootfs
〔1〕将拷贝到/tftpboot目录下
$ cp /tftpboot
〔2〕将烧写到nand flash的第三个分区上
u-boot下执行如下命令
# tftp 30008000
# nand erase 500000 800000
# nand write 30008000 500000 800000
. v .
. .
〔3〕重新设置u-boot启动参数
# setenv bootcmd tftp 33000000 zImage; go 33000000
# setenv bootargs root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200
# savenv
启动开发板,进展测试。
7 测试
Linux 内核在硬件平台上移植成功后,编写简单的驱动程序进展测试。
本设计运用c程序语言编写了画面切换的驱动程序,编译成功后下载到开发板上,观察是否得到预测结果。
得到结果如下列图所示:
图7-1 内核移植测试
画面切换功能实现,说明linux内核移植成功。
. v .
. .
8 结论
本设计完成了修改linux内核与硬件相关局部后将其移植到目标平台三星S5PV210的工作,并且编写了简单的驱动程序对移植成果进展测试。应用了大学所学的c语言、arm及单片机的知识,到达了制作毕业设计的目的。
完本钱毕业设计需要研究和理解linux内核源码,并对三星S5PV210硬件平台的构造及功能有所认识,只有掌握这些相关知识,才能使自己修改的内核源码与S5PV210匹配,得到理想结果。
内核修改工作繁琐,在完成设计的过程中必须认真细心,否那么会遇到很多问题。有时候甚至因为一个参数未能成功修改导致设计失败。
本设计的结果提供了一个嵌入式开发平台,最终目的是希望利用此平台进展设计,开发更多功能的嵌入式产品。
. v .