移植操作系统报告.docx

上传人:b****5 文档编号:3349110 上传时间:2022-11-22 格式:DOCX 页数:15 大小:2.05MB
下载 相关 举报
移植操作系统报告.docx_第1页
第1页 / 共15页
移植操作系统报告.docx_第2页
第2页 / 共15页
移植操作系统报告.docx_第3页
第3页 / 共15页
移植操作系统报告.docx_第4页
第4页 / 共15页
移植操作系统报告.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

移植操作系统报告.docx

《移植操作系统报告.docx》由会员分享,可在线阅读,更多相关《移植操作系统报告.docx(15页珍藏版)》请在冰豆网上搜索。

移植操作系统报告.docx

移植操作系统报告

 

嵌入式系统及应用

基于s3c6410的嵌入式Linux系统移植

 

 

1.嵌入式系统介绍

嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可配置,对功能、可靠性、成本、体积、功耗有严格约束的专用系统。

嵌入式Linux是在标准Linux的基础上针对嵌入式系统进行内核裁减和优化后形成的一种小型操作系统,一般只有几百KB左右,即使加上其它必要的模块和应用程序,所需的存储空间也很小,非常适合于移植到嵌入式系统中去。

一个完整的嵌入式系统的构建过程大体可以分为四个步骤:

交叉编译环境的搭建、BootLoader移植、Linux内核的配置编译及移植、根文件系统的制作及移植。

本文将以SUMSANG公司的s3c6410处理器为目标平台,介绍嵌入式Linux系统的构建过程。

1.1.嵌入式系统的组成

一个嵌入式系统装置一般都由嵌入式计算机系统和执行装置组成,嵌入式计算机系统是整个嵌入式系统的核心,由硬件层、中间层、系统软件层和应用软件层组成。

执行装置也称为被控对象,它可以接受嵌入式计算机系统发出的控制命令,执行所规定的操作或任务。

执行装置可以很简单,如手机上的一个微小型的电机,当手机处于震动接收状态时打开;也可以很复杂,如SONY智能机器狗,上面集成了多个微小型控制电机和多种传感器,从而可以执行各种复杂的动作和感受各种状态信息。

硬件层:

硬件层中包含嵌入式微处理器、存储器(SDRAM、ROM、Flash等)、通用设备接口和I/O接口(A/D、D/A、I/O等)。

在一片嵌入式处理器基础上添加电源电路、时钟电路和存储器电路,就构成了一个嵌入式核心控制模块。

其中操作系统和应用程序都可以固化在ROM中。

中间层:

硬件层与软件层之间为中间层,也称为硬件抽象层(HardwareAbstractLayer,HAL)或板级支持包(BoardSupportPackage,BSP),它将系统上层软件与底层硬件分离开来,使系统的底层驱动程序与硬件无关,上层软件开发人员无需关心底层硬件的具体情况,根据BSP层提供的接口即可进行开发。

该层一般包含相关底层硬件的初始化、数据的输入/输出操作和硬件设备的配置功能。

系统软件层:

系统软件层主要指运行于ARM芯片上的操作系统,目前常见的ARM操作系统有WinCE、Linux、Symbain、Android等。

应用软件层:

主要指运行于带操作系统的ARM上的软件,是由程序员编写的软件。

2.Linux系统移植

Linux系统移植实际上是把整套软件系统平台运行环境从一个硬件平台搬移到另一个硬件平台并运行的过程,这整个的过程主要包括系统引导代码的移植、操作系统移植、文件系统移植,通过这整套软件系统平台的移植,可以达到使同样的软件系统平台在不同的硬件环境下运行的目的。

进行Linux系统移植的先决条件是要对软件、硬件以及整个系统都有一个比较深入的了解,例如在Linux系统移植的过程中首先需要对各种硬件原理比较熟悉,其次对硬件原理图也要非常了解,再次对Linux系统与引导代码和文件系统的关系也要了解,最后更要对Linux系统本身要有一个深入的理解,只有通过这些准备工作才能具备进行Linux系统移植的条件。

由于系统移植是软硬件结合的工作,在移植的过程中还会遇到各种问题,更需要事先准备好各种软硬件知识,协同来解决这样的问题。

这部分将对整个Linux系统移植有一个全面的介绍,并且对后文中一些基本概念和所用的技术进行基本的介绍。

2.1.Linux系统移植主要步骤

Linux系统向ARM开发平台上移植,其主要步骤主要有四步:

搭建交叉编译环境;

Bootloader移植;

Linux内核移植;

文件系统移植;

系统移植主要步骤流程图如下:

2.2.交叉编译环境搭建

将arm-linux-gcc-4.3.2.tgz文件拷贝到Ubuntu的/forlinx目录下,该文件位于用户基础资料光盘的“实用工具”文件夹中。

在Ubuntu中新建一个终端,输入下面的命令安装交叉

编译器:

#cd/forlinx(进入/forlinx目录)

#mkdir/usr/local/arm(创建目录,若目录已存在会提示错误,跳过即可)

#tarzxvfarm-linux-gcc-4.3.2.tgz-C/

编译器解压到/usr/local/arm

把交叉编译器路径添加到系统环境变量中,以后可以直接在终端窗口中输入arm-linx-gcc命令来编译程序。

在终端中执行:

gedit/etc/profile

添加以下四行到该文件中:

exportPATH=/usr/local/arm/4.3.2/bin:

$PATH

exportTOOLCHAIN=/usr/local/arm/4.3.2

exportTB_CC_PREFIX=arm-linuxexport

PKG_CONFIG_PREFIX=$TOOLCHAIN/arm-none-linux-gnueabi

保存,退出。

重新启动系统,在终端里面执行arm-linux-gcc回车:

如下图所示就说明交叉编译器已经成功安装到了系统里面,可以使用该编译器来编译Uboot代码和内核代码了。

2.3.BootLoader引导程序及移植

引导加载程序是系统加电后运行的第一段软件代码。

它包括固化在固件(firmware)中的boot代码(可选)和BootLoader两大部分。

PC机中BootLoader的主要运行任务就是将内核映象从硬盘上读到RAM中,然后跳转到内核的入口点去运行,也即开始启动操作系统。

在嵌入式系统中,整个系统的加载启动任务就完全由BootLoader来完成。

由于BootLoader的实现依赖于CPU的体系结构,因此,嵌入式领域里建立一个通用的BootLoader几乎是不可能的。

大多数BootLoader都分为stagel和stage2两大部分。

依赖于CPU体系结构的代码,比如设备初始化代码等,通常都放在stagel中,而且通常都用汇编语言来实现,以达到短小精悍的目的。

而stage2则通常用c语言来实现,这样可以实现更复杂的功能,而且代码会具有更好的可读性和可移植性。

BootLoader的stagel上电启动后通常按以下步骤执行:

首先对硬件设备初始化。

包括屏蔽所有中断,设置CPU的速度和频率,RAM初始化,初始化LED,关闭CPU的内部指令/数据Cache等。

接下来的工作是为加载BootLoader的stage2准备RAM空间,然后拷贝BootLoader的stage2到RAM空间中。

接着设置好堆栈。

最后跳转到stage2的人口点。

BootLoader的stage2通常按以下步骤执行:

初始化本阶段要使用到的硬件设备,然后检测系统内存映射(memorymap),将Kernel映像和根文件系统映像从Flash上读到RAM空间中,接着为内核设置启动参数,最后调用内核。

至此整个BootLoader的启动引导过程结束。

U-Boot作为嵌入式系统中通用的Boot Loader,可以很方便的移植到其他硬件平台,因此对嵌入式系统Boot Loader,研究U-Boot的移植就显得非常重要。

移植U-Boot到新的嵌入式系统板上包括两个层面的移植,第一层面是针对CPU的移植,第二层面是针对BOARD的移植,同时需要移植相关的头。

然后根据开发板的不同内存需要使用不同的U-boot配置项。

编译128M内存开发板Uboot方法:

进入uboot1.1.6目录、配置config、编译:

#cduboot1.1.6(进入uboot源码的目录)

#makeforlinx_nand_ram128_config(配置适用于128M内存开发板的config)

#makeclean(删除以前编译的文件)

#make(编译)

2.4.Linux内核移植

1、编译Linux-3.0.1

将压缩包‘FORLINX_linux-3.0.1.tar.gz’拷贝到作目录下,解压缩:

#tarzxfFORLINX_linux-3.0.1.tar.gz

2、配置内核

1)进入Linux-3.0.1内核主目录,通过以下命令将6410的默认配置文件写到当前目录下的.config。

make s3c6410_defconfig

2)配置内核模块的功能,有几种方式可以进行界面选择:

 

make menuconfig(文本选单的配置方式,在有字符终端下才能使用)

 make xconfig(图形窗口模式的配置方式,图形窗口的配置比较直观,必须支持Xwindow下才能使用) 

make oldconfig(文本配置方式,在原内核配置的基础修改时使用) 这里使用make menuconfig命令。

3编译内核

命令如下:

#makezImage

编译结束后将在内核源码目录的arch/arm/boot中得到Linux内核映像文件:

zImage

2.5.文件系统映像制作

1、准备好文件系统

FileSystem-Yaffs2.tar.gz是文件系统目录,可以使用此目录制作Yaffs2

文件系统,且FileSystem-Yaffs2.tar.gz目录也用于NFS网络根文件系统挂载。

2、制作映像

在基础光盘\Linux-3.0.1\filesystem\Yaffs2文件系统制作工具中有两个制作工具:

mkyaffs2image-nand2g和mkyaffs2image-nand256m

1)mkyaffs2image-nand256m制作出的映像,适用于256M和1G字节nandflash的开发板。

制作命令:

#./mkyaffs2image-nand256mFileSystem-Yaffs2rootfs.yaffs2

2)mkyaffs2image-nand2g制作出的映像,适用于2G或者4G字节nandflash的开发板。

制作命令:

#./mkyaffs2image-nand2gFileSystem-Yaffs2rootfs.yaffs2

最后生成rootfs.yaffs2是可以下载到开发板nandflash中的yaffs2文件系统映像。

移植成功后Linux启动的界面:

3.基于移植的系统上的小程序

功能:

每次可以选择上下左右其中一个方向去拨动,每拨动一次,所有的数字方块都会往拨动的方向靠拢外,系统也会在空白的地方随机出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。

系统给予的数字方块不是2就是4,玩家要想办法在这小小的16格范围中凑出“2048”这个数字方块。

程序源码:

2048.c

/*2048*/

#include

#include

#include

#include"my_getch.h"

intcode[4][4]={0,0,0,0,

0,0,0,0,

0,0,0,0,

0,0,0,0};

inttemp[5];

intmov=0;

intscore=0

voidprint(void)

{

inti,j;

printf("2048\n");

printf("W--UPA--LEFTS--DOWND--RIGHT0--EXIT\n");

printf("Score:

%dmov:

%d\n",score,mov);

printf("|*******************|\n");

for(i=0;i<=3;i++)

{

for(j=0;j<=3;j++)

{

if(code[i][j]==0)

{

printf("|");

}

else

{

printf("|%4d",code[i][j]);

}

}

printf("|\n|*******************|\n");

}

}

intadd(void)

{

inti;

intt=0;

intchange=0;

do

{

for(i=0;i<=3;i++)

{

if(temp[i]==0)

{

if(temp[i]!

=temp[i+1])

change=1;

temp[i]=temp[i+1];

temp[i+1]=0;

}

}

t++;

}while(t<=3);

for(i=1;i<=3;i++)

{

if(temp[i]==temp[i-1])

{

if(temp[i]!

=0)

{

change=1;

score=score+temp[i];

}

temp[i-1]=temp[i-1]*2;

temp[i]=0;

}

}

do

{

for(i=0;i<=3;i++)

{

if(temp[i]==0)

{

temp[i]=temp[i+1];

temp[i+1]=0;

}

}

t++;

}while(t<=3);

returnchange;

}

intmain(void)

{

intgameover=0;

inti,j;

intchange=1;

charinput;

srand((unsigned)time(NULL));

while(gameover==0)

{

if(change>=1)

{

do

{

i=((unsigned)rand())%4;

j=((unsigned)rand())%4;

}while(code[i][j]!

=0);

if(((unsigned)rand())%4==0)

{

code[i][j]=4;

}

else

{

code[i][j]=2;

}

mov++;

}

print();

input=my_getch();

change=0;

switch(input){

case'0':

printf("Areyousuretoexit?

(y/n)");

input=getchar();

if(input=='y'||input=='Y')

exit(0);

break;

case'W':

case'w':

for(j=0;j<=3;j++)

{

for(i=0;i<=3;i++)

{

temp[i]=code[i][j];

}

temp[4]=0;

change=change+add();

for(i=0;i<=3;i++)

{

code[i][j]=temp[i];

}

}

break;

case'A':

case'a':

for(i=0;i<=3;i++)

{

for(j=0;j<=3;j++)

{

temp[j]=code[i][j];

}

temp[4]=0;

change=change+add();

for(j=0;j<=3;j++)

{

code[i][j]=temp[j];

}

}

break;

case'S':

case's':

for(j=0;j<=3;j++)

{

for(i=0;i<=3;i++)

{

temp[i]=code[3-i][j];

}

temp[4]=0;

change=change+add();

for(i=0;i<=3;i++)

{

code[3-i][j]=temp[i];

}

}

break;

case'D':

case'd':

for(i=0;i<=3;i++)

{

for(j=0;j<=3;j++)

{

temp[j]=code[i][3-j];

}

temp[4]=0;

change=change+add();

for(j=0;j<=3;j++)

{

code[i][3-j]=temp[j];

}

}

break;

}

gameover=1;

for(i=0;i<=3;i++)

for(j=0;j<=3;j++)

if(code[i][j]==0)

gameover=0;

}

printf("Gameover!

\n");

return0;

}

my_getch.h

#ifndefMYGETCH_H

#defineMYGETCH_H

#include

#include//操作终端

#include

#include

#include

charmy_getch()

{

intc=0;

structtermiosorg_opts,new_opts;

intres=0;

//保留终端原来设置

res=tcgetattr(STDIN_FILENO,&org_opts);

assert(res==0);

//从新设置终端参数

memcpy(&new_opts,&org_opts,sizeof(new_opts));

new_opts.c_lflag&=~(ICANON|ECHO|ECHOE|ECHOK|ECHONL|ECHOPRT|ECHOKE|ICRNL);

tcsetattr(STDIN_FILENO,TCSANOW,&new_opts);

c=getchar();

//恢复中断设置

res=tcsetattr(STDIN_FILENO,TCSANOW,&org_opts);assert(res==0);

returnc;

}

#endif

运行结果:

在终端上显示的运行结果:

在开发板上显示的运行结果:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1