- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
利用make menuconfig(或make config、make xconfig)对Linux内核进行配置后,系统将产生配置文件(.config)。在编译时,顶层Makefile将读取.config中的配置选择。
顶层Makefile完成产生核心文件(vmlinux)和内核模块(module)两个任务,为了达到此目的,顶层Makefile递归进入到内核的各个子目录中,分别调用位于这些子目录中的Makefile,然后进行编译。至于到底进入哪些子目录,取决于内核的配置。顶层Makefile中的include arch/$(ARCH)/Makefile指定特定CPU体系结构下的Makefile,这个Makefile包含了特定平台相关的信息。
1.2内核MTD的重新分区
在给内核MTD重新分区之前,有一点应该注意,2.6.16(含)以前内核与2.6.17(含)以后内核的MTD重新分区方法是不一样的,前者是需要增加新的分区信息,而后者源代码初始文件中已含分区信息,需要的是修改分区信息。我们此次实验选用的内核为2.6.26,其相应的修改如下:
在源代码linux-2.6.26/arch/arm/plat-s3c2410xx/common-smdk.c文件下的“mtd_partition smdk_default_nand_part[]={}”中,可以看到默认的MTD分区。根据表1.1,以相同的格式修改原分区信息即可完成MTD的重新分区。
1. NAND Flash分区
从Nand Flash启动时,S3C2410硬件会自动把Nand Flash前4K代码拷贝芯片内部RAM空间,CPU其实是从内部RAM开始执行代码的,所以vivi必须放到Nand Flash顶端。vivi开始执行后将初始化硬件设备、建立内存空间映射表,为调用内核做好准备;然后把压缩的内核映像加载到SDRAM中;最后跳转到内核映像入口,启动内核。
3.3 make menuconfig配置内核
这是一种显示文本菜单的配置方式,使用最广泛。如果.config存在,则使用.config文件的默认配置。
make menuconfig
此后就可以看到内核配置界面,如图4.1所示。
图4.1内核配置界面
3.4读取已有的配置文件
2.6.26版本的内核已经为S3C2410 CPU准备了默认的配置文件,位置在arch/arm/configs/s3c2410_defconfig。一般情况下很多选择默认即可,但是特别要注意的是要修改启动参数。
3.内核编译过程
内核的配置主要通过make menuconfig或者是make xconfig这样的图形化界面来完成。不过在某些情况下特别是嵌入式环境下还需要手工配置文件或是修改makefile。
3.1修改makefile文件
我们需要编译用于ARM开发板的内核,使用的编译器是arm-linux-gcc。Makefile文件修改如下:
Devfs配置在Filesystem配置菜单下的Pseudo filesystems中,对应的配置文件是fs/Kconfig,我们可以在此fs/Kconfig的基础上做如下修改:
895 menu "Pseudo filesystems"
896
897 config DEVFS_FS
898 bool "/dev file system support(obsolete)"
Devfs文件系统从2.3内核开始支持,但是在2.6内核中已被逐渐舍弃,我们使用的2.6.26版本的内核中已经没有了支持devfs的配置选项(代码级别上仍然支持,仅仅是去掉了配置选项),而在较早的2.6内核中则该设置被标注为obsolete(过时的)。然而对于嵌入式Linux来说,devfs可提供较强的灵活性和紧缩而准确的/dev目录,确实是一项比较方便的配置,因此我们采用手动的方式把它恢复过来。
各个子目录下的Makefile同样也根据配置文件(.config)给出的配置信息,构造出当前配置下需要的源文件列表,并在文件最后有include $(TOPDIR)/Rules.make。
顶层Makefile定义并向环境中输出了许多变量,为各个子目录下的Makefile传递一些变量信息。有些变量,比如SUBDIRS,不仅在顶层Makefile中定义并且赋初值,而且在arch/*/Makefile还作了扩充。
配置工具:包括对配置脚本中使用的配置命令进行解释的配置命令解释器和配置用户界面(基于字符界面:make config;基于Ncurses图形界面:make menuconfig;基于xWindows图形界面:make xconfig)
Rules.make:规则文件,被所有的Makefile使用。
2.2编译规则Makefile
.offset = SZ_1M* 48,
.size = SZ_16M,
}
#endif
};
默认情况下分了8个区,而我们需要规划其中的6个分区,因此将后面的部分用#if 0和#endif包含起来,暂时不使用。在设置每个分区的大小(.size)和偏移量(.offset)时要小心,不要导致分区重叠,并且内核和跟文件系统的偏移量设置与BootLoader中的设置保持一致,其原因上面已经分析过了。
},
[1] = {
.name = "paraFra Baidu bibliotek",
.offset = 0x00020000,
.size = 0x00010000,
},
[2] = {
.name = "kernel",
.offset = 0x00030000,
.size = 0x00400000,
},
[3] = {
.name = "root",
2.3编译内核的常用命令
精简Linux内核常用命令包括:make config、make dep、make clean、make mrproper、make zImage、make bzImage、make modules、make modules_install,用于配置内核,编译内核和编译安装模块。其中make zImage是我们本次实验用到的编译内核的命令。
Boot Options--->Default kernel command string,
修改如下:
在arch/arm/configs/s3c2410_defconfig中
CONFIG_CMDLINE=root=/dev/mtdblock2 init=/linuxrcconsole=ttySAC0,115200 mem=64M
1嵌入式Linux内核移植
姓名:成炼学号:081141
实验目的
l了解Linux内核源代码的目录结构及各目录的相关内容
l了解Linux内核各配置选项内容和作用
l掌握Linux内核配置文件的作用
l掌握Linux内核的编译过程
l掌握将新增内核代码加入到Linux内核结构中的方法
实验指引
尽管目前Linux 2.6版本内核已经增加了很多对ARM体系甚至是S3C2410 CPU的支持,但仍然需要对内核作一些小的修改来适应我们的开发板,并且需要重新配置、编译和重新生成新的内核映像。本实验着重从NAND Flash分区到下载到开发板等一系列连贯的操作来进行嵌入式Linux内核的移植。本实验的内核版本为2.6.26。
2.内核的配置的基本结构
2.1 Linux内核的配置系统由四个部分组成
Makefile:分布在Linux内核源码中的Makefile,定义Linux内核的编译规则;顶层Makefile是整个内核配置、编译的总体控制文件;
配置文件(config.in):给用户提供配置选择的功能;config:内核配置文件,包括由用户选择的配置选项,用来存放内核配置后的结果;
.size = 0x000cc000,
}
#if 0
[6] = {
.name = "S3C2410 flash partition 6",
.offset = 0x3f300000,
.size = SZ_1M* 24,
},
[7] = {
.name = "S3C2410 flash partition 7",
899 default y
900
901 config DEVFS_MOUNT
902 bool "Automatically mount at boot"
903 default y
904 depends on DEVFS_FS
905
906 config PROC_FS
907 bool "/proc file system support" if EMBEDDED
内核MTD分区必须与vivi分区相一致。因为,vivi分区中的地址是引导程序、内核映像及文件系统下载到Nand Flash的真正地址;而内核启动时,内核并不是去读vivi分区中的地址,而是去读内核MTD分区设定的地址;所以,如果内核MTD分区与vivi分区不相同,很可能导致不能正常启动内核及读取文件系统。
进入配置菜单后,可以通过Load an Alternate Configuration File选项来读取这个默认配置,如图4.2所示。
图4.2读取配置文件
或者直接将其拷贝过来,命名为.config,这样make menuconfig就会读取该.config文件作为默认配置。
cp arch/arm/configs/s3c2410_defconfig .config
1.1 vivi的重新分区
根据开发板的Nand Flash大小及开发用途确定新的vivi分区,如表1.1。
表1.1 vivi的分区信息表
打开vivi源代码下的arch/s3c2410/smdk.c文件,在函数:“mtd_partition_default_mtd_partitions[]={}”中可以看到vivi默认的Nand Flash分区信息。根据表2的新分区信息,在上述函数中以相同的格式修改原有分区信息即可完成vivi的重新分区。这里可以参考vivi的使用手册,《Getting started with vivi》。
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
修改为:
ARCH ?= arm
CROSS_COMPILE ?=/usr/local/arm/xxxx/bin/arm-linux-gcc-
这里ARCH=arm说明目标是ARM体系结构,默认的ARCH是指宿主机的体系,如i386;CROSS_COMPILE=arm-linux-说明使用交叉编译器前缀为arm-linux-,默认情况下为空。
3.5选择具体的配置选项
内核移植关键的步骤就在于配置哪些选项是必须选择,哪些选项是不用选的。实际上在配置时,大部分选项可以使用其默认值,只有少部分需要根据用户不同的需要选择。选择的原则,是将与内核其它部分关系较远且不经常使用的部分功能代码编译成可加载模块,有利于减小内核的大小,减小内核消耗的内存,简化该功能相应的环境改变时对内核的影响。不需要的功能就不选,与内核关系紧密而且经常使用的部分功能代码直接编译到内核中。
908 default y
909 help
其中粗体部分(897~890行)是添加的内容,其作用是让内核在编译时加入devfs文件系统的支持,在后面的make menuconfig时可以看到,加入这些内容之后出现了与devfs相关的配置选项。注意这里将默认的设置设为了default y,即默认被选中。
.offset = 0x00430000,
.size = 0x00300000,
},
[4] = {
.name = "yaffs",
.offset = 0x00730000,
.size = 0x03800000,
},
[5] = {
.name = "ucos",
.offset = 0x3f300000,
3.2添加devfs配置
devfs指的是设备文件系统(Device Filesystem),其作用在于提供一个更为方便的方式来管理通常位于/dev目录的所有块设备和字符设备等。Linux可以支持很多不同种类的硬件,这意味着/dev目录中可能需要数百个特殊文件来表示所有这些设备,而且往往对一些目前不存在的设备,也保留这些设备文件以备将来可以用到,这样是不方便的。Devfs用于自动管理这些设备文件,所有需要的设备节点都由内核自动创建,而不需要的则不会出现在/dev目录下。
/* NAND parititon from2.4.18-swl5 */
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "ViVi",
.size = 0x00020000,
.offset = 0x00000000,