Uclinu内核配置与裁减

上传人:人*** 文档编号:512939498 上传时间:2023-04-29 格式:DOCX 页数:15 大小:28.45KB
返回 下载 相关 举报
Uclinu内核配置与裁减_第1页
第1页 / 共15页
Uclinu内核配置与裁减_第2页
第2页 / 共15页
Uclinu内核配置与裁减_第3页
第3页 / 共15页
Uclinu内核配置与裁减_第4页
第4页 / 共15页
Uclinu内核配置与裁减_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《Uclinu内核配置与裁减》由会员分享,可在线阅读,更多相关《Uclinu内核配置与裁减(15页珍藏版)》请在金锄头文库上搜索。

1、Uclinux内核配置与裁减XXXXXXXXXXXXXXXXXXXXXXXXXXXXX创建时间:08/01/17X创建人:叶振风XXXXXXXXXXXXXXXXXXXXXXXXXXXXX最后修改时间:X修改人:叶振风XXXXXXXXXXXXXXXXXXXXXXXXXXXXUclinux的配置和裁减也是利用的华恒科技提供的源码包(用于hhbf531学习板)。我们使 用的开发板信息如下:CPU: BF533FLASH: S29AL004D-512KBSDRAM: HY57V281620-16MB这里我不敢说uclinux的移植”,而只是以配置与裁减”代之,是因为我觉得自己的工作真的 谈不上什么移植

2、。现成的源码包,所有的底层驱动都已经完成,我们所要做的只是选择自己 需要的驱动、配置一下内核、做一些裁减工作而已。每每听到其他人提到最近又完成了XXX 平台的linux移植”,我都会有点担心:国内有多少工程师能真正从最初始的工作开始,完成 一个平台的系统移植应该很少吧。下面,我分以下步骤简单介绍一下我的配置过程。一,配置并在RAM中运行内核(不带根文件系统):由于我们的flash空间有限,在没有裁减之前,就算不带根文件系统,也无法烧写到flash 内保存;所以先尝试下载到RAM中运行。另外,我们目前的开发板上没有网络功能,只能 通过串口下载,所以在这里配置内核的过程中,做一些简单裁减,以便节约

3、下载时间。解压源码包后,进入uclinux目录:#cd uClinux-dist设定交叉工具链:#PATH=/usr/local/bi n/gcc-bfi n-3.4-ucli nu x/bi n/:$PATH进入配置:#make menucon fig运行后,进入MainMenu配置页,可以在此选择 Vender/Product 和 Kernel/Library/Defaults 等内容。根据我们使用的平台,我们选择:Vender-AnalogDevices, Product-HHBF533(或 者HHBF531), Libc-uClibc;如果要配置内核和应用程序还要分别选中Customi

4、ze Kernel Settings、Customize Vender/User Settings。退出保存后,将依次进入配置内核和配置 应用程序页。如果想单独配置内核,可以进入目录lin ux-2.6.x/内运行make menucon fig。配置应用程序 在这个源码包里好像没有单独的con fig选项。这些关于内核源码包结构的基本知识,需要 大家提前了解。下面,我们来配置内核。配置一个可以在我们的SDRAM中运行的内核很简单,因为底层工作都已经完成。我们只 需要配置一下处理器相关内容即可。处理器选项位于内核配置页的Blackfi n Processer Options。进入该配置页,进行

5、如下配置:CPU-BF533System type- BF533-HHBFBoard Customizati ons -根据你的开发板时钟、SDRAM信息配置,其他不用修改。Clock Setti ngs u-boot的时钟配置。取消Re -programClocks while Kernel boots,默认为其他选项不用修改,各项配置功能介绍见文档附丄inux 2.6.19.x内核编译配置选项简介。以上配置正确后,下载到你的开发板上,应该就可以运行了。但通过串口下载速度太慢,我 们先去掉一些不需要的驱动。由于我们没有网络功能,所以把网络及其驱动全部取消,可以 裁减150KB左右的空间;我们

6、也不需要音视频功能,所以把音视频驱动也取消,又可以减 小很大空间。如此配置后,我们可以尝试下载到SDRAM中运行了。现在,我们还不想裁减根文件系统,所以,我们想得到一个不带根文件系统的压缩内核镜像。 由于华恒提供的源码包,编译后不能得到压缩的不带根文件系统的镜像,所以我们要通过修 改Makefile得到我们需要的编译结果。需要修改的Makefile位于uCIinux-dist目录下,打开该Makefile,在.PHONY:linux项的In -f $(LINUXDIR)/vmlinux $(LINUXDIR)/linux;语句后,添加以下内容。rm -f $(LINUXDIR)/*.gz;bf

7、i n-ucli nu x-objcpy -O bin ary -S linu xli nu x.b in; gzip -f9 linux.bin; bfi n-ucli nu x-mkimage -A blackf in -0 linux-T ker nel -Cgzip -a 0x1000 -e 0x1000 -n uClinux Kernel Image -dli nu x.b in .gz uImage.b in;这样在uClinux-dist目录下执行make linux就可以生成压缩的不带根文件系统的内核镜像 了,该镜像文件为uImage.bin,位于linux-2.6.x目录内。

8、现在,可以将得到的内核下载到 SDRAM中运行了。因为是压缩内核,所以运行时要使用u-boot的bootm命令。至于u-boot 命令的使用方法,自行学习。Makefile也是编译内核的基础知识,需要大家逐步掌握。这样,该步的工作就可以告一段落了。 下载到SDRAM中,如果解压后无法运行,先检查一下上述配置操作是否有误。如果确定 无误,就需要分析内核的执行过程,仔细分析问题了。接下来简单介绍一下内核执行流程。二,内核执行流程:承接上篇u-boot引导uclinux过程分析,介绍内核启动流程。/下载完内核镜像(zlmage.bin)后,可以在内存中直接引导运行uclinux。因 为内核是压缩后的

9、镜像,所以需要u-boot进行解压引导,具体由u-boot的bootm 指令实现。Bootm指令在u-boot内由do_bootm()函数实现,该函数位于 /common/Cmd_bootm.c 文件中。引导过程通过控制终端打印的信息如下:UBOOT bootm OOeOOOOO# Booting image at OOeOOOOO .Image Name: Bfin uClinux KernelCreated:2007-12-20 2:05:37 UTCImage Type: Blackfin Linux Kernel Image (gzip compressed)Data Size: 68

10、5719 Bytes = 669.6 kBLoad Address: 00001000Entry Point: 00001000Verifying Checksum . OKUncompressing Kernel Image . OKStarting Kernel at 0x1000由打印信息可以看出,弓I导过程可以分为以下几步: 打印内核镜像头信息 内核镜像头校验 内核镜像解压 传递环境变量给内核并切换到内核运行下面分别介绍:1,打印内核镜像头信息:打印内核镜像头信息由以下函数实现:print image hdr (image header t *)addr);其中的addr可以通过以下语

11、句查看:printf (# Booting image at %081x .n, addr); addr就是内核镜像下载到RAM中的起始地址。 打印信息的内容见前面的控制终端打印的信息。2,内核镜像头校验: 由以下语句实现:if (verify) puts ( Verifying Checksum .);讦(crc32 (0, (char *)data, len) != ntohl(hdr-ih_dcrc) printf (Bad Data CRCn); SHOW_BOOT_PROGRESS (-3);return 1;puts (OKn);其中,(char *)data指向内核镜像起始地址,

12、len为内核镜像头的长度, hdr-ih dcrc为内核镜像头内保存的校验结果。校验正确,打印:Verifying Checksum . OK3,内核镜像解压:内核镜像解压根据内核的不同压缩格式调用不同的解压缩函数执行。压缩类 型存储于内核镜像头中的hdr-ih_comp变量中,主要类型有:IH_COMP_NONE 无压缩的 XIPIH_COMP_GZIP GZIP 压缩CONFIG_BZIP2 BZIP2 压缩我们使用的内核采用GZIP压缩格式,所以将调用GZIP解压缩函数执行解 压,具体由以下函数实现:gunzip (void *)ntohl(hdr-ih load), unc len,

13、(uchar *)data, &len)传递的四个参数依次是:解压目标地址(指针)、解压目标长度、解压源地 址(指针)和解压源长度。其中解压目标长度只要大于实际解压后的目标长度即 可。正确解压后打印如下信息:Uncompressing Kernel Image . OK4,传递环境变量给内核并切换到内核运行:内核镜像解压后,u-boot将根据内核镜像头指示的操作系统类型调用相应的 boot操作函数。例如linux系统,u-boot会相应地调用do_bootm_linux()函数执行。 操作系统类型存储在内核镜像头内的hdr-ih_os变量中。do_bootm_linux()函数 位于lib_x

14、xx/xxx_linux.c文件中,“xxx”表示与你的硬件平台对应的相关名称。 例如,我们的平台为ADI的blackfin系列BF533,所以对应文件为 lib_blackfin/bf533_linux.c。我们来分析一下do bootm linux()函数的内容:void do_bootm_linux(cmd_tbl_t * cmdtp, int flag, int argc, char *argv,ulong addr, ulong * len_ptr, int verify)int (*appl)(char *cmdline);char *cmdline;#ifdef SHARED R

15、ESOURCESswap to(FLASH);#endifappl = (int (*)(char *)ntohl(header.ih_ep);(1)printf(Starting Kernel at %#xn, appl);(2)cmdline = make_command_line();(3)if (icache_status() flush_instruction_cache();icache_disable(); if(dcache status() flush data cache();dcache disable();(*appl)(cmdline);(4)以上代码黑色部分是我们重要分析的部分,灰色内容暂时忽略;并对主要的 四个语句分别标识了(1)到(4)的标号。通过语句(1)将

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号