当前位置:首页 > 嵌入式 > 嵌入式软件
[导读]嵌入式Linux: uClinux操作系统移植

1.uClinux简介

uClinux这个英文单词中u表示Micro,小的意思,C表示Control,控制的意思,所以uClinux就是Micro-Control-Linux,字面上的理解就是"针对微控制领域而设计的Linux系统".

uclinux是一个源码开放的操作系统,面向没有MMU(MemoryManagementUnit)的硬件平台。它是linux的一个变种,主要的区别在于两者的内存管理机制和进程调度管理机制,同时为了适应嵌入式应用的需求,它的采用了romfs文件系统,并对linux上的c语言库glibc做了简化。

2.硬件体系结构简介

运行uClinux的硬件平台主要包括如下几个部分:cpu(ARMv4指令集兼容)、uart、memorycontroller、定时器、flash存储器,sdram存储器,中断控制器和DMA.

3.编译环境和编译工具

uclinux操作系统源码绝大部分是用c语言开发的,有一些与硬件直接相关的代码则用特定于某一CPU体系结构的汇编来实现。这些源码只能用GNU的gcc编译工具来进行编译、链接。

GNUgcc可以运行于Linux/Unix操作系统上。如果要在Windows平台上运行gcc,则必须安装Cygwin.Cygwin可以在Windows中安装一个linux的运行环境,这样就可以在windows下运行原本只能在linux下运行的程序。

为了在PC上编译得到运行于目标CPU上的操作系统内核,还必须安装一个合适的交叉编译器。Gcc提供了现成的针对MIPS、ARM、M68K、Sharc、PowerPC的交叉编译器。如果没有现成的交叉编译器,则需要自行设计。GNU网站提供了一些如何开发新的交叉编译器的文章。开发一个新的编译器,一般需要如下几个步骤:

(1)、编写机器描述脚本。采用gcc的RTL(RegisterTansferLanguage)语言描述针对某一CPU体系结构的机器指令与寻址方式、CPU浮点处理方式、endianess、c语言中各种数据类型的位宽、寄存器的个数和使用规则、堆栈和函数调用规则等体系结构的细节。

(2)、设计代码生成器。Gcc在对c语言源文件进行了词法和语法分析后,将产生一种中间格式文件(intermediaterepresentation)。为了把这种中间格式文件转化为针对具体CPU体系结构的机器码,需要自行设计一个代码生成器。

(3)、设计汇编器

(4)、设计链接器

4.uClinux启动过程

uClinux系统的启动可以分为两个步骤:

(1)。运行bootloader初始化程序

SRAM、SDRAM等存储设备属于挥发性的存储器,掉电以后其中的内容就会全部丢失,所以必须把操作系统的内核镜像存放在Flash等不挥发性存储介质上。但是操作系统在运行时,需要动态的创建一些如数据段、堆栈、页表(针对使用虚拟地址的操作系统)等内容,所以需要在RAM中运行操作系统。因此,就需要一个引导程序把操作系统的内核镜像从Flash存储器拷贝到RAM中,然后再从RAM中执行操作系统的内核。Bootloader就是可以完成这样一种功能的程序。

从本质上来讲,bootloader不属于操作系统内核。它采用汇编语言编写,因此针对不同的cpu体系结构,这一部分代码不具有可移植性。在移植操作系统时,这部分代码必须加以改写。

具体来讲,bootloader在系统启动时主要完成以下几项工作:

。将操作系统内核从flash拷贝到sdram中,如果是压缩格式的内核,还要将之解压缩。

。改写系统的memorymap,原先flash起始地址映射为0地址,这时需要将RAM的起始地址映射为0.

。设置堆栈指针并将bss段清零。将来执行c语言程序和调用子函数时要用到。

。改变pc值,使得cpu开始执行真正的操作系统内核。

(2)运行操作系统内核

bootloader程序执行完上述的各项工作后,通过一条跳转指令,转而执行ini目录下c语言源文件main.c中的函数start_kernel()。因为在此之前bootloader已经创建好一个初始化环境,

c函数可以开始执行了。整个操作系统内核的初始化工作从这里才算是真正开始。这个函数的长度比较短,代码如下:asmlinkagevoid__initstart_kernel(void)

{

char*command_line;

unsignedlongmempages;

externcharsaved_command_line[];

/*

*Interruptsarestilldisabled.Donecessarysetups,then

*enablethem

*/

lock_kernel();

printk(linux_banner);

setup_arch(&command_line);

printk("Kernelcommandline:%sn",saved_command_line);

parse_options(command_line);

trap_init();

init_IRQ();

sched_init();

softirq_init();

time_init();

/*

*HACKALERT!Thisisearly.We'reenablingtheconsolebefore

*we'vedonePCIsetupsetc,andconsole_init()mustbeawareof

*this.Butwedowantoutputearly,incasesomethinggoeswrong.

*/

console_init();

#ifdefCONFIG_MODULES

init_modules();

#endif

if(prof_shift){

unsignedintsize;

/*onlytextisprofiled*/

prof_len=(unsignedlong)&_etext-(unsignedlong)&_stext;

prof_len>>=prof_shift;

size=prof_len*sizeof(unsignedint)+PAGE_SIZE-1;

prof_buffer=(unsignedint*)alloc_bootmem(size);

}

kmem_cache_init();

sti();

calibrate_delay();

#ifdefCONFIG_BLK_DEV_INITRD

if(initrd_start&&!initrd_below_start_ok&&

initrd_start

printk(KERN_CRIT"initrdoverwritten(0x%08lx<0x%08lx)-"

"disablingit.n",initrd_start,min_low_pfn<

initrd_start=0;

}

#endif

mem_init();

kmem_cache_sizes_init();

pgtable_cache_init();

mempages=num_physpages;

[!--empirenews.page--]

fork_init(mempages);

proc_caches_init();

vfs_caches_init(mempages);

buffer_init(mempages);

page_cache_init(mempages);

#ifdefined(CONFIG_ARCH_S390)

ccwcache_init();

#endif

signals_init();

#ifdefCONFIG_PROC_FS

proc_root_init();

#endif

#ifdefined(CONFIG_SYSVIPC)

ipc_init();

#endif

check_bugs();

printk("POSIXconformancetestingbyUNIFIXn");

/*

*Wecountontheinitialthreadgoingok

*Likeidlersinitisanunlockedkernelthread,whichwill

*makesyscalls(andthusbelocked)。

*/

smp_init();

rest_init();

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

5.系统源码的修改

移植一个操作系统到新的硬件平台,比较好的办法是寻找一个架构相近并且已经做好操作系统移植的硬件平台。然后,对原先的操作系统做一定修改。系统源码修改的工作量取决于自行设计的硬件平台与现有的硬件平台之间差异程度。此设计中的硬件平台与三星4510芯片较为接近,并且也可以下载到针对4510b的uclinux系统源码。所以可以从此源码入手,根据我们的硬件平台与4510b的不同之处,在源码中找到相应的文件并加以修改。下面介绍如何修改系统源码。

需要修改的系统源码主要有如下几处:

(1)bootloader相关代码。此代码位于uClinuxlinux-2.4.xarcharmnommubootcompressed目录下名为head.s的文件中。此处程序用汇编语言实现,需要修改的地方主要是设置memorymap的代码,与memorycontroller的硬件实现相关。

(2)UART相关代码。UART相关代码位于uClinuxlinux-2.4.xdriverschar目录下的serial.c

(3)定时器相关代码。uClinux中有如下函数调用star_kernel()->time_init()->setup_timer(),需要修改setup_timer()函数中的相关代码。

(4)中断控制器相关。uClinuxlinux-2.4.xarcharmnommuirq.c

除了上述的代码,还有其他多处需要修改。在修改源代码时,可按照uclinux启动和执行顺序依次修改整个平台。熟悉linux内核源码结构对操作系统移植有很大帮助。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭