历史上的今天
返回首页

历史上的今天

今天是:2025年02月17日(星期一)

正在发生

2018年02月17日 | 移植标准Linux 操作系统到S3C2410

2018-02-17 来源:eefocus

    1 前 言

    目前 , 在嵌入式系统里基于ARM核的嵌入式处理器已经成为市场主流。随着ARM技术的广泛应用 , 建立面向ARM构架的嵌入式操作系统也就成为当前研究的热点。S3C2410是SAMSUNG公司基于ARM920T处理器内核开发的一款16/32位嵌入式处理器,运行频率高达200多M,具有MMU和高速缓存等丰富片上资源,是目前基于ARM920T内核的出货量最大的一款芯片。目前嵌入式操作系统也较多,如 Tor2nado 的VxWork、微软的 Windows CE等等。大量开发人员选择的却都是Linux,这是因为它源代码开放,可以轻松修改移植到自己的目标平台系统里使用。并且事实证明,效果令人满意。两者的结合必将在嵌入式系统的世界里打出一片天地。

 

    2 Linux 操作系统的移植

    2.1移植的含义

    要使得标准Linux能在ARM嵌入式处理器上运作,势必要经过移植 (porting) 的过程。所谓移植,就是让一套软件可以在一套选定硬件平台上正常运作,也就是要将平台相依 (platform dependent) 的部分做适当的修改。内核源码arch子目录包括了所有和平台体系结构相关的核心代码,它的每一个子目录都代表所支持的一种体系结构,arm就是关于我们所选处理器体系结构的子目录。我们的移植工作主要集中于此目录下。

    2.2移植的具体实现

    如果我们已经搭建起完整的交叉编译平台,移植工作便可开始了(以当前使用最广的linux-2.4为例,放于/usr/SRC/ linux-2.4.18之下)。

    / Makefile文件

    一个工程往往包含很多的文件,按照一定的规则放在多个目录中。Makefile文件用来指定编译规则,例如哪些需要编译,哪些要先编译。在此处要做的是:

    指定目标平台ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)

    设置为ARCH :=arm

    指定交叉编译器CROSS_COMPILE  =

    设置为CROSS_COMPILE  =arm-linux-

    /arch/arm/Makefile

    启动代码的产生要通过此一文件,由于2.4内核还没有对S3C2410的支持,自行加入如下代码

    ifeq ((CONFIG_ARCH_ S3C2410),y)

    TEXTADDR      = xxx

    MACHINE      = s3c2410

    Endif

    TEXTADDR是内核的虚拟起始地址[6],也是内核最终运行地址,通常设为PAGE_OFFSET +0x8000,须根据实际情况相结合[2]。

    /arch/arm/config.in

    config.in是配置文件,决定了我们在配置菜单中看到的内容。自行加入$CONFIG_ARCH_S3C2410子选项[5]。

    if [ "$CONFIG_ARCH_S3C2410" = "y" ]; then

    comment'Archimedes/A5000 Implementations'

    dep_bool    'SMDK  (MERI  TECH  BOARD) '

    CONFIG _S3C2410_SMDK//

    $CONFIG_ARCH_S3C2410

    //其他

    fi

    在if [ "$CONFIG_FOOTBRIDGE_HOST" = "y" -o

    ……

    "$CONFIG_ARCH_SA1100" = "y" ]; then

    define_bool CONFIG_ISA y

    else

    define_bool CONFIG_ISA n

    fi

    中依样加入"$CONFIG_ARCH_s3c2410" = "y"-o。

    /arch/arm/boot/Makefile

    ZTEXTADDR 是解压前image.rom的位置,ZRELADDR是内核解压并最终执行的位置。ZRELADDR与TEXTADDR之间符合如下映射关系:__virt_to_phys(TEXTADDR) == ZRELADDR[6]。

    ifeq ((CONFIG_ARCH_s3c2410),y)

    ZTEXTADDR    = xxx

    ZRELADDR    = xxx

    Endif

    /arch/arm/boot/compressed/ Makefile

    依样加入  ifeq ("$(CONFIG_ARCH_S3C2410),y)

    OBJS  +=head-s3c2410.o

    endif

    /arch/arm/boot/compressed/head-s3c2410.s

    此处需要自行加入内核解压前处理器初始化文件head-s3c2410.s,示例代码:

    .section        ".start", "ax"

    __S3C2410_start:

    bIC  r2, pc, #0x1f          @清除pc相关位,放于r2


    add  r3, r2, #0x4000

    1:            ldr  r0, [r2], #32

    teq  r2, r3

    bne  1b

    mcr p15, 0, r0, c7, c10, 4    @ 写回 Write Buffer

    mcr p15, 0, r0, c7, c7, 0          @ 刷新 I & D caches

    #if 0

    @ 禁用MMU ,caches

    ……

    #endif

    mov r0, #0x00200000

    1:      subs r0, r0, #1

    bne  1b

    /arch/arm/kernel/ Makefile

    依样将$(CONFIG_ARCH_2400) $(CONFIG_ARCH_2410) 加入

    no-IRQ-arch      :=$(CONFIG_ARCH_INTEGRATOR) $(CONFIG_ARCH_CLPS711X)

    ……

    $(CONFIG_ARCH_AT91RM9200

    并添加  obj-$(CONFIG_MIZI) += ecard.o

    obj-$(CONFIG_ARCH_APM) +=apm2.o

    /arch/arm/kernel/entry-armv.S

    此文件主要定义CPU初始化时中断处理部分[6],可参考处理器使用手册,按处理器使用要求设置。

    /arch/arm/kernel/debug-armv.S

    此文件用于最基本的串口调试功能[6],包括调试串口的地址初始化、发送、等待、忙状态定义等。使用此文件可以在启动过程中打印出相关信息。

    /arch/arm/kernel/setup.c

    在此文件中要根据使用的板子设置几个变量[5]。nr_banks指定了内存块的数量,bank指定了每块内存块的范围,PAGE_OFFSET是内存起始地址,MEM_SIZE是内存的大小。PAGE_OFFSET,MEM_SIZE要在/include/asm-arm/arch-s3c2410中定义。

    /arch/arm/mm/mm-armv.c

    此文件用于与硬件相关的内存管理,如初始化内存页表内存映射等。

    将init_maps->bufferable = 0;改为  init_maps->bufferable = 1;

    /arch/arm/mach-s3c2410

    建立相应目录并按照处理器使用要求编写irq.c,mm.c,time.c,arch.c,Makefile,分别实现中断控制器的初始化,地址的虚实映射关系,时钟中断和实时时钟处理以及有关Ramdisk使用参数等的设置。

    /include/asm-arm/arch-s3c2410

    此目录下定义用到的头文件。

    至此移植工作基本完成,再进行如下编译过程,即可得到我们需要的映像文件[4]。

    make dep;    make clean;    make zImage

    3 完整系统的构成

    要想让linux真正跑起来,还需要根文件系统的支持,常用的方法是Ramdisk。Ramdisk 是通过将计算机的内存(RAM)模拟作设备来创建和挂装文件系统的一种驱动器机制。一般应包括以下目录内容: /dev(设备文件目录); /proc (proc 文件系统目录);/etc(系统配置文件的目录); /sbin(系统程序的目录);/bin(基本应用程序目录);/lib(共享函数库的目录);/mnt (装载其他磁盘节点的目录);/usr(附加应用程序的目录)[3]。

 

    除此之外一个完整的嵌入式系统还要有引导代码,如vivi,u_boot等。Bootloader也需要移植与编译,在此并不详述。以上三块内容都准备好,对FLASH做好区间的划分[1]以后,便可以用 FLASH 烧写工具依次将Bootloader,内核以及根文件系统烧写到 FLASH里。然后就可以启动系统了。

    系统从0 地址处开始执行Bootloader。Bootloader做完相关硬件初始化工作之后从 FLASH里把压缩的内核映象复制到SDRAM内并且把根文件系统所在地址参数传递给内核[1]。内核复制到SDRAM之后进行内核解压启动。内核启动过程中根据 Bootloader传递过来的地址参数去寻找根文件系统 , 将其加载到嵌入式系统上。这样,整个Linux被引导启动起来 , 进入正常工作状态。

    4 结束语

    本文作者创新点:现在采用较为普遍的2.4版本的Linux并没有包含进对S3C2410的支持,给基于此的嵌入式系统的开发带来不便。本文在了解了移植过程中普遍存在的问题和作者经验教训积累的基础上,详尽分析了如何将Linux2.4移植到ARM平台的嵌入式系统上的主要技术,使得该系统可以很好的支持目标平台,并且移植后的Linux 很好的保留了原有的工作稳定的特点。在移植过程中强调其原理与可操作性,对加深对于Linux内核的理解和开发嵌入式系统是十分重要的,对于开发其他嵌入式系统具有参考意义。

    参考文献 ( References)

    [1]刘晶晶,基于ARM-Linux嵌入式系统引导程序的设计[J],微计算机信息,2006,2-2:123-125

    [2]李明,ARM Linux 的移植过程及分析,电子设计应用[J],2003,7:55-57

    [3]徐虹等,操作系统实验指导[M],北京:清华大学出版社,2002,5

    [4]张杰,曹卫华,吴敏,施卫强,基于S3C2410的Linux移植[J],微机发展, 2005(15),6:142-144

    [5]孙天泽,袁文菊,张海峰,嵌入式设计及Linux驱动开发指南[M],北京:电子工业出版社,2005,9

    [6]Wookey and Tak-Shing,Porting the Linux Kernel to a New ARM Platform,SOLUTIONS JOURNAL,2002,4:52-57


推荐阅读

史海拾趣

AZ Displays公司的发展小趣事

AZ Displays公司最初是一家专注于研发和生产TFT面板与LCD模块的初创企业。在电子行业激烈的竞争中,AZ Displays凭借其专业的技术团队和对市场的敏锐洞察,成功开发出一系列具有竞争力的产品。公司不断追求技术创新,持续优化生产工艺,逐渐在行业中树立起良好的口碑。

Fremont_Micro_Devices_USA公司的发展小趣事

随着公司规模的扩大和市场份额的提升,AZ Displays开始实施全球化战略。公司在全球范围内建立销售网络和分支机构,积极开拓国际市场。通过与国际知名企业的合作,AZ Displays成功将产品打入国际市场,进一步提升了公司的品牌影响力和市场竞争力。

Alpha Industries公司的发展小趣事

在环保意识日益增强的今天,Alpha Industries积极响应绿色生产的号召。公司利用电子技术优化生产流程,减少能源消耗和废弃物排放。此外,Alpha Industries还推出了采用环保材料制成的军事服装系列,以实际行动践行绿色环保理念。这些举措不仅有助于提升公司的社会形象,也为公司的可持续发展奠定了坚实基础。

这些故事展示了Alpha Industries如何在电子技术的推动下,不断创新并适应市场变化,进而在相关领域取得显著发展。尽管这些故事并未直接涉及电子行业的核心业务,但它们却充分体现了Alpha Industries在技术创新和市场拓展方面的积极努力和取得的成果。

Digital公司的发展小趣事

DIALIGHT公司的故事始于1938年的纽约布鲁克林,当时该公司专注于为飞机生产仪表板灯。随着技术的不断进步和市场的变化,公司在1971年,即LED推出仅一年后,推出了他们的第一个LED产品。这一举措标志着DIALIGHT正式从传统的飞机仪表板灯制造转向LED照明技术的研发和应用。从此,DIALIGHT彻底改变了LED的用途,将其广泛应用于世界各地的交通控制、指示灯、结构塔和工业场所,为全球提供了优质的照明解决方案。

High Voltage Semiconductor Inc公司的发展小趣事

进入21世纪,美高测持续加大在技术研发上的投入,成功研发出具有自主知识产权的VLF(超低频)测试技术,并应用于变电站设备、中高压电力电缆等关键领域的测试。这项技术不仅提高了测试的准确性和效率,还降低了操作风险,迅速获得了市场的广泛认可。公司借此机会,在全球范围内建立了多个销售和服务中心,进一步巩固了其在高压半导体测试市场的领先地位。

Avic公司的发展小趣事

随着中国航空工业的快速发展,Avic公司不断加强在航空电子技术领域的研发和创新。公司成功研制出一系列先进的航空电子系统,这些系统不仅提高了飞机的性能和安全性,也为中国航空工业的国际竞争力奠定了坚实基础。Avic公司在航空电子领域的突破,不仅推动了国内航空工业的发展,也为国际航空市场带来了新的选择。

问答坊 | AI 解惑

最新音频功放相关内容

本帖最后由 paulhyde 于 2014-9-15 09:20 编辑 好东西啊,小郭 !哈哈~  …

查看全部问答>

SH7780-代码包

再来劳烦大侠,你的邮件已收到,非常感谢; 我们现在用的是SH7780的片子,您那里有针对7780的代码包么? 有的话烦劳在给小弟一份,小弟穷身上所有的分求助; …

查看全部问答>

问个显示方面的问题

以下问题是WIN IX86. 我写过几个简单的内核程序,不过看DDK中的有关显示的还是一头雾水,想请问能告诉我一下主要的流程是怎么样的嘛!最好不要象W2000K的指导写的那么简单,能把内的和外的都解释一下,就象是WIN32K.SYS是做什么用的. …

查看全部问答>

h-jtag+flashpgm+wiggler烧写遇到的难题,望高手帮忙!在线等!~~

今天着手在达盛出的44b0板子上移植uclinux,结果第一步烧bootloader就出现问题了,望高手帮忙解决,小弟不盛感激!~ 连好wiggler后,刚开始的时候我的h-jtag能检测到硬件,但是我用flashpgm烧bootloader烧到一半的时候出现错误,提示:target being held ...…

查看全部问答>

红外线钢琴

设计师Omer Yosha带来了一款钢琴Airpiano,它没有琴键,八个一组的红外传感器水平分布于整个键盘上,双手在上方移动时,会被捕捉成音符,同时根据手部高低区别还能变化出不同的音调和音量…

查看全部问答>

哪位前辈有MCU DAY的CC430的板子啊?

本人去利尔达公司问了,他们公司没货了,希望哪位网友的CC430的板子不用了,或者闲置(收藏),希望出给我。多谢了!QQ77413811…

查看全部问答>

分享LM3S8962开发板SPI读取铁电代码

前面很多网友提问LM3S的SPI不好用或者用不了,通常用GPIO模拟,经过我2天的调试,SPI完全能用,效率还不错,下面提供主要函数和代码,调试时根据布板情况先从低波特率往上加,我是从9600开始调,最高1M没有问题,再高有点不稳定因为我电路板是飞线 ...…

查看全部问答>

LED路灯怎么选择选择恒流模块

replyreload += \',\' + 708459;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

關於LWIP TCP Client 問題

小弟最近使用 DK-LM3S9B96 掛上LWIP 及參考許多網站上的高手的文章寫了LWIP TCP Client,但是仍遇到了一些問題,目前確定 使用 ping 可以找到DK板,所以基本上 IP看來是通了,但是在TCP發送數據方面出了問題,資料是無法發送接收的,不知道問題出在那..有 ...…

查看全部问答>

RT-Thread 1.1.0 正式版发布

RT-Thread 1.1.0 正式版发布 2012年玛雅人预言的世界末日没有到来,但是我们的 RT-Thread 1.1.0 正式版却如约而至。 看看 1.1.0 突出的更改及改进情况,首先 1.1.0 版本是 1.0.x 系列的一个升级版本,并未包括实质性、大的改动,改动主要体现在: ...…

查看全部问答>