logo资料库

linux操作系统的移植与研究.doc

第1页 / 共20页
第2页 / 共20页
第3页 / 共20页
第4页 / 共20页
第5页 / 共20页
第6页 / 共20页
第7页 / 共20页
第8页 / 共20页
资料共20页,剩余部分请下载后查看
嵌入式 Linux 操作系统的 移植与研究
一.概述 嵌入式系统一般定义为:以应用为中心,以计算机技术为基础,软硬件可剪裁,适应 应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。简言之,一个嵌 入式系统就是一个计算机硬件和软件的 集合体。S3C2440是SAMSUNG公司使用ARM920T处理器内核开发的一款嵌入式处理器,专门为 PDA、INTERNET设备、手持设备等开发,S3C2440和它的前身$3C2410相比,除了具有宽温的 特性和两倍的运行速度以外,还具备了AC97编码器、摄像模块(标准CCD或CMOS)接口、驱动 强度控制等功能,它是真正的工业级芯片,配合14 minx 14 mm的小体积,可以适合多数嵌 入式场合使用。Linux是开放源代码的操作系统。 嵌入式Linux是按照嵌入式操作系统的要求设计的一种小型操作系统,由一个内核以 及一些根据需要进行定制的系统模块组成。其内核很小,一般只有几百kbyte,它非常适合 移植到嵌入式系统中去,同时它还具有多用户多任务的系统特征,有些还具有实时特征。本 文从以下三个方面系统介绍如何搭建一个基于Linux-2.6.23.14内核的小型Linux操作系 统,并将它移植到$3C2440开发板上。 二.系统总体设计 1.VIVI 移植。 2. linux 内核移植。 3. DM9000网卡驱动移植。 4.交叉编译 busybox。 5.执行 make CONFIG_PREFIX=/2440/rootfs install。 6.NFS 文件系统 client 端设置。 7.构建其他目录。 8.使用 mkyaffsimgae 命令生成 yaffs 映像文件。 9.通过 supervivi 将内核映像 zImage 和 rootfs.yaffs 下载到开发板上。 1
三. 系统实现: 1.VIVI 移植 在移植 VIVI 之前,必须先保证交叉编译器的正确性。在 VIVI 和 kernel 的 Makefile 中需要 指定交叉编译器的位置,所以在正式移植以前先把交叉编译器 copy 到指定的位置 /usr/local/arm/… 1.1 修改 Makefile 文件 Makefile 中主要修要修改三处: 1. LINUX_INCLUDE_DIR 设置为 LINUX_INCLUDE_DIR = /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include 2. CROSS_COMPILE 设置为 CROSS_COMPILE = /usr/local/arm/4.3.2/bin/arm-linux- 3. ARM_GCC_LIBS 设置为 ARM_GCC_LIBS = /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib 1.2 修改 arch/s3c2440/smdk.c Smdk.c 是 VIVI 移植中最重要的一个文件,主要是分区表的建立和启动参数的设置 1. 分区表的建立 将 s3c2440_NAND_BOOT 时对应的分区数据结构修改为如下结构 #ifdef CONFIG_S3C2440_NAND_BOOT mtd_partition_t default_mtd_partitions[] = { { 2
/* add by xwc 2010-04-15 */ name: "supervivi", offset: 0, size: 0x00030000, flag: 0 }, { name: "kernel", offset: 0x00050000, size: 0x00200000, flag: 0 }, { name: "root", offset: 0x00250000, size: 0x03Dac000, flag: 0 } }; #endif 3
2. 启动参数的设置 启动参数主要是指这一行 char linux_cmd[] = "noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0"; 在我最开始做实验的时候,因为不知道 param save 无法保存的 bug 是怎么回事(详见下 文),所以选择在代码里修改,之后解决了那个问题,就选择用默认的参数,在启动的时候 可以手动设置。 1.3 配置选项 主要是用 make menuconfig 的方式对 VIV 进行配置,不过一般在 make menuconfig 之前最 好先执行 make distclean 确保系统处于 clean 的状态,不然有时候会无法生成 config 界 面 各个部分大致做的工作如下 System Type ---> [系统配置:主要设置芯片、平台类型 底层启动选项等] General setup---> [通用设置:vivi 基地址、系统缓存、电源管理等 ] Private Data ---> [私有数据设置:vivi 的私有数据 启动的一些用户私有数据] Serial Port ---> [串口:是否支持串口(vivi 只支持串口,怎么敢不选),串口传输协议] Memory Technology Devices(MTD)--> [存储设备相关选项] Add Built-in Commands ----> [vivi 支持命令] System hacking ----> [系统调试相关选项] Debugging messages ---> [调试信息相关] ---- Load and Alternate Configuration File [载入配置文件,vivi 自带一个 sdmk 的配置文 件] Save Configuration to an Alternate File [保存自己的配置信息] 4
有如下几个地方需要注意: System type 要选对,而且要保证支持 NAND 启动方式 I-cache D-cache 要选中,要不然启动很慢 要启动串口支持 1.4 做实验过程中遇到的问题 VIVI 的移植相对而言很简单,最开始在 make menuconfig 的时候没有编辑界面跳出来,不 过我平时弄 linux-kernel 比较多,linux kernel menuconfig 的时候有时也会报错,主要 是因为以前编辑过,有些残留的文件,要清除掉才可以,于是打开 Makefile 文件,查找果 然有 distclean: clean: find . \( -name '*.o' -o -name core -o -name ".*.flags" \) -type f -print \ | grep -v lxdialog/ | xargs rm -f rm -f $(CLEAN_FILES) distclean: clean 于是我就知道肯定是要先 make distclean 一下。 还有一个问题就是 mach_type, 这里经过我的研究,发现只要 linux kernel 和 vivi 中对应 就可以了,不修改也是没有问题的,所以我选择了不修改。 2. linux 内核移植 内核的移植其实本质上跟 VIVI 差不多,主要是做一些配置,一是使用 gcc-arm 交叉编译器, 二是与 vivi 上的分区表保持一致。 2.1修改 Makefile 主要是修改成使用 arm-gcc 交叉编译器进行编译,下面是我 makefile 中修改的地方 第一处: 5
#======================================================================== #SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \ # -e s/arm.*/arm/ -e s/sa110/arm/ \ # -e s/s390x/s390/ -e s/parisc64/parisc/ \ # -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \ # -e s/sh.*/sh/ ) #======================================================================== # add by xwc # 2010-4-15 SUBARCH := arm #======================================================================== 第二处: #=============================== #CROSS_COMPILE ?= #============================== # add by xwc # 2010-4-15 CROSS_COMPILE ?= arm-linux- #============================== 2.2 ~/.bashrc 修改 为了能够更方便的使用 arm-gcc 交叉编译器,将其加入到 Path 中,可以利用修改.bashrc 的方式: 6
export PATH=$PATH:/usr/local/arm/4.3.2/bin 然后 source .bashrc 一下,或者重新登录就可以了。这样就没有必要再 Makefile 中指定 全局的路径。 2.3 时钟配置 对应于 arch/arm/mach-s3c2440/mach-smdk2440.c 将 S3c24xx_init_clocks(16934400); 改为: S3c24xx_init_clocks(12000000); 2.4 分区信息修改 分区的信息要保持跟 VIVI 中一致,其实理论上说,不保持一致也是 OK 的,不过为了防止意 外,最好还是 copy 一下。 修改 arch/arm/plat-s3c24xx/common-smdk.c 文件 static struct mtd_partition smdk_default_nand_part[] = { /* add by xwc 2010-04-15 */ [0] = { .name = "supervivi", .size = 0x00030000, .offset = 0, 7
分享到:
收藏