实验三linux内核移植Word格式.docx
《实验三linux内核移植Word格式.docx》由会员分享,可在线阅读,更多相关《实验三linux内核移植Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
这样一句,以后启动就可以直接使用arm-linux-gcc了。
要使环境变量立马生效,可以使用下面的命令。
source/etc/profile
我们可以用arm-linux-gcc-v来查看交叉编译器版本,如果是4.1.1就是正确的。
(3)设置NandFlash分区信息表
设置NandFlash的分区信息表是为内核启动以后加载文件系统用的,可以将NandFlash看成我们PC机的硬盘,对NandFlash的分区看成是对硬盘的分区,硬盘可以分成C盘,D盘之类,而NandFlash则可以分成很多块,每块有不同的名字、大小和用途。
下面是对Super-ARM实验箱的NandFlash进行分区的情况(参考表5-1-1):
Ø
第0块命名为"
uboot"
,它用来存放u-boot.bin映像,起始地址是NandFlash的0x000000,最大0x30000个字节;
第1块命名为"
kernel"
,用来存放内核,起始地址是NandFlash的0x30000,最大0x1D0000个字节;
第2块命名为"
rootfs"
,用来存放根文件系统,起始地址是NandFlash的0x200000,最大30M字节;
第3块命名为"
ext-fs1"
,留给用户存放其他文件系统,起始地址是NandFlash的0x2000000,最大32M字节;
至于具体要怎么分,这样根据你的目标机的NandFlash来定,不能一概而论。
分区的方法就是修改arch/arm/plat-s3c24xx目录下的common-smdk.c文件:
执行geditarch/arm/plat-s3c24xx/common-smdk.c命令,找到:
staticstructmtd_partitionsmdk_default_nand_part[],在其中填入下面的内容(将原来的内容覆盖)
[0]={
.name="
.size=0x30000,
.offset=0,
},
[1]={
.offset=0x30000,
.size=0x1D0000,
[2]={
.offset=SZ_2M,
.size=SZ_1M*30,
[3]={
.offset=SZ_32M,
.size=SZ_32M,
}
(4)添加devfs文件系统支持
为了我们的内核支持devfs,以及在启动时能自动挂载/dev。
编辑fs/Kconfig:
在907行menu"
Pseudofilesystems"
下面添加如下代码:
configDEVFS_FS
bool"
/devfilesystemsupport(OBSOLETE)"
defaulty
configDEVFS_MOUNT
Automaticallymountatboot"
dependsonDEVFS_FS
(5)配置内核
首先执行makes3c2410_defconfig命令获取s3c2410_defconfig文件中给定的配置。
然后执行makemenuconfig命令配置内核
makes3c2410_defconfig
makemenuconfig
将出现以下图形配置界面:
在这个选单中,选择systemtype-->
s3c2410machines中的smdk2410,其它的arch-machines全部取消。
这个页面选择s3c2410Machines-->
这个页面把其它machines全部取消。
配置文件系统支持[可选]
上图是支持Ext3文件系统选项
下面是SD卡支持选项
选中mmc/SDcardsupport后进入里面
选中上面的选项后,插入sd卡时候会有提示
退出时候记得选择yes进行保存
(6)配置文件系统
为arm系统制作根文件系统的详细过程描述如下。
1、首先建立一个空根目录
我们的项目空间中将根文件系统规划在rootfs目录下,这个目录现在是空的,就把它作为我们的空根目录,接下来我们就在这个目录下建立根文件系统。
2、在rootfs中建立文件系统的目录结构,所有命令如下:
mkdir-p/arm2410/rootfs
cd/arm2410/rootfs
mkdirbindevetclibprocsbinsysusrmnttmpvar
chmod0777tmp#设置目录权限
mkdirusr/binusr/libusr/sbinlib/modules
mkdirmnt/etcmnt/jffs2mnt/yaffsmnt/datamnt/temp
mkdirvar/libvar/lockvar/logvar/runvar/tmp
chmod0777var/tmp#设置目录权限
第一行创建根文件系统目录。
第二行进入根文件系统目录。
第三行在根目录下创建一级目录bindevetclibprocsbinsysusrmnttmpvar。
第四行更改tmp权限,使得用户只能修改、删除自己在本目录下创建的文件。
第五行创建usr目录下的子目录
第六行创建mnt目录下的子目录。
第七行创建var目录下的子目录。
第八行更改var/tmp目录的权限。
3、创建设备文件
先了解一下Linux的设备:
Linux中主要有2种类型的设备:
字符设备(无缓冲且只能顺序存取)、块设备(有缓冲且可以随机存取)。
每个设备都必须有主、次设备号,主设备号相同的设备是同类设备(使用同一个驱动程序)。
这些设备中,有些设备是对实际存在的物理硬件的抽象,而有些设备则是内核自身提供的功能(不依赖于特定的物理硬件,又称为"
虚拟设备"
)。
每个设备在/dev目录下都有一个对应的文件(节点)。
可以通过cat/proc/devices命令查看当前已经加载的设备驱动程序的主设备号。
你可以在你的宿主机上执行这个命令看看你的宿主机所拥有的设备文件,可以看到,Linux有很多很多的设备文件,在嵌入式Linux中并没有这么多的设备,下面用mknod命令创建一些主要设备文件。
关于Linux的设备号:
很多设备在Linux下已经有默认的主次设备号,如帧缓冲设备是Linux的标准字符设备,主设备号是29,如果Linux下有多个帧缓冲设备,那么这些帧缓冲设备的次设备号就从0~31(Linux最多支持32个帧缓冲设备)进行编号,比如fb0对应的次设备号就是0,fb1为1,类推。
用户也可以创建自己的设备文件,比如下一篇章中我们要讨论的Led设备,需要注意的是用户自己的设备号不能与一些标准的系统设备号重叠。
Linux下创建设备节点的命令是mknod,下面是它的命令格式:
mknodName{b|c}MajorMinor
Name是设备名称,“b”或“c”用来指定设备的类型是块设备还是字符设备。
Major指定设备的主设备号,Minor是次设备号。
下面我们来创建嵌入式Linux系统中一些基本的设备文件,必须是root权限,命令如下:
mknod-m600dev/consolec51#创建系统控制台设备
mknod-m666dev/nullc13#创建空设备,任何写入都将被丢弃,任何读取都得到EOF
mknoddev/fb0c290#创建第一个帧缓冲设备,显示接口
mknoddev/ttyc50#创建TTY设备
mknoddev/tty0c40#创建当前虚拟控制台
mknoddev/tty1c41
mknoddev/tty2c42
mknoddev/tty3c43
mknoddev/tty4c44
ln-sdev/fb0dev/fb#创建创建fb到fb0的链接
4、准备启动配置文件
Linux启动所需要的文件有etc/inittab、etc/init.d/rcS、etc/fstab这三个文件(以下均假定当前路径在/arm2410/rootfs)。
下面创建inittab文件,命令:
geditetc/inittab,在文件中添加如下内容:
:
sysinit:
/etc/init.d/rcS
askfirst:
-/bin/sh
respawn:
restart:
/sbin/init
ctrlaltdel:
/sbin/reboot
shutdown:
/bin/umount-a-r
/sbin/swapoff-a
分析该配置文件,可以知道init进程首先执行/etc/init.d/rcS脚本文件,该文件马上就会被创建。
rcS
创建rcS文件,命令:
mkdiretc/init.d
geditetc/init.d/rcS
在文件中添加如下内容:
#!
/bin/sh
#mountallfilesystemdefinedin"
fstab"
echo"
#mountall......."
/bin/mount-a
更改该文件的权限:
chmod775etc/init.d/rcS
刚刚说到rcS文件是init进程执行的初始化命令脚本,在该文件中,笔者只加了一条命令:
“/bin/mount-a”,用来加载fstab文件中定义的文件系统,fstab文件马上就被会创建。
fstab
首先来看看/etc/fstab文件的作用,该文件存放的是系统中的文件系统信息。
当正确的设置了该文件,则可以通过"
mount/directoryname"
命令来加载一个文件系统,每种文件系统都对应一个独立的行,每行中的字段都有空格或tab键分开。
同时fsck、mount、umount的等命令都利用该程序。
fstab文件格式如下:
fs_specfs_filefs_typefs_optionsfs_dumpfs_pass
●fs_spec:
该字段定义希望加载的文件系统所在的设备或远程文件系统,对于NFS情况,格式一般为<
host>
<
dir>
例如:
`210.43.111.211:
/armnfs'
。
对于procfs,使用`proc'
来定义。
●fs_file:
该字段描述文件系统所希望加载的目录点,对于swap设备,该字段为none;
对于加载目录名包含空格的情况,用40来表示空格。
●fs_type:
定义了该设备上的文件系统类型。
●fs_options-指定加载该设备的文件系统是需要使用的特定参数选项,多个参数是由逗号分隔开来。
对于大多数系统使用"
defaults"
就可以满足需要。
●fs_dump:
该选项被"
dump"
命令使用来检查一个文件系统应该以多快频率进行转储,若不需要转储就设置该字段为0。
●fs_pass:
该字段被fsck命令用来决定在启动时需要被扫描的文件系统的顺序,根文件系统"
/"
对应该字段的值应该为1,其他文件系统应该为2。
若该文件系统无需在启动时扫描则设置该字段为0。
下面创建fstab文件,命令:
geditetc/fstab,在该文件中添加如下内容:
proc/procprocdefaults00
none/tmpramfsdefaults00
sysfs/syssysfsdefaults00
(5)利用BusyBox安装命令工具
下载并解压BusyBox
下载busybox-1.9.2.tar.bz2(地址:
解压busybox-1.9.2.tar.bz2,并进入解压后的busybox-1.9.2目录
mkdir/arm2410/sysapp/
cd/arm2410/sysapp/
wgetftp:
//192.168.4.210/busybox-1.9.2.tar.bz2
tar-jxvfbusybox-1.9.2.tar.bz2
cdbusybox-1.9.2
修改Makefile
ARCH?
=arm
这个步骤太熟悉了,没有再解释的必要了。
配置busybox
首先恢复默认配置,然后在默认配置的基础上根据需要更改busybox的配置
makedefconfig
配置busybox就是选择需要的命令。
一定要选择Shells里面的ash(图7-2-1)以及Initutilities里面的init(图7-2-2),一般情况下,执行了makedefconfig命令以后,这两项已经被选择了,这里提出来希望引起大家的注意。
先进入Shells-Chooseyourdefaultshell(ash)-
图7-2-1选择ash
选择好返回主菜单,选择InitUtilities---
图7-2-2配置init
另外还需要注意的配置有以下几项:
第一项:
BusyboxSetting----->
buildoption-->
[]BuildBusyBoxasastaticbinary(nosharedlibs)
[*]Buildsharedlibbusybox
[*]Produceabinaryforeachapplet,linkedagainstlibbusybox
[*]Produceadditionalbusyboxbinarylinkedagainstlibbusybox
[]BuildwithLargeFileSupport(foraccessingfiles>
2GB)
这里有必要解释一下前面的两个选项:
第一个选项是是建立静态程序库,静态库就是一些目标文件的集合,以.a结尾。
静态库在程序链接的时候使用,链接器会将程序中使用到函数的代码从库文件中拷贝到应用程序中。
一旦链接完成,在执行程序的时候就不需要静态库了。
由于每个使用静态库的应用程序都需要拷贝所用函数的代码,所以静态链接的文件会比较大,我们不选。
第二个选项是建立共享库,共享库以.so结尾。
共享库(so=shareobject)在程序的链接时候并不像静态库那样拷贝使用函数的代码,而只是作些标记。
然后在程序开始启动运行的时候,动态地加载所需模块。
所以,应用程序在运行的时候仍然需要共享库的支持。
共享库链接出来的文件比静态库要小得多,因此,我们选择这个选项。
第二项:
installationoption-->
[*]Don'
tuse/usr
Appletslinks(assoft-links)--->
(./_install)BusyBoxinstallationprefix
第三项:
BusyboxLibraryTuning-->
(6)Minimumpasswordlength
(2)MD5:
TradeBytesforSpeed
[*]Faster/procscanningcode(+100bytes)
[*]Supportfor/etc/networks
[*]Commandlineediting
(1024)Maximumlengthofinput
[*]Additionaleditingkeys
[*]vi-stylelineeditingcommands
(15)Historysize
[]Historysaving
[*]Tabcompletion
[*]Usernamecompletion
[*]Fancyshellprompts
(4)Copybuffersize,inkilobytes
[]Useclock_gettime(CLOCK_MONOTONIC)syscall
[*]Useioctlnamesratherthanhexvaluesinerrormessages
第四项:
LinuxModuleUtilities--->
[*]insmod
[*]Enableloadmap(-m)option
[*]Symbolsinloadmap
[*]rmmod
[*]lsmod
[*]lsmodprettyoutputfor2.6.xLinuxkernels
[*]modprobe
[]Multipleoptionsparsing
[]Fancyaliasparsing
---Optionscommontomultiplemodutils
[]Supporttaintedmodulecheckingwithnewkernels
[]Supportversion2.2.xto2.4.xLinuxkernels
[*]Supportversion2.6.xLinuxkernels
其他的Busybox选项采用默认设置,配置完成后,保存退出。
编译busybox
make
安装BusyBox中的工具到根文件系统
busybox编译成功以后,将其编译生成的命令工具安装到根文件系统中,采用如下命令:
makeCONFIG_PREFIX=/arm2410/rootfsinstall
其中,CONFIG_PREFIX用来指定安装路径,这里是根文件系统的目录。
若安装成功,会有如下信息:
--------------------------------------------------
Youwillprobablyneedtomakeyourbusyboxbinary
setuidroottoensureallconfiguredappletswill
workproperly.
安装完成后会在/arm2410/rootfs目录下生成linuxrc文件,再去bin和sbin目录下看看,是不是多了很多文件呢,这些都是BusyBox编译生成的命令工具。
修改bin/busybox的属性,命令如下:
cd/arm2410/rootfs/bin
chmod4755busybox
我们在这儿可以把交叉编译过后的自己写的程序拷贝到这个目录下,等烧写到开发板上之后,就可以启动并运行它。
7、复制常用的库文件到/arm2410/rootfs/lib/目录下
8、制作cramfs文件系统
进入目录/arm2410/,将制作好的根文件系统rootfs压缩成cramfs格式的映像文件。
cd/arm2410/
mkcramfsrootfsarm2410.cramfs
也可以将制作好的映像文件再解压到某个目录下,比如将arm2410.cramfs解压到arm2410目录下,可以用下面的命令:
mkdir/root/rootfs
mount-olooparm2410.cramfs/root/rootfs
cp/root/rootfs/*/arm2410/rootfs/-a
执行这条命令会自动建立arm2410/rootfs的目录,然后将arm2410.cramfs的内容释放到该目录下。
(7)配置内核参数,使它支持NandFlash上的文件系统
要将文件系统烧写到Flash中,然后挂载Flash中的文件系统。
这时,这个命令行参数就要变身为下面的形式了:
noinitrdroot=/dev/mtdblock2init=/linuxrcconsole=ttySAC0,115200
回到Linux内核目录,再次运行makemenuconfig命令以配置启动参数
cd/arm2410/kernel/linux-2.6.24
在Bootoptions-->
Defaultkernelcommandstring中输入上面的命令行参数,如下图示:
图7-6-1配置内核命令行参数