S3C2440的Linux内核移植和yaffs2文件系统制作

合集下载

S3C2440移植linux3.4.2内核之内核裁剪

S3C2440移植linux3.4.2内核之内核裁剪

S3C2440移植linux3.4.2内核之内核裁剪上一节S3C2440移植linux3.4.2内核之支持YAFFS文件系统我们修改了内核支持了yaffs2文件系统,这节我们裁剪内核。

为什么要裁剪内核?因为mtd的kernel分区只有2M大,而实际内核有2.37MB,所以需要裁剪到小于2M(或者修改mtd分区值)首先裁剪内核里无关的CPU/单板文件通过vi .config,然后搜索2440,如下图所示:然后参考上图,make menuconfig进入System Type ---> SAMSUNG S3C24XX SoCs Support:如上图所示,CPU下只选择2440,单板文件下只选择SMDK2440以及MINI2440相关裁剪无关的文件系统ext2、ext3、ext4重新make menuconfig,进入File systems,去掉: < > Second extended fs support //ext2< > Ext3 journalling file system support< > The Extended 4 (ext4) filesystem裁剪光盘文件系统CD-ROM进入File systems---> CD-ROM/DVD Filesystems,去掉:< > ISO 9660 CDROM file system support裁剪不常用的杂项文件系统进入File systems---> Miscellaneous filesystems,去掉:< > Compressed ROM file system support (cramfs) // cramfs压缩文件系统[ ] Include support for ZLIB compressed file systems //zlib 压缩文件系统< > ROM file system support // Romfs通过内核启动信息来裁剪如下图所示,内核启动时,看到初始化了PS2鼠标驱动由于,我们2440板子只有USB接口,所以需要裁剪掉PS2鼠标驱动:重新make menuconfig,进入Device Drivers-> Input device support,去掉:[ ] Provide legacy /dev/psaux device //PS2鼠标鼠标指向的鼠标设备文件[ ] Mice ---> //其它各种鼠标驱动,包括PS2鼠标、I2C鼠标、触摸板等[ ] PS/2mouse通过.config文件的内容来裁剪通过vi .config,找到如下图所示,由于CONFIG_TOUCHSCREEN_USB(USB触摸板)很少见到,所以去掉USB-based Watchdog Cards(基于usb的看门狗卡)如下图所示,这个看门狗卡很少用到,所以去掉CONFIG_SSB_POSSIBLEUSB-based Watchdog Cards(基于usb的看门狗卡)Sonics Silicon Backplane (Sonics公司下的Silicon底板)如下图所示,这个公司的产品没有用到,所以去掉CONFIG_BCMA_POSSIBLE找到如下图所示,由于CONFIG_SND_USB (USB声卡)没用到,所以去掉去掉CONFIG_USB_LIBUSUAL,没用到最后通过上节查找的裁剪内容,来make menuconfig去掉CONFIG_TOUCHSCREEN_USB-> Device Drivers-> Input device support-> Generic input layer-> Touchscreens<*> Samsung S3C2410/generic touchscreen input driver //加上自带的触摸屏驱动< > USB Touchscreen Driver //去掉USB触摸屏驱动去掉CONFIG_SSB_POSSIBLE搜索如下图所示,该宏是被别的选项设置,所以去掉不了:去掉CONFIG_BCMA_POSSIBLE。

飞凌2440内核移植

飞凌2440内核移植

宿主机:ubuntu9.04目标机:飞凌OK2440开发板交叉编译器:arm-linux-gcc-3.4.1交叉编译器路径:/usr/local/arm/3.4.1要移植的内核版本:linux-2.6.33文件系统类型:yaffs2 (目前使用光盘中linux-2.6.28.7的文件系统)欢迎大家一起讨论,请各位指正。

另外请回帖的各位老师、同学、工程师写清楚移植过程。

如果只是通篇的问题,很难判断哪里有问题。

下载解压内核首先,从官网上下载linux-2.6.33的内核。

ftp:///pub/linux/kernel/v2.6/可以找到。

新建目录mkdir /file/fl。

将内核源码包拷贝到/file/fl的目录下。

解压源码包tar zxvf linux-2.6.33.tar.gz移植yaffs2驱动下载最新的驱动/cgi-bin/ ... fs2.tar.gz?view=tar解压在/file/fl下tar zxvf yaffs2.tar.gz进入yaffs2,cd yaffs2给内核打补丁./patch-ker.sh c /file/fl/linux-2.6.33成功后打印信息Updating /file/fl/linux-2.6.33/fs/KconfigUpdating /file/fl/linux-2.6.33/fs/Makefile修改机器码飞凌开发板的bootloader默认的机器码是193,所以我们在使用smdk2440机器的时候,需要修改机器码。

修改arch/arm/tools/mach-types。

将s3c2410 ARCH_S3C2410 S3C2410 193s3c2440 ARCH_S3C2440 S3C2440 362改成s3c2440 ARCH_S3C2440 S3C2440 193指定目标板machine、编译器和编译器路径修改linux-2.6.33/Makefile,将ARCH ?= $(SUBARCH)CROSS_COMPILE ?=修改成#ARCH ?= $(SUBARCH)#CROSS_COMPILE ?=ARCH ?= armCROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux-增加devfs文件管理器的支持我们所用的文件系统使用的是devfs文件管理器。

S3C2440系统的内核与文件系统移植

S3C2440系统的内核与文件系统移植

首先:在汇编中初始化堆栈,中断向量表,MMU,时钟,串口等,然后跳到C语言的Main 函数。

这部分代码小于4K,放在block0。

这个Main函数用来将第二段代码拷备到DRAM 中并执行。

其次:进入第二段代码。

第二段代码也是先在汇编中初始化堆栈,中断向量表等,然后跳到C语言的Main函数。

这部分代码就不用有4K限制了,具体大小由第一段代码决定,因为它本身由第一段代码来搬运。

这个Main函数用来显示开机图片以及进度条。

然后视串口接收信息运行带有USB下载NK的Eboot或是读取NK映像,启动WINCE系统。

最后:进入第三段代码。

这段代码用于通过USB将PC上的NK.nb0或NK.bin文件下载进NANDFLASH并运行。

可见,扬创公司光bootloader就分成了三个部分,即3个bin文件组成。

然后分别将这三段二进制代码下载进分别从block0,block2,block8(block12)开始的三块。

具体烧写手段采用老掉牙的giveio烧写,就是曾经大名鼎鼎的SJF2440了,相信不少嵌入式高手都用过,哈哈。

如果不小心将bootloader弄丢了,再重烧一片,得等上好几分钟,足够你到外面跑上几千米再回来这么长了。

尽管如此,我们的扬创公司仍然拿他们的代码当宝,死活不肯开源。

要知道对于买你们板子的人,都是来学习的呀!学习嵌入式系统,bootloader是最基础也是进入嵌入式行业的敲门砖,没有了代码,无疑给学习添加了很大的麻烦,而扬创官方回答却是:用户开发产品用不着修改bootloader.我看扬创没开发过东西,不了解行情。

不说这么多废话了,说多了无益,让我们一起来揭开bootloader的神秘的面纱吧!先说下我移植的bootloader的功能,以及烧录时间,和扬创的做下对比。

第一次下载bootloader到NANDFLASH的方法:方法一:通过扬创的老掉牙的方法,先在ADS1.2里面生成bootloader.bin文件,然后用SJF2440烧写工具,配合giveio将BIN文件烧写进从block0开始的块。

Linux内核分析及在S3C2440上移植过程

Linux内核分析及在S3C2440上移植过程

smdk_default_nand_part 结构如下修改:
使用以下命令启动 NAND Flash 上的内核。
static struct mtd_partition smdk_default_nand_
nboot 0x32000000 0 0
(4)顶层 Makefile 和 arch/¥(ARCH)/Makefile 设置了 可以影响所有文件的编译、连接选项:DFLAGS、AFLAGS、LD- FLAGS、ARFLAGS。
(5) 各级子目录下的 Makefile 中可以设置能够影响当 前目录下所有文件的编译、连接选项,如 EXTRA_CFLAGS 等, 还可以设置能影响某个文件的编译选项如 CFLAGS¥@ 等。
1.1 硬件平台 本文使用的是 mini2440,它采用 Samsung S3C2440 为 微处理器,主频 400MHz,最高 533Mhz,并采用专业稳定的 CPU 内核电源芯片和复位芯片来保证系统运行时的稳定性。 SDRAM 内存采用 32bit 数据总线,时钟频率高达 100MHz。 mini2440 的 PCB 采用沉金工艺的四层板设计,专业等长布 线,保证关键信号线的信号完整性。
文献标识码:A
文章编号:1671-4792-(2010)1-0173-03
Abstract: This article introduces Samsung's ARM9-based S3C2440 chip embedded Linux system transplant pro-
cess, and builds the basic ARM9-Linux development environment. Cutting and transplanting Linux kernel after

本文描述了将Linux移植到基于S3C2410处理器目标板上的方法与过程

本文描述了将Linux移植到基于S3C2410处理器目标板上的方法与过程

本文描述了将Linux移植到基于S3C2410处理器目标板上的方法与过程。

介绍了目标平台和Linux,并说明了如何搭建移植环境,着重介绍了Bootloader的架构和功能以及Linux内核的移植。

结果证明该方法是可行的。

移植后Linux 在嵌入式系统中运行良好。

关键词:嵌入式系统;移植;Linux内核;S3C2410处理器引言嵌人式系统就是以应用为中心、以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。

ARM嵌人式芯片是一种高性能、低功耗的RISC芯片。

它由英国ARM公司设计,世界上几乎所有的主要半导体生产商都生产基于ARM体系机构的通用芯片,或在其专用芯片中应用相关ARM技术。

在2001年基于ARM内核的处理器占市场份额的75%,成为业界的龙头。

Linux是免费发行的、快速高效的操作系统,Linux的出现在计算机世界引发了一场革命。

Linux操作系统以代码开放、功能强大又易于移植成为嵌入式操作新兴力量。

嵌人式Linux是按照嵌人式操作系统的要求设计的一种小型操作系统,由一个内核以及一些根据需要进行定制的系统模块组成。

其内核很小,一般只有几百kb,即使加上其他必要的模块和应用程序,所需的存储空间也很小。

它非常适合于移植到嵌入式系统中去,同时它具有多任务多进程的系统特征,有些还具有实时特征。

1 目标平台介绍文中使用的目标平台S3C2410是SAMSUNG公司使用920T处理器内核开发的一款嵌入式处理器。

S3C2410是Samsung公司专门为PDA、Intenet设备和手持设备等专门开发的微处理器。

该芯片还包含有16kB一体化的Cache/MMU,这一特性使开发人员能够将Linux和VXwork移植到基于该处理器的目标系统中。

该目标板的系统资源如下:(1)CPU:S3C2410微处理器,工作频率为200MHz。

(2)Flash:16MB。

(3)SDRAM:64MB SDRAM。

Linux系统在S3C2440上移植的分析与实现_李佳佳

Linux系统在S3C2440上移植的分析与实现_李佳佳

2
搭建自己的交叉编译环境
本文选择通过 crosstool 工具来实现一次编译生成
交叉编译工具链 , 该方法相对于通过分布编译 , 或者 安装编译工具所需的库和源代码来生成交叉编译工具 链的方法 , 其实现过程更简单 , 耗时更少 . 然而直接 使用网上制作好的工具链, 虽然简单省事但其灵活性 远远不及自己定制的工具链, 甚至有时出现编译器版
首先在 crosstool-0.43 目录下编辑 arm.dat 和 gcc-4.
lib_arm 和 lib_generic; 删除 include 目录下 asm-XXX
的文件, 只留下 asm-arm; 删除 include/configs 目录下 除 smdk2410.h 以外的其它所有配置头文件[2].
#!/bin/sh set–ex TARBALLS_DIR=$HOME$/downloads #定义工具链所存放的位置 RESULT_TOP=/home/dejaneli/crosstool #定义工具链的安装目录 export TARBALLS_DIR RESULT_TOP GCC_LANGUAGES=”c,c++” #定义支持 c, c++语言 export GCC_LANGUAGES mkdir–p $RESULT_TOP #创建/home/dejaneli/crosstool 目录 Eval‘cat arm.dat gcc-4.3.3-glibc-2.8.dat’sh all.sh– notest #编译工具链 echo Done 2.3 建立配置文件
arm.dat 中 的 “TARGET=arm-none-unkonwn-linux” 为 “TARGET=arm-linux”, 而 gcc-4.3.3-glibc-2.8.dat 的内

linux 2.6.22.1内核在s3c2410平台的移植(完美版)

linux 2.6.22.1内核在s3c2410平台的移植(完美版)

linux 2.6.22.1内核在s3c2410平台的移植(完美版)-------------------作者:无猫++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------bootloader编译环境:vivi版本:0.1.4交叉编译器(CROSS-COMPILE)版本:2.95.3(下载地址略:网上很多搜下。

)操作系统:Fedora 7======================================linux内核编译环境:内核版本:linux2.6.22.1交叉编译器(CROSS-COMPILE)版本:4.2.0(下载地址:/gnu_toolchains/arm/download.html)注意:下载选项,要选ARM EABI 的选项,和IA32 GNU/linux操作系统:Fedora 7======================================文件系统编译环境:busybox1.5.1,或1.4.2交叉编译器(CROSS-COMPILE)版本:3.3.2(下载地址:/pub/toolchain/)操作系统:Fedora 7----------------------------------------------硬件:板子是北京恒颐高科技术有限公司的H2410EB内存:64MB SDRAM(2×16M×16位);CPU:S3C2410 ARM处理器,Nor Flash:2MB的Nor Flash,用于固化测试程序(用来下载bootloader,内核,或文件系统);NANDflash: 64MB的Nand Flash,用于存储Bootloader、Linux内核及文件系统、应用程序和数据;++++++++++++++++++++++++++++++++++++++++++++++=================================================================== ===============================一:编译环境搭建=================================================================== ===============================一:搭建交叉编译环境说明:由于编译交叉编译环境比较繁琐,建议大家用已经编译好的交叉编译环境。

基于S3C2440的嵌入式Linux根文件系统构建

基于S3C2440的嵌入式Linux根文件系统构建

busybox 常被很形象 地 称 为嵌 入 式 Linux 系统 中 的 “瑞士
1 根文件
军刀”,因为它将许多常用的 UNIX 命令和工具结合到了 一 个 单独的可执行程序中。 虽然与相应的 GNU 工具比较,busybox
Linux 要 在 一 个 分 区 上 存 放 系 统 启 动 所 必 需 的 文 件 ,如 所提 供 的功 能 和 参数 略 少 ,但在 比 较 小的 系 统 或 者 嵌 入 式 系
基本的文件合称为根文件系统 ,它们存放在一个分区中[1]。
所有命令都通过“插件”的方式集中到一个可执行文件中,在
根文件系统一般包括:1) 基本的文件系统结构 , 包含一 实 际 应 用 过 程 中 通 过 不 同 的 符 号 链 接 来 确 定 到 底 要 执 行 哪
些必须的目录, 比如:/dev, /proc, /bin, /etc, /lib, /usr, /tmp; 个操作。 例如最终生成的可执行文件为 busybox,当为它建立
பைடு நூலகம்
在/home/work/rootby/etc 目录下存放各种配置文件。 这些
文件都是可选的, 它们依赖于系统中所拥有的应用程序,依
赖于 这 些程 序 是 否需 要 配 置文 件[4]。
4.1.1 创建 etc/inittab 文件
init 进 程 根 据/etc/inittab 文 件 来 创 建 其 他 子 进 程 , 比 如
方法具有很强的实用性,降低了嵌入式系统的开发门槛。
关键词: 根文件系统; Linux; S3C2440; busybox; ARM
中图分类号: TP316
文献标识码: A
文 章 编 号 :1674-6236(2010)06-0020-03

2440_Linux系统移植

2440_Linux系统移植

IT_2440Linux系统开发移植一.软硬件配置(1)目标板硬件环境CPU:S3C2440ALSDRAM:SamSung K4S561632HNand flash:K9F1208(64MB)以太网芯片:DM9000LCD:Toshiba LPM084P3638.4’接口:USB;PWM控制蜂鸣器;网络接口;UART;键盘(2)目标板软件环境Linux操作系统内核版本:Linux2.6.12Bootloader:优龙viviQtopia版本:1.7.0Qt版本:2.3.7内核交叉编译工具:ARM-Linux-GCC3.4.1Qtopia交叉编译工具:ARM-Linux–Gcc3.3.2Busybox编译版本:1.1.3二.开发流程B ootloader启动代码移植使用优龙的vivi启动代码操作步骤如下:1)将优龙的源代码拷贝到指定目录;C:\桌面\开发镜像\it24402)打开ADS v1.2编译软件,点击file→打开IT2440A_bios.mcp→打开nand.c3)修改Nand Flash的分配系统空间大小,如图(1)所示,找到结构体函数,static struck partition NandPart修改如下。

注意:修改后需要保存。

图(1)4)Nand flash映射到SDRAM中需要修改SDRAM导入的地址空间大小和载入的初始地址。

修改如下:(1)打开ADS v1.2编译软件,点击file→打开IT2440A_bios.mcp→打开u2440mon.c 修改如下:(2)打开ADS v1.2编译软件,点击file→打开IT2440A_bios.mcp→打开nand.c修改如下:对于NAND FLASH修改不光只是修改NAND FLASH对整个系统空间的分配大小,还要修改载入到SDRAM的地址和空间大小,大小要与NAND FLASH大小分配相匹配。

修改后才能载入nand flash分配空间大小。

2440内核移植与yaffs文件系统制作

2440内核移植与yaffs文件系统制作

开发板:FL2440交叉编译工具:arm-linux-gcc-3.3.2编译平台:rhel-server-6.0Linux内核:linux-2.6.28.7busybox-1.1.3文件系统:Yaffs2文件系统制作工具:/linux/mkyaffs2image.tgz内核制作1.给内核打上补丁,使内核对yaffs2文件系统支持。

下载最新的驱动/cgi-bin/viewcvs.cgi/yaffs2.tar.gz?view=tar解压yaffs2和linux-2.6.28.7放在同一根目录,执行:tar zxvf yaffs2.tar.gzcd yaffs2./patch-ker.sh c ../linux-2.6.28.7成功后打印信息:Updating /file/fl/linux-2.6.28.7/fs/KconfigUpdating /file/fl/linux-2.6.28.7/fs/Makefile2.修改机器码。

进入内核目录,修改机器码跟bootloader的机器码一致(FL2440为193)[root@ localhost linux-2.6.28.7]#vi arch/arm/tools/mach-types首先删除以下行:s3c2410 ARCH_S3C2410 S3C2410 182然后将以下行:s3c2440 ARCH_S3C2440 S3C2440 362修改为:s3c2440 ARCH_S3C2440 S3C2440 1933.指定目标板machine、编译器和编译器路径。

修改Makefile文件,注意将CROSS_COMPILE对应到你系统中交叉编译器地址[root@ localhost linux-2.6.28.7]# vi Makefile将两行:ARCH ?= $(SUBARCH)CROSS_COMPILE ?=修改为以下两行:ARCH ?= armCROSS_COMPILE ?=/usr/local/arm/3.3.2/bin/arm-linux-4.增加devfs文件管理器的支持。

yaffs2制作教程

yaffs2制作教程

Yaffs2根文件系统制作环境:交叉编译环境:4.3.3 (天嵌科技提供,存放路径/opt/EmbedSky/4.3.3)开发平台:TQ24401,编译busybox获取busybox源码busybox-1.17.2.tar (/downloads/)置于目录/opt/embed下#tar jxvf busybox-1.17.2.tar.bz2#cd busybox-1.17.2#vim Makefile将164行改为CROSS_COMPILE = arm-linux- 将190行改为ARCH = arm 保存推出进入配置菜单#make menuconfig 采用默认配置保存推出#make#make install在busybox-1.17.2的根目录下出现了一个_install目录在该目录下又有三个目录文件bin sbin usr 和一个链接文件 linuxrc 。

2,创建根文件系统必要的目录回到/opt/embed目录下创建根文件系统必要的目录#mkdir root_fs#cd root_fs将刚才生成的三个目录bin sbin usr和一个链接文件linuxrc考到目录root_fs下#cp -rf ../busybox-1.17.2/_install/* ./#mkdir dev etc home lib mnt opt proc root sys tmp var创建几个必要的二级目录#mkdir usr/lib usr/share#mkdir etc/rc.d#mkdir var/lib var/lock var/run var/tmp3,创建必要文件(1), 获取库文件 (我的交叉编译工具链放在目录 /opt/EmbedSky/下的)#cp -rf /opt/EmbedSky/4.3.3/arm-none-linux-gn?i/libc/armv4t/lib/* so* lib -a(2),将主机 etc 目录下的passwd、group、shadow文件拷贝到 root_fs/etc 目录下#cp -f /etc/passwd /etc/group /etc/shadow etc将目录/opt/embed/busybox-1.17.2/examples/bootfloppy/etc下的所有文件拷贝到root_fs/etc下。

学位论文—基于s3c2440的嵌入式linux操作系统内核研究

学位论文—基于s3c2440的嵌入式linux操作系统内核研究

学校代码:11059学号:0805070285Hefei University毕业论文(设计)BACH ELOR DISSERTATI ON论文题目:基于S3C2440的嵌入式LINUX操作系统内核研究学位类别:工学学士学科专业:自动化作者姓名:郭辉导师姓名:干开峰完成时间:2012年5月12号基于S3C2440的嵌入式LINUX操作系统内核研究中文摘要嵌入式Linux是以Linux为基础的嵌入式操作系统,可应用于多种硬件平台,是一个和Unix相似、以内核为基础的、具有完全的内存访问控制,支持大量硬件等特性的一种通用操作系统。

它能够适应对工业控制领域高实时性的要求,被广泛应用在移动电话、个人数字助理、媒体播放器、消费性电子产品以及航空航天等领域中。

本课题是以GT2440开发板为平台来研究Linux操作系统的内核,GT2440采用高主频高性能的SamsungS3C2440A处理器作为主控芯片,接口资源丰富,具有通用性。

主要完成Nand Flash驱动、LCD驱动、CS8900A网卡驱动、UDA1341声卡驱动、触摸屏驱动、SD卡驱动、RTC驱动和USB驱动等移植实现。

最后把移植的内核文件下载到GT2440开发板进行测试,测试结果验证了内核移植的正确性。

关键词:嵌入式系统;S3C2440;Linux内核移植;驱动移植Study of Embedded Linux Operating System Kernel Based on S3C2440AbstractEmbedded Linux is a embedded operating system based on Linux, which can be applied to a variety of hardware platforms, with full memory access control, supporting for a lot of hardware features. It can adapt to real-time requirements on the field of industrial control, it is widely used in mobile phones, personal digital assistants, media players, consumer electronics, and aerospace and other fields.The kernel of the Linux operating system is studied based on the GT2440 in the topic, the GT2440 uses high frequency and high-performance SamsungS3C2440A processor as the master chip, whose interface is rich in resources and versatile. Primarily the transplanting of NandFlash drive,LCD driver,CS8900A LAN Driver,UDA1341 sound card driver, touch screen driver, SD card driver, RTC driver and USB driver are finished. Finally, the kernel file transplanted is downloaded to the GT2440 development board for testing, and the test results verify the correctness of the kernel transplantation.KEY WORD: Embedded system;S3C2440;Linux kernel porting;Drive transplant目录第一章前言 (1)1.1 嵌入式系统简介 (1)1.2 嵌入式操作系统概述 (2)1.3 章节安排 (2)第二章开发环境搭建 (3)2.1 硬件平台 (3)2.2 交叉开发环境 (6)2.2.1 交叉开发环境简介 (6)2.2.2 交叉编译环境的建立 (6)第三章嵌入式Linux内核移植实现 (8)3.1 嵌入式Linux内核概述 (8)3.2 嵌入式Linux内核移植实现 (10)3.2.1 移植准备工作 (10)3.2.2 CS8900A网卡驱动移植 (11)3.2.3 UDA1341声卡驱动移植 (15)3.2.4 触摸屏驱动移植 (16)3.2.5 Nand Flash驱动移植 (18)3.2.6 yaffs2文件系统的支持 (20)3.2.7 LCD驱动的移植 (21)3.2.8 RTC驱动移植 (22)3.2.9 USB驱动移植 (22)第四章系统的功能测试 (24)4.1 测试准备 (24)4.2 CS8900A网卡测试 (24)4.3 UDA1341测试 (24)4.4 触摸屏测试 (25)4.5 LCD测试 (25)4.6 RTC实时时钟测试 (26)4.7 USB驱动测试 (26)第五章总结 (28)参考文献 (29)致谢 (30)第一章前言1.1嵌入式系统简介根据IEEE的定义,嵌入式系统是控制、监视或者辅助装置、机器和设备运行的装置。

基于S3C2440的嵌入式Linux系统移植_李文

基于S3C2440的嵌入式Linux系统移植_李文
Vivi是韩国 Mizi公司开发的一款针对 ARM9处 理 器的 BootLoader[ 6] 。实 验中 使用 的 BootLoader是 2440bootV5-Vivi的 改 版 。 它的 运 行 原 理 与 Vivi一 样 , 由于目 标板 的硬 件 配置 不同 , 进 行了 相 应 的修 改 。在对 Vivi进行了 必要的 修改和重 新配置 后 , 执 行 “ make”命 令 进 行 编 译 , 编 译 通过 后 [ 6] , 将 BootLoader烧写到 开发 板 NANDFlash分区 。烧 写 方法 有两种 , 一种是用 sjf2440.exe通过 JTAG烧写 , 另一 种方法是 用 AXD通 过 JTAG或者 JLINK用 USB烧 写 。选用第一种方法 , 过程如下 :
研究与应用 化Co工nt自rol动an化d及In仪str表um,en2ts01in0,Ch3e7m(i9c)al:8In8 d~u s9t2ry
基于 S3C2440的嵌入式 Linux系统移植
李 文 , 张建泽
(大连交通大学 软件学院 , 辽宁 大连 116028)
/* 实验中一个 128 MB的 NandFlash按如下大小填写分 区信息 * / /* NANDController* / staticstructmtdpartitionsmdkdefaultnandpart[ ] ={ [ 0] ={ .name="Boot", .size= 0x00020000, .offset= 0, }, [ 1] ={ .name="MyApp", .size= 0x00380000, .offset= 0x00180000, }, [ 2] ={ .name="Kernel", .size= 0x00300000, .offset= 0x00500000, }, [ 3] ={ .name="fsyaffs", .size= 0x03c00000,

在S3C2410上移植yaffs2文件系统

在S3C2410上移植yaffs2文件系统

在S3C2410上移植yaffs2文件系统在S3C2410上移植yaffs2文件系统当然如果你的NAND FLASH只是512+16B的,可以只移植yaffs,因为即使你移植了yaffs2,它也会自动选择挂载yaffs1的。

#cd/public#tar zxf yaffs2.tar.gz则/public/yaff2/目录之下即是yaffs2的源码。

(2)在要移植的内核目录下建立yaffs2文件夹,并将需要的文件拷贝过来:#cd/public/linux-2.6.11.7-2410/#cd fs#mkdir yaffs2#cd yaffs2#cp/public/yaffs2/*.h.#cp/public/yaffs2/*.c.#cp/public/yaffs2/Makefile-kernel Makefile#cp/public/yaffs2/Kconfig.(3)修改/public/linux-2.6.11.7-2410/fs/Makefile和Kconfig文件。

#cd/public/linux-2.6.11.7-2410/fs/#vi Makefile(将下面一行添加到Makefile中)obj-$(CONFIG_YAFFS_FS)+=yaffs2/#vi Kconfig(将下面一行添加到Kconfig中)source&quot;fs/yaffs2/Kconfig(4)cd/public/linux-2.6.11.7-2410/make menuconfig在编译内核时选择:&lt;*&gt;YAFFS2file system support&lt;*&gt;512byte/page devices&lt;*&gt;Lets Yaffs do its own ECC&lt;*&gt;2048byte(or larger)/page devices&lt;*&gt;Autoselect yaffs2format&lt;*&gt;Disable lazy loading&lt;*&gt;Turn off wide tnodes&lt;*&gt;Turn off debug chunk erase check(5)编译内核make zImage看网上有人编译过程中出现了问题,我没有碰到任何问题,很顺利。

基于S3C2440的Linux操作系统移植论文

基于S3C2440的Linux操作系统移植论文

本科毕业设计题目基于S3C2440的Linux操作系统移植目录摘要 (I)Abstract (II)前言 (III)1 嵌入式linux简介 (1)1.1 linux发展概述 (1)1.2 linux的优点 (1)1.3 Linux 应用领域 (2)1.4 Linux系统安装 (3)1.4.1 虚拟机安装 (3)1.4 .2 Linux安装 (6)1.5 Linux常用工具 (7)1.5.1 文本编辑器 (7)1.5.2 软件包管理 (8)1.6 Linux的常用命令 (8)2 ARM体系结构介绍 (14)2.1 ARM体系结构的发展 (14)2.2 ARM处理器简介 (15)2.2.1 ARM7处理器系列 (15)2.2.2 ARM9处理器系列 (15)2.2.3 ARM9E处理器系列 (15)2.2.4 ARM11处理器 (16)2.2.5 Cortex处理器 (16)2.3 s3c2440主要特性 (16)2.4 s3c2440存储器控制器 (17)2.4.1 S3C2440存储控制器特性 (17)2.4.2 SDRAM原理分析 (19)2.4.3 FLASH (19)3 Bootloader原理分析和移植 (21)3.1 Bootloader概述 (21)3.2 Bootloader功能 (21)3.3 常用Bootloader (22)3.4.Uboot移植实现 (22)3.4.1 建立交叉编译环境 (22)3.4.2 分析U-boot目录结构 (24)3.4.3 uboot编译方法 (25)4 操作系统核的的移植 (26)4.1 Linux核的作用 (26)4.2 Linux核的目录结构 (27)4.3 核文件类型 (28)4.3.1 Makefile (28)4.3.2 .config (29)4.3.3 kconfig (29)4.4 配置工具 (29)4.5 Linux核启动过程 (31)4.5.1 汇编代码执行阶段 (31)4.5.2 c 语言代码阶段 (31)4.6移植最小核 (33)5文件系统分析与制作 (38)5.1 文件系统概述 (38)5.1.1嵌入式文件系统介绍 (38)5.1.2 基于FLASH的文件系统 (38)5.2 文件系统目录结构 (40)5.3 配置编译busy-box (42)5.3.1 busybox简介 (42)5.3.2 安装busybox (42)5.4 制作yaffs根文件系统 (43)5.4.1 构建框架 (43)5.4.2 添加容 (44)6 核驱动 (45)6.1 设备驱动程序的概述 (45)6.2设备驱动程序的功能 (45)6.3设备驱动程序的结构 (45)6.4 设备驱动程序开发过程 (46)6.4.1设备驱动程序的开发流程 (46)6.4.2 模块化驱动程序设计 (47)6.5 串口驱动移植 (48)6.6 LCD驱动移植 (49)结论 (54)致 (55)参考文献 (56)基于S3C2440的Linux操作系统移植摘要随着电子产业的发展和智能时代的到来,嵌入式产品以其个性化定制的特点已经深入发展到各个领域。

基于S3C2440的嵌入式Linux内核设计

基于S3C2440的嵌入式Linux内核设计

Computer Knowledge and Technology 电脑知识与技术计算机工程应用技术本栏目责任编辑:梁书第7卷第9期(2011年3月)基于S3C2440的嵌入式Linux 内核设计陈平,李晖(济源职业技术学院,河南济源454650)摘要:该文介绍了三星公司的基于ARM9内核S3C2440芯片嵌入式Linux 系统设计。

在确认已经移植好的U-boot 的基础上,进行控制模块基于ARM9的Linux 嵌入式系统设计方案,裁剪并移植Linux 内核。

关键词:S3C2440;U-boot ;Linux 内核中图分类号:TP311文献标识码:A 文章编号:1009-3044(2011)09-2159-03The Design of Embedded Linux Kernel Based on S3C2440CHEN Ping,LI Hui(College of Jiyuan Vocational Technical,Jiyuan 454650,China)Abstract:This paper introduces the embedded linux design of Samsung S3C2440which based on ARM9core.With confirming the U-boot is transplanted successful,carry out the design plan of embedded linux whose control module is based on ARM9,clip and transplant linux kernel.Key words:S3C2440;U-boot;Linux kernel嵌入式系统是当前最热门最有发展前途的IT 应用领域之一,像常见到的手机、PDA 、机顶盒、高清电视(HDTV)、路由器、汽车电子、智能家电、医疗仪器、航天航空设备等等都是典型的嵌入式系统。

内核移植总结s3c2440

内核移植总结s3c2440

内核移植09号王萍一:为什么做内核移植?因为硬件的不同才做移植,那么与硬件相关的目录是arch和driver目录Arch目录:内核所支持的每种cpu(处理器,而不是操作系统)体系,在该目录下都有对应的子目录,每个子目录下又分有boot、mm、kernel、还有一些mach开头的目录(是与开发板相关的)Drivers:设备驱动程序Include:内核所需要的头文件,与平台无关的头文件在include/linux下,与平台有关的则放在相应的子目录下二:明白我要移植的目标系统的体系架构我要往mini2440开发板上移植内核,其是ARM9的处理器三:做移植前的准备工作下载linux内核的源代码linux-2.6.37.tar.bz2()工具m kimage(是u-boot生成的,在u-boot下的/tools下。

zImage是编译Linux内核产生的,uImage是u-boot中烧写的内核压缩映象,我们需要先下载测试)四:开始1.解压源代码#tar -jxvflinux-2.6.37.tar.bz2#cd linux-2.6.37最好先执行make distclean(确保我们即将编译的内核代码未经任何修改)2. 修改Makefile(内核根目录下)ARCH ?=arm //体系架构CROSS_COMPILE ?=arm-linux- //这个是交叉编译工具保存退出3. 内核的配置内核配置通常在一个已有的配置文件基础上,通过一定的修改得到新的配置文件,此处我们的配置文件是arch/arm/configs/mini2440_defconfig,所以我们只需要拷贝它到内核根目录下(cp arch/arm/configs/mini2440_defconfig .config)再make menuconfig进行一些配置(自己根据需要进行选择,此时它会使用这个.config),保存修改退出4.编译内核Make(会根据.config里的选中的内容开始编译内核)不出错的话,生成的内核文件在arch/arm/boot5.生成我们要测试的uImage(放到arch/arm/boot下)./mkimage -A arm -T kernel -C none -O linux -a 0x30008000 -e 0x30008040 -d zImage -n 'wp_Linux' uImage将生成的uImage放到windows下五:下载内核测试首先设置dnw的下载地址为0x30008000,然后在u-boot中执行:说明:我的开发板上的u-boot大小为312K的,所以(bootargs,bootcmd)bootargs“noinitrd root=/dev/mtdblock3 init=/linuxrc console=tty0 console=ttySAC0,115200”bootcmd“nand read 0x30008000 0x80000 0x300000;bootm”(从内存启动)#usbslave(在dnw中选择要我的uImage)#bootm(会出现内核启动失败(Kernel panic),出现的原因是没有添加Yaffs驱动)解决方法:a)调整内核中Nand Flash分区(可从nand启动)分区划分在文件arch/arm/mach-s3c2440/mach-mini2440.c中。

最新内核linux2.6.33内核成功移植s3c2410详细过程

最新内核linux2.6.33内核成功移植s3c2410详细过程

S3C2410的Linux2.6.33内核移植以及搭建交叉编译环境作者:邯郸学院嵌入式专业胡峰 整理于2010-3-13嵌入式实验室所需软件以及工具:w mwar e workstation 虚拟机 小红帽linux gimp-2.6.4-i686-setup.exe (用于后期的logo 画面转换)F lashFX P.exe (也可直接用虚拟机直接挂在访问)viv ioflinux2.6.30.5.tar .gz (vi 移植) root1.9oflinux2.6.30.5.tar.gz (root 移植)ar m-linux-gcc-3.4.1.tar .bz2和armv4l-tools-2.95.2.tar.bz2(交叉编译器)步骤一:搭建交叉编译环境1:启动虚拟机进入linux 安装好虚拟机的共享工具 wmtool 具体做法大家应该都会 不在一一列举了。

2:arm-linux-gcc-3.4.1.tar.bz2和armv4l-tools-2.95.2.tar.bz2拷贝到虚拟机中 进行安装,两个编译器其实都一样只不过版本高低不同,因为2.6.33是最新版本 我们不知道用何种版本的gcc 所以先装两个,后来经过试验发现 高版本的arm-linux-gcc-3.4.1.tar.bz2可以编译kernel ,低版本的armv4l-tools-2.95.2.tar.bz2可以编译vivi ,解压当前文件夹命令$ tar jxvf arm-linux-gcc-3.4.1.tar -C /$ tar jvxf arm v4l-tools-2.95.2.tar.bz2 -C /步骤二:vivi 移植1:修改vi vi/Ma kefile 文件 ARCH ?=arm25 行:CROSS_COMPILE ? = /opt/host/armv4l/bin/arm v4l-unknown-linux- 如图:2:按照自己的需求自定义mtd 分区,修改arch/s3c2410/smdk.c 文件 修改 NAND flash 分区如下:mtd_partition_t default_mtd_partitions[] = { {name: "vivi", offset: 0,size: 0x00020000,flag: 0 }, {name: "param", offset: 0x00020000, size: 0x00010000,编辑文件arch/arm/plat-s3c24xx/common-smdk.cstatic struct mtd_partition smdk_default_nand_part[] = { [0] = {.name = "vivi",.size = 0x00020000,.offset = 0,}, [1] = {.name = "param", .offset = 0x00020000, .size = 0x00010000, },[2] = {Default kernel command string 命令 param set linux_cmd_line改成: noinitrd root=/de v/mtdbl ock3 init=/linuxrc console=ttySAC0,115200选中YAFFS2 file ststem support 以支持yaffs其余按默认配置8、执行make zImage,在arch/arm/boot目录下将生成一个zImage的文件步骤三:cs8900移植sc24101修改drive rs/net/arm/Makefile文件添加:obj-$(CONFIG_ARM_CS8900) += cs8900.o2,修改dri vers/net/arm/Kconfig文件添加:config ARM_CS8900tristate "CS8900 support"depends on NET_ETHERNET && ARM && AR CH_SMDK2410helpSupport for CS8900A chipset based Ethernet cards. If you ha ve a network (Ethernet) card of this type, say Y and read the Ethernet-HOWTO,a vailable from as well as .To compile this driver as a module, choose M here and read .The module will be called cs8900.o.3,编译配置内核# make menuconfigDevice Dri vers --->[*] Network de vice support --->[*] Ethernet (10 or 100Mbit) ---><*> CS8900 support4,修改arch/arm/mach-s3c2410/mach-smdk2410.c文件static struct map_desc smdk2410_iodesc[] __initdata最后添加:{vSMDK2410_ETH_IO, pSMDK2410_ETH_IO, SZ_1M, MT_DEVICE}5,修改arch/arm/mach-s3c2410/include/mach/map.h 文件增加:/* CS8900 */#define pSMDK2410_ETH_IO __phys_to_pfn(0x19000000)#define vSMDK2410_ETH_IO 0xE0000000 #define SMDK2410_ETH_IRQ IRQ_EINT96.把以下两个文件cs8900.c cs8900.h 添加进dri vers/net/arm/内,然后编译内核。

#SC的Linux内核移植和yaffs文件系统制作

#SC的Linux内核移植和yaffs文件系统制作

基于S3C2440地Linux内核移植和yaffs2文件系统制作 [ARM]第一章移植内核1.1 Linux内核基础知识1.1.1 Linux版本1.1.2 什么是标准内核1.1.3 Linux操作系统地分类1.1.4 linux内核地选择1.2 Linux内核启动过程概述1.2.1 Bootloader启动过程1.2.2 Linux启动过程1.3 Linux内核移植1.3.1 移植内核和根文件系统准备工作1.3.2 修改Linux源码中参数1.3.3 配置Linux内核1.3.4、编译内核第二章制作根文件系统2.1 根文件系统预备知识2.2、构建根文件按系统2.2.1、建立根文件系统目录2.2.2、建立动态链接库2.2.3 交叉编译Bosybox2.2.4 建立etc目录下地配置文件2.2.5 制作根文件系统映像文件第三章启动系统第四章总结第一章移植内核1.1 Linux内核基础知识在动手进行Linux内核移植之前,非常有必要对Linux内核进行一定地了解,下面从Linux内核地版本和分类说起.1.1.1 Linux版本Linux内核地版本号可以从源代码地顶层目录下地Makefile中看到,比如2.6.29.1内核地其中地“VERSION”和“PATCHLEVEL”组成主版本号,比如2.4、2.5、2.6等,稳定版本地德主版本号用偶数表示(比如2.6地内核>,开发中地版本号用奇数表示(比如2.5>,它是下一个稳定版本内核地前身.“SUBLEVEL”称为次版本号,它不分奇偶,顺序递增,每隔1~2个月发布一个稳定版本.“EXTRA VERSION”称为扩展版本号,它不分奇偶,顺序递增,每周发布几次扩展本版号.1.1.2 什么是标准内核按照资料上地习惯说法,标准内核(或称基础内核>就是指主要在维护和获取地内核,实际上它也有平台属性地.这些linux内核并不总是适用于所有linux支持地体系结构.实际上,这些内核版本很多时候并不是为一些流行地嵌入式linux系统开发地,也很少运行于这些嵌入式linux系统上,这个站点上地内核首先确保地是在Intel X86体系结构上可以正常运行,它是基于X86处理器地内核,如对linux-2.4.18.tar.bz2地配置make menuconfig时就可以看到,Processor type and features--->中只有386、486、586/K5/5x86/6x86/6x86MX、Pentium-Classic、Pentium-MMX、Pentium-Pro/Celeron/Pentium-II、Pentium-III/Celeron(Coppermine>、Pentium-4、K6/K6-II/K6-III 、Athlon/Duron/K7 、Elan 、Crusoe、Winchip-C6 、Winchip-2 、Winchip-2A/Winchip-3 、CyrixIII/C3 选项,而没有类似Samsun 2410等其他芯片地选择.如果需要用在其他特定地处理器平台上就需要对内核进行打补丁,形成不同地嵌入式内核.实际上,不同处理器系统地内核下载站点中提供地也往往是补丁patch而已,故原x86平台上地内核变成了基础内核,也被称为标准内核了.1.1.3 Linux操作系统地分类第一层次分类:以主要功能差异和发行组织区分(基础linux系统/内核>.1、标准linux2、μClinux无MMU支持地linux系统,运行在无MMU地CPU上.3、Linux-RT是最早在linux上实现硬实时支持地linux发行版本.4、Linux/RTAI支持硬实时地linux,于RT-linux最大地不同之处在于RTAI定义了RTHAL,它将RTAI需要在linux中修改地部分定义成一组API接口,RTAI只使用API接口与linux交互.5、Embedix由Lineo公司开发,基于PowerPC和x86平台开发地.6、Blue Cat Linux7、Hard Hat Linux8、其他第二层分类:以应用地嵌入式平台区分(嵌入式linux系统/内核,使上面第一类中地各种linux系统扩展为对特定目标硬件地支持,成为一种具体地嵌入式linux系统>因为嵌入式系统地发展与linux内核地发展是不同步地,所以为了要找一个能够运行于目标系统上地内核,需要对内核进行选择、配置和定制.因为每一种系统都是国际上不同地内核开发小组维护地,因此选择linux内核源码地站点也不尽相同.第二层分类中地linux系统/内核相对于第一层分类地标准内核来说,也可以称为嵌入式linxu 系统/内核.如应用在ARM平台上地嵌入式Linux系统通常有arm-linux(常运行在arm9平台上>,μClinux(常用在arm7平台上>,在标准linux基础上扩展对其他地平台地支持往往通过安装patch实现,如armlinux就是对linux安装rmk补丁(如patch-2.4.18-rmk7.bz2>形成地,只有安装了这些补丁,内核才能顺利地移植到ARM Linux上.也有些是已经安装好补丁地内核源码包,如linux-2.4.18-rmk7.tar.bz2.不同处理器系统地内核/内核补丁下载站点:这些站点不仅仅是linux内核站点,它们可能直接提供了针对你地目标硬件系统地linux内核版本.1.1.4 linux内核地选择选择内核版本是很困难地,应该与负责维护该内核地小组保持联系,方法是通过订阅一些合适地邮件列表<maillist)并查看邮件中相关地重要新闻,以及浏览一些主要站点,可以得到该内核地最新发展动态.如针对ARM地Linux内核,可以访问并订阅该网站上提供地maillist就可以了.如果觉得查阅邮箱中地邮件列表耗费太多时间,那么至少每周访问所关心地内核网站,并阅读Kernel Traffic提供地过去一周中在内核邮件清单中发生地重要地摘要,网址为这样就可以得到相关Linux内核地最新信息.并不是Linux地每个版本都适合ARM-Linux地移植,可以加入其邮件列表<maillist)以获得内核版本所支持硬件地相关信息,表中列出地资源可以帮助你找到哪些没有列出地功能可以被你地系统支持.ARM Linux地移植,建议使用 2.4.x或 2.6.x版本.Linux内核补丁可以到ARM Linux地ftp<)下载.1.2 Linux内核启动过程概述一个嵌入式 Linux 系统从软件角度看可以分为四个部分:引导加载程序<Bootloader),Linux 内核,文件系统,应用程序.其中Bootloader是系统启动或复位以后执行地第一段代码,它主要用来初始化处理器及外设,然后调用Linux 内核.Linux 内核在完成系统地初始化之后需要挂载某个文件系统做为根文件系统<Root Filesystem).根文件系统是 Linux 系统地核心组成部分,它可以做为Linux 系统中文件和数据地存储区域,通常它还包括系统配置文件和运行应用软件所需要地库.应用程序可以说是嵌入式系统地“灵魂”,它所实现地功能通常就是设计该嵌入式系统所要达到地目标.如果没有应用程序地支持,任何硬件上设计精良地嵌入式系统都没有实用意义.1.2.1 Bootloader启动过程Bootloader在运行过程中虽然具有初始化系统和执行用户输入地命令等作用,但它最根本地功能就是为了启动 Linux 内核.1 、Bootloader地概念和作用Bootloader是嵌入式系统地引导加载程序,它是系统上电后运行地第一段程序,其作用类似于PC 机上地BIOS.在完成对系统地初始化任务之后,它会将非易失性存储器<通常是Flash或DOC等)中地Linux 内核拷贝到 RAM 中去,然后跳转到内核地第一条指令处继续执行,从而启动Linux 内核.由此可见,Bootloader 和Linux 内核有着密不可分地联系,要想清楚地了解Linux内核地启动过程,我们必须先得认识Bootloader地执行过程,这样才能对嵌入式系统地整个启动过程有清晰地掌握.2 、Bootloader地执行过程不同地处理器上电或复位后执行地第一条指令地址并不相同,对于ARM 处理器来说,该地址为0x00000000.对于一般地嵌入式系统,通常把Flash 等非易失性存储器映射到这个地址处,而Bootloader就位于该存储器地最前端,所以系统上电或复位后执行地第一段程序便是Bootloader.而因为存储Bootloader地存储器不同,Bootloader地执行过程也并不相同,下面将具体分析.嵌入式系统中广泛采用地非易失性存储器通常是Flash,而Flash 又分为Nor Flash 和Nand Flash 两种.它们之间地不同在于:Nor Flash 支持芯片内执行<XIP, eXecute In Place),这样代码可以在Flash上直接执行而不必拷贝到RAM中去执行.而Nand Flash并不支持XIP,所以要想执行 Nand Flash 上地代码,必须先将其拷贝到 RAM中去,然后跳到 RAM 中去执行.3、Bootloader地功能实际应用中地Bootloader根据所需功能地不同可以设计得很复杂,除完成基本地初始化系统和调用 Linux 内核等基本任务外,还可以执行很多用户输入地命令,比如设置 Linux 启动参数,给Flash 分区等;也可以设计得很简单,只完成最基本地功能.但为了能达到启动Linux 内核地目地,所有地 Bootloader都必须具备以下功能:(1>、初始化 RAM因为Linux 内核一般都会在 RAM 中运行,所以在调用Linux 内核之前bootloader 必须设置和初始化 RAM,为调用 Linux内核做好准备.初始化 RAM 地任务包括设置CPU 地控制寄存器参数,以便能正常使用 RAM 以及检测RAM 大小等.(2>、初始化串口串口在Linux 地启动过程中有着非常重要地作用,它是Linux内核和用户交互地方式之一.Linux 在启动过程中可以将信息通过串口输出,这样便可清楚地了解 Linux 地启动过程.虽然它并不是Bootloader 必须要完成地工作,但是通过串口输出信息是调试Bootloader 和Linux 内核地强有力地工具,所以一般地Bootloader 都会在执行过程中初始化一个串口做为调试端口.(3>、检测处理器类型Bootloader在调用Linux内核前必须检测系统地处理器类型,并将其保存到某个常量中提供给 Linux 内核.Linux 内核在启动过程中会根据该处理器类型调用相应地初始化程序. (4>、设置 Linux启动参数Bootloader在执行过程中必须设置和初始化Linux 地内核启动参数.目前传递启动参数主要采用两种方式:即通过struct param_struct 和struct tag<标记列表,tagged list)两种结构传递.struct param_struct 是一种比较老地参数传递方式,在2.4 版本以前地内核中使用较多.从2.4 版本以后Linux 内核基本上采用标记列表地方式.但为了保持和以前版本地兼容性,它仍支持 struct param_struct 参数传递方式,只不过在内核启动过程中它将被转换成标记列表方式.标记列表方式是种比较新地参数传递方式,它必须以A TAG_CORE 开始,并以ATAG_NONE 结尾.中间可以根据需要加入其他列表.Linux内核在启动过程中会根据该启动参数进行相应地初始化工作.(5>、调用 Linux内核映像Bootloader完成地最后一项工作便是调用 Linux内核.如果 Linux 内核存放在 Flash 中,并且可直接在上面运行<这里地Flash 指Nor Flash),那么可直接跳转到内核中去执行.但因为在Flash 中执行代码会有种种限制,而且速度也远不及RAM 快,所以一般地嵌入式系统都是将Linux内核拷贝到 RAM 中,然后跳转到 RAM 中去执行.不论哪种情况,在跳到Linux 内核执行之前CPU地寄存器必须满足以下条件:r0=0,r1=处理器类型,r2=标记列表在 RAM中地地址.1.2.2 Linux启动过程在Bootloader将 Linux 内核映像拷贝到 RAM 以后,可以通过下例代码启动 Linux 内核:call_linux(0, machine_type, kernel_params_base>.其中,machine_tpye 是Bootloader检测出来地处理器类型, kernel_params_base 是启动参数在RAM 地地址.通过这种方式将 Linux 启动需要地参数从 bootloader传递到内核.Linux 内核有两种映像:一种是非压缩内核,叫Image,另一种是它地压缩版本,叫zImage.根据内核映像地不同,Linux 内核地启动在开始阶段也有所不同.zImage 是 Image经过压缩形成地,所以它地大小比Image 小.但为了能使用zImage,必须在它地开头加上解压缩地代码,将zImage 解压缩之后才能执行,因此它地执行速度比Image 要慢.但考虑到嵌入式系统地存储空容量一般比较小,采用zImage 可以占用较少地存储空间,因此牺牲一点性能上地代价也是值得地.所以一般地嵌入式系统均采用压缩内核地方式.对于ARM 系列处理器来说,zImage 地入口程序即为 arch/arm/boot/compressed/head.S.它依次完成以下工作:开启MMU 和Cache,调用decompress_kernel(>解压内核,最后通过调用call_kernel(>进入非压缩内核 Image 地启动.下面将具体分析在此之后 Linux 内核地启动过程.1、 Linux内核入口Linux 非压缩内核地入口位于文件/arch/arm/kernel/head-armv.S 中地stext 段.该段地基地址就是压缩内核解压后地跳转地址.如果系统中加载地内核是非压缩地Image,那么bootloader将内核从Flash中拷贝到RAM 后将直接跳到该地址处,从而启动Linux 内核.不同体系结构地Linux 系统地入口文件是不同地,而且因为该文件与具体体系结构有关,所以一般均用汇编语言编写.对基于ARM 处理地Linux 系统来说,该文件就是head-armv.S.该程序通过查找处理器内核类型和处理器类型调用相应地初始化函数,再建立页表,最后跳转到start_kernel(>函数开始内核地初始化工作.检测处理器内核类型是在汇编子函数__lookup_processor_type中完成地.通过以下代码可实现对它地调用:bl __lookup_processor_type.__lookup_processor_type调用结束返回原程序时,会将返回结果保存到寄存器中.其中r8 保存了页表地标志位,r9 保存了处理器地ID 号,r10 保存了与处理器相关地stru proc_info_list 结构地址.检测处理器类型是在汇编子函数__lookup_architecture_type 中完成地.与__lookup_processor_type类似,它通过代码:“bl __lookup_processor_type”来实现对它地调用.该函数返回时,会将返回结构保存在 r5、r6 和 r7 三个寄存器中.其中 r5 保存了 RAM 地起始基地址,r6 保存了 I/O基地址,r7 保存了 I/O地页表偏移地址.当检测处理器内核和处理器类型结束后,将调用__create_page_tables 子函数来建立页表,它所要做地工作就是将RAM 基地址开始地 4M 空间地物理地址映射到 0xC0000000 开始地虚拟地址处.对笔者地 S3C2410 开发板而言,RAM 连接到物理地址0x30000000 处,当调用__create_page_tables 结束后0x30000000 ~0x30400000 物理地址将映射到0xC0000000~0xC0400000 虚拟地址处.当所有地初始化结束之后,使用如下代码来跳到 C 程序地入口函数 start_kernel(>处,开始之后地内核初始化工作:b SYMBOL_NAME(start_kernel>2 、start_kernel函数start_kernel是所有Linux 平台进入系统内核初始化后地入口函数,它主要完成剩余地与硬件平台相关地初始化工作,在进行一系列与内核相关地初始化后,调用第一个用户进程-init 进程并等待用户进程地执行,这样整个 Linux 内核便启动完毕.该函数所做地具体工作有:调用setup_arch(>函数进行与体系结构相关地第一个初始化工作;对不同地体系结构来说该函数有不同地定义.对于 ARM 平台而言,该函数定义在arch/arm/kernel/Setup.c.它首先通过检测出来地处理器类型进行处理器内核地初始化,然后通过bootmem_init(>函数根据系统定义地meminfo 结构进行内存结构地初始化,最后调用paging_init(>开启MMU,创建内核页表,映射所有地物理内存和IO空间.创建异常向量表和初始化中断处理函数;初始化系统核心进程调度器和时钟中断处理机制;初始化串口控制台<serial-console);ARM-Linux 在初始化过程中一般都会初始化一个串口做为内核地控制台,这样内核在启动过程中就可以通过串口输出信息以便开发者或用户了解系统地启动进程.创建和初始化系统cache,为各种内存调用机制提供缓存,包括。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

L i n u x内核移植和根文件系统制作第一章移植内核 (2)1.1 Linux内核基础知识 (2)1.1.1 Linux版本 (2)1.1.2 什么是标准内核 (2)1.1.3 Linux操作系统的分类 (3)1.1.4 linux内核的选择 (4)1.2 Linux内核启动过程概述 (5)1.2.1 Bootloader启动过程 (5)1.2.2 Linux启动过程 (7)1.3 Linux内核移植 (10)1.3.1 移植内核和根文件系统准备工作 (10)1.3.2 修改Linux源码中参数 (11)1.3.3 配置Linux内核 (15)1.3.4、编译内核 (17)第二章制作根文件系统 (19)2.1 根文件系统预备知识 (19)2.2、构建根文件按系统 (19)2.2.1、建立根文件系统目录 (19)2.2.2、建立动态链接库 (21)2.2.3 交叉编译Bosybox (21)2.2.4 建立etc目录下的配置文件 (24)2.2.5 制作根文件系统映像文件 (26)第三章启动系统 (27)第四章总结 (34)第一章移植内核1.1 Linux内核基础知识在动手进行Linux内核移植之前,非常有必要对Linux内核进行一定的了解,下面从Linux内核的版本和分类说起。

1.1.1 Linux版本Linux内核的版本号可以从源代码的顶层目录下的Makefile中看到,比如2.6.29.1内核的Makefile中:VERSION = 2PA TCHLEVEL = 6SUBLEVEL = 29EXTRA VERSION = .1其中的“VERSION”和“PA TCHLEVEL”组成主版本号,比如 2.4、2.5、2.6等,稳定版本的德主版本号用偶数表示(比如2.6的内核),开发中的版本号用奇数表示(比如2.5),它是下一个稳定版本内核的前身。

“SUBLEVEL”称为次版本号,它不分奇偶,顺序递增,每隔1~2个月发布一个稳定版本。

“EXTRA VERSION”称为扩展版本号,它不分奇偶,顺序递增,每周发布几次扩展本版号。

1.1.2 什么是标准内核按照资料上的习惯说法,标准内核(或称基础内核)就是指主要在/维护和获取的内核,实际上它也有平台属性的。

这些linux 内核并不总是适用于所有linux支持的体系结构。

实际上,这些内核版本很多时候并不是为一些流行的嵌入式linux系统开发的,也很少运行于这些嵌入式linux 系统上,这个站点上的内核首先确保的是在Intel X86体系结构上可以正常运行,它是基于X86处理器的内核,如对linux-2.4.18.tar.bz2的配置make menuconfig 时就可以看到,Processor type and features--->中只有386、486、586/K5/5x86/6x86/6x86MX、Pentium-Classic、Pentium-MMX、Pentium-Pro/Celeron/Pentium-II、Pentium-III/Celeron(Coppermine)、Pentium-4、K6/K6-II/K6-III 、Athlon/Duron/K7 、Elan 、Crusoe、Winchip-C6 、Winchip-2 、Winchip-2A/Winchip-3 、CyrixIII/C3 选项,而没有类似Samsun 2410等其他芯片的选择。

如果需要用在其他特定的处理器平台上就需要对内核进行打补丁,形成不同的嵌入式内核。

实际上,不同处理器系统的内核下载站点中提供的也往往是补丁patch而已,故原x86平台上的内核变成了基础内核,也被称为标准内核了。

1.1.3 Linux操作系统的分类第一层次分类:以主要功能差异和发行组织区分(基础linux系统/内核)。

1、标准linux2、μClinux无MMU支持的linux系统,运行在无MMU的CPU上。

3、Linux-RT是最早在linux上实现硬实时支持的linux发行版本。

4、Linux/RTAI支持硬实时的linux,于RT-linux最大的不同之处在于RTAI定义了RTHAL,它将RTAI需要在linux中修改的部分定义成一组API接口,RTAI只使用API 接口与linux交互。

5、Embedix由Lineo公司开发,基于PowerPC和x86平台开发的。

6、Blue Cat Linux7、Hard Hat Linux8、其他第二层分类:以应用的嵌入式平台区分(嵌入式linux系统/内核,使上面第一类中的各种linux系统扩展为对特定目标硬件的支持,成为一种具体的嵌入式linux 系统)由于嵌入式系统的发展与linux内核的发展是不同步的,所以为了要找一个能够运行于目标系统上的内核,需要对内核进行选择、配置和定制。

因为每一种系统都是国际上不同的内核开发小组维护的,因此选择linux内核源码的站点也不尽相同。

第二层分类中的linux系统/内核相对于第一层分类的标准内核来说,也可以称为嵌入式linxu系统/内核。

如应用在ARM平台上的嵌入式Linux系统通常有arm-linux(常运行在arm9平台上),μClinux(常用在arm7平台上),在标准linux 基础上扩展对其他的平台的支持往往通过安装patch实现,如armlinux就是对linux安装rmk补丁(如patch-2.4.18-rmk7.bz2)形成的,只有安装了这些补丁,内核才能顺利地移植到ARM Linux上。

也有些是已经安装好补丁的内核源码包,如linux-2.4.18-rmk7.tar.bz2。

不同处理器系统的内核/内核补丁下载站点:处理器系统适合的内核站点下载方式x86 / ftp, http, rsyncARM /developer/ ftp, rsyncPowerPC / ftp, http, rsync, BitKeeperMIPS / ftp, cvsSuperH / cvs, BitKeeperM68K / ftp, httpnon-MMU CPUs / ftp, http这些站点不仅仅是linux内核站点,它们可能直接提供了针对你的目标硬件系统的linux内核版本。

1.1.4 linux内核的选择选择内核版本是很困难的,应该与负责维护该内核的小组保持联系,方法是通过订阅一些合适的邮件列表(maillist)并查看邮件中相关的重要新闻,以及浏览一些主要站点,可以得到该内核的最新发展动态。

如针对ARM的Linux内核,可以访问/ 并订阅该网站上提供的maillist就可以了。

如果觉得查阅邮箱中的邮件列表耗费太多时间,那么至少每周访问所关心的内核网站,并阅读Kernel Traffic提供的过去一周中在内核邮件清单中发生的重要的摘要,网址为/kernel-traffic 这样就可以得到相关Linux内核的最新信息。

并不是Linux的每个版本都适合ARM-Linux的移植,可以加入其邮件列表(maillist)以获得内核版本所支持硬件的相关信息,表中列出的资源可以帮助你找到哪些没有列出的功能可以被你的系统支持。

ARM Linux的移植,建议使用2.4.x或 2.6.x版本。

Linux内核补丁可以到ARM Linux的ftp (ftp:// )下载。

1.2 Linux内核启动过程概述一个嵌入式Linux 系统从软件角度看可以分为四个部分:引导加载程序(Bootloader),Linux 内核,文件系统,应用程序。

其中Bootloader是系统启动或复位以后执行的第一段代码,它主要用来初始化处理器及外设,然后调用Linux 内核。

Linux 内核在完成系统的初始化之后需要挂载某个文件系统做为根文件系统(Root Filesystem)。

根文件系统是Linux 系统的核心组成部分,它可以做为Linux 系统中文件和数据的存储区域,通常它还包括系统配置文件和运行应用软件所需要的库。

应用程序可以说是嵌入式系统的“灵魂”,它所实现的功能通常就是设计该嵌入式系统所要达到的目标。

如果没有应用程序的支持,任何硬件上设计精良的嵌入式系统都没有实用意义。

1.2.1 Bootloader启动过程Bootloader在运行过程中虽然具有初始化系统和执行用户输入的命令等作用,但它最根本的功能就是为了启动Linux 内核。

1 、Bootloader的概念和作用Bootloader是嵌入式系统的引导加载程序,它是系统上电后运行的第一段程序,其作用类似于PC 机上的BIOS。

在完成对系统的初始化任务之后,它会将非易失性存储器(通常是Flash或DOC等)中的Linux 内核拷贝到RAM 中去,然后跳转到内核的第一条指令处继续执行,从而启动Linux 内核。

由此可见,Bootloader 和Linux 内核有着密不可分的联系,要想清楚的了解Linux内核的启动过程,我们必须先得认识Bootloader的执行过程,这样才能对嵌入式系统的整个启动过程有清晰的掌握。

2 、Bootloader的执行过程不同的处理器上电或复位后执行的第一条指令地址并不相同,对于ARM 处理器来说,该地址为0x00000000。

对于一般的嵌入式系统,通常把Flash 等非易失性存储器映射到这个地址处,而Bootloader就位于该存储器的最前端,所以系统上电或复位后执行的第一段程序便是Bootloader。

而因为存储Bootloader的存储器不同,Bootloader的执行过程也并不相同,下面将具体分析。

嵌入式系统中广泛采用的非易失性存储器通常是Flash,而Flash 又分为Nor Flash 和Nand Flash 两种。

它们之间的不同在于:Nor Flash 支持芯片内执行(XIP,eXecute In Place),这样代码可以在Flash上直接执行而不必拷贝到RAM 中去执行。

而Nand Flash并不支持XIP,所以要想执行Nand Flash 上的代码,必须先将其拷贝到RAM中去,然后跳到RAM 中去执行。

3、Bootloader的功能实际应用中的Bootloader根据所需功能的不同可以设计得很复杂,除完成基本的初始化系统和调用Linux 内核等基本任务外,还可以执行很多用户输入的命令,比如设置Linux 启动参数,给Flash 分区等;也可以设计得很简单,只完成最基本的功能。

但为了能达到启动Linux 内核的目的,所有的Bootloader 都必须具备以下功能:(1)、初始化RAM因为Linux 内核一般都会在RAM 中运行,所以在调用Linux 内核之前bootloader 必须设置和初始化RAM,为调用Linux内核做好准备。

相关文档
最新文档