S3c44B0在uClinux的移植步骤
Blob在S3C44B0上的移植.
Blob在S3C44B0上的移植摘要:Bootloader是嵌入式系统软件开发的第一个环节,它紧密地将软硬件衔接在一起,对于一个嵌入式设备后续的软件开发至关重要。
Blob 是一款功能强大的Bootloader,S3C44B0是三星公司一款基于ARM7TDMI的嵌入式通用处理器。
本文详细介绍Blob在基于S3C44B0的开发板上的运行原理与移植过程。
关键词:S3C44B0 Blob Bootloader 移值Bootloader对于嵌入式设备来说至关重要,它涉及到许多硬件相关的知识。
对于自制的嵌入式开发板,它又是不可跳过的步骤,所以很多人对于它感到很头痛。
本文将以一款优秀的Bootloader Blob为例,详细讲解它的运行原理以及在S3C44B0通用处理器上的移植过程,为在嵌入式设备上的后续软件开发打下基础。
1 Blob简介Blob是Boot Loader Object的缩写,是一款功能强大的Bootloader。
它遵循GPL,源泉代码完全开放。
Blob既可以用来简单的调试,也可以启动Linux kernel。
Blob最初是Jan-Derk Bakker和Erik Mouw为一块名为LART (Linux Advanced Radio Terminal)的板子写的,该板使用的处理器是StrongARM SA-1100。
现在Blob已经被移植到了很多CPU上,包括S3C44B0。
MBA44B0是一款基于S3C44B0的开发板。
本文将以运行在MBA44B0开发板上的Blob的源代码为基础,再针对自己的开发板进行Blob的移植。
开发板的主要配置为:*三星ARM7处理器S3C44B0;*2MB的Flash,地址范围0x0000 0000~0x0020 0000;*8MB的SDRAM,地址范围0x0c00 0000~0x0c80 0000;*1个串口,2个LED灯;*JTAG接口;*晶振为6MHz,系统主频为60MHz。
3.uClinux移植过程PPT课件
-
3
交叉编译器安装: 下载: arm-elf-tools-20030314.sh 在超级用户环境下运行: sh arm-elf-tools-20030314.sh
-
4
1.1.2 为安装windows的宿主机建立交叉编译器
1. Cygwin软件介绍
为了在Windows下开发嵌入式操作系统应 用程序,可以在Windows环境下装上Cygwin软 件。Cygwin是一个在Windows平台上运行的 Unix模拟环境,是Cygnus Solutions公司开发的 自由软件。它对于学习掌握Unix/Linux操作环 境,或者进行某些特殊的开发工作,尤其是使 用GNU工具集在Windows上进行嵌入式系统开 发,非常有用。
1.建立uClinux开发环境
1.1 建立交叉编译器 通常的嵌入式系统的开发都是以装有Linux的 PC机作为宿主机来编译内核和用户应用程序的, 但是对于很多长期工作在Windows操作系统下 的用户来说,突然切换到Linux环境下去开发 程序会感到诸多不便,因此对于不同的开发者 提供了在宿主机装有不同操作系统时,相应的 交叉编译环境建立的方法。
-
7
图1
-
8
安 装 的 时 候 建 议 最 好 不 要 安 装 到 C:\ 目录下,比如安装在D:\下。
在安装的过程中,会让用户选择安装 哪些包,这些包主要是确定开发环境, 编译工具等,如果不能确定具体需要哪 些包的话,而硬盘空间足够的情况下, 就选择全部安装。在出现的对话框的 ‘’All‘’的右边点击‘’Default‘’,直到 变成‘’Install‘’,如下图2所示
-
1
1.1.1.为安装Linux的宿主机建立交叉编译器
首先,要在宿主机上安装标准Linux操作系 统,如RedHat Linux(本书使用的是Redhat 7.2), 一定要确保计算机的网卡驱动、网络通讯配置 正常,有关如何在PC机上安装Linux操作系统 的问题,请参考有关资料和手册。
嵌入式系统设计实验告--BootLoader移植实验
合肥学院嵌入式系统设计实验报告(20 13 - 20 14 第 2 学期)专业:实验项目:BootLoader移植实验实验时间:2014年5月19日实验成员:____________________________________________________________________指导老师:电子信息与电气工程系2014 年 4 月制实验三BootLoader 移植实验一、实验目的1、熟悉 Bootloader 工作原理。
2、了解 U-Boot 的代码结构。
3、掌握 U-Boot 移植过程。
二、实验内容本实验熟悉 Bootloader 工作原理,了解 U-Boot 源码结构,基于 S3C2440 处理器,完成 U-Boot 移植,并在目标开发板上测试通过。
三、实验设备硬件: 1、 pc 机2、 FriendlyARM开发套件即MIRCO2440 核心板软件: 1、虚拟机( VMware )2、U-Boot 源码( u-boot-2011.03.tar )四、实验过程1、 Micro2440配置在mini2440/micro2440上的移植准备工作,我们仍然将开发板文件建立在board/samsung 下,2、配置时出现错误,字体要修改,复制粘贴的时候出现的错误,有的地方有中文,去掉就行了。
3、编译完成失败,只有上网查找错误,最后解决了错误。
11124、编译完成后将u-boot.bin下载到SDRAM的 0x33f80000地址处, u-boot已经能在RAM中运行。
二、支持DM90001、编译完成后将u-boot.bin下载到SDRAM的0x33f80000地址处。
三、支持内核启动1、编译完成后将u-boot.bin下载到SDRAM的0x33f80000地址处。
四、支持Nand Flash1、编译完成后将u-boot.bin下载到SDRAM的0x33f80000地址处。
五、实验小结本实验需要熟悉Bootloader 工作原理,了解U-Boot 源码结构,基于S3C2440 处理器,完成 U-Boot 移植,并在目标开发板上测试通过,首先可以看到实验指导书上的介绍,了解U-Boot 的移植。
关于三星S3C44B0X目标板的uClinux Bootloader
关于三星S3C44B0X目标板的uClinux Bootloader 是为控制领域设计的操作系统,它沿袭了主流Linux的大部分特性,并举行了一定幅度的裁减。
其设计主要针对没有内存管理单元(MMU)的微处理器,例如基于7TDMI内核的S3C44B0X。
嵌入式Linux系统通常由三部份组成:Bootloader、Kernel和File System。
其中Bootloader是在系统启动之后、Kernel运行之前所执行的第一段代码,其任务是为调用Kernel预备须要的软硬件环境。
由此可见,Bootloader是十分依靠于硬件和操作系统的。
所谓依靠于硬件,是指Bootloader的实现与处理器体系架构和板级硬件资源疏远相关;所谓依靠于操作系统,是指不同操作系统的内核对调用方式和运行环境有不同的要求。
理论上,uClinux在引导时并非一定需要一个自立于Kernel Image的Bootloader Image。
然而将Bootloader与Kernel分开设计能够使软件架构越发清楚,也有助于灵便地支持多种引导方式,实现须要的辅助功能。
uClinux Bootloader的主要任务可概括如下:●引导和初始化●加载uClinux Kernel●设置内核启动参数●调用uClinux Kernel●辅助功能:文件下载、Flash烧写、人机界面等对于常见架构的处理器,普通都能找到现成的Bootloader,但其结构往往较为复杂,且仍需要针对详细的目标板举行移植。
固然,也可以挑选自行开发Bootloader。
因为Bootloader Image在物理上自立于Kernel Image,因此不一定尾随Linux选用GNU作为开发工具。
对于ARM处理器,彻低可以用法ADS或RVDS等集成环境来开发Bootloader。
1.引导和初始化1.1 硬件初始化阶段一第1页共7页。
UCGUI在44BO上的移植
UCGUI在44BO上的移植在网络上看到已经有不少人把UCGUI成功移植到44BO上了不过他们只提供了他们的演示程序而公开他们的移植方法过程这里我把我的移植过程写写希望对各位有帮助我们采用的是思创嵌入式开发网研发的S3C44B0黄金开发板及其液晶显示模块我的移植分两个大部分来做的一是液晶的正确初始化二是UCGUI移植原本应该包括触控屏的移植可是因为IAR下的中断一直没有调通就没有做触控屏的移植我的液晶是320240 16灰度的跟44BO的连接方式是4位单扫描一液晶的正确初始化液晶的初始化可以参照下面的函数最后得到显示缓冲区数组跟视窗屏幕的对应关系如下事实上液晶的正确初始化就是需要明确显示缓冲区跟视窗屏幕的对应关系为了达到这个目的可是通过单步调试逐个显示点来观察这种对应关系在上图中那就是这样一个顺序Bmp[0]=0xF000;//点0Bmp[0]=0xFF00;//点0 1Bmp[0]=0xFFF0;//点01 2Bmp[0]=0xFFFF;//点012 3单步执行查看液晶屏上显示点的位置这样就可以确定对应关系了这44BO中的液晶控制寄存器中有BSWP这个设置位它是用于调整每4个字节的字节顺序的也是通过单步调试来明确这种对应关系的#define SCR_XSIZE (320)//视窗屏幕大小#define SCR_YSIZE (240)#define LCD_XSIZE (320)//液晶屏幕大小#define LCD_YSIZE (240)#define MVAL_USED (0)#define MVAL (13)#define INVCLK (0)#define INVFRAME (0)#define INVLINE (0)#define CLKVAL_SL (8) //VCLK=MCLK/(CLKVAL*2) (CLKVAL >= 2)#define M5D(n) ((n) & 0x1fffff)#define ARRAY_SIZE_G16 (SCR_XSIZE*SCR_YSIZE)unsigned short Bmp[ARRAY_SIZE_G16/2];//液晶显示缓冲数组#define CLKVAL_G16 (10) //40Mhz, CLKVAL=10 ->101HzHOZVAL(LCD_XSIZE/4-1)#define(LCD_YSIZE-1)#defineLINEVALMVAL (13)#defineBSWP (1)//这个决定了每4个字节的顺序是否进行交换#define#define MODESEL (2)//Gray 16void LcdInit(void){//The following value has to be changed for better display.rDITHMODE=0x12210;//rDITHMODE=0x0;rDP1_2 =0xa5a5;=0xba5da65;rDP4_7=0xa5a5f;rDP3_5rDP2_3=0xd6b;=0xeb7b5ed;rDP5_7rDP3_4=0x7dbe;=0x7ebdf;rDP4_5=0x7fdfbfe;rDP6_7rLCDCON1 = (0)|(1<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_G16<<12);// disable,4B_SNGL_SCAN,WDLY=8clk,WLH=8clk,rLCDCON2 = (LINEVAL)|(HOZVAL<<10)|(10<<21);//LINEBLANK=10 (without any calculation)rLCDSADDR1 = (MODESEL<<27) | ( ((uint)Bmp>>22)<<21 ) | M5D((uint)Bmp>>1);// 16-gray, LCDBANK, LCDBASEUrLCDSADDR2 = (BSWP<<29)|M5D((((uint)Bmp+(SCR_XSIZE*LCD_YSIZE/2))>>1))|(MVAL<<21);rLCDSADDR3 = (LCD_XSIZE/4) | ( ((SCR_XSIZE-LCD_XSIZE)/4)<<9 );rLCDCON1 = (1)|(1<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_G16<<12);}二UCGUI的移植移植的思路是使用UCGUI支持的buffer型的LCD控制器EPSON 1375我想就是这样一个使用双口RAM的LCD 控制器吧因为我注意到UCGUI的代码中若是使用1375控制器时需要定义四个读写函数#define LCD_READ_MEM(Off) *((U16*) (0xc00000+(((U32)(Off))<<1)))#define LCD_WRITE_MEM(Off,data) *((U16*) (0xc00000+(((U32)(Off))<<1)))=data#define LCD_READ_REG(Off) *((volatile U16*)(0xc1ffe0+(((U16)(Off))<<1)))#define LCD_WRITE_REG(Off,data) *((volatile U16*)(0xc1ffe0+(((U16)(Off))<<1)))=data前两个是读写内存的定义后两个是读写寄存器的定义注意到常数0xc00000和0xc1ffe0没有0xc00000是1375控制器的显示缓冲区开始地址(Base Address)0xc1ffe0是1375控制器的寄存器开始地址(Base Address)读写显示缓冲区就是根据地址偏移off和开始地址0xc00000来读写Buffer的读写控制寄存器就是根据地址偏移off和开始地址0xc1ffe0来读写Buffer的我想可以使用欺骗的一招我们把我们液晶的显示缓冲区的开始地址(Bmp[0])告诉这几个函数那么就可以了而读写寄存器的两个函数我们就不用了等我移植完毕我发现网络上的其它移植版本也是如此使用了1375控制器的了不信看看他们提供的演示DOME显示的液晶控制器是不是EPSON 13705在LCD.H中定义数据类型#define I8 signed char#define U8 unsigned char /* unsigned 8 bits. */#define I16 signed short /* signed 16 bits. */#define U16 unsigned short /* unsigned 16 bits. */#define I32 signed long /* signed 32 bits. */#define U32 unsigned long /* unsigned 32 bits. */#define I16P I16 /* signed 16 bits OR MORE ! */#define U16P U16 /* unsigned 16 bits OR MORE ! */在LCDConf.H中定义#define LCD_XSIZE (320) /* X-resolution of LCD, Logical coor. */#define LCD_YSIZE (240) /* Y-resolution of LCD, Logical coor. */#define LCD_BITSPERPIXEL (4) //16灰度#define LCD_CONTROLLER 1375extern unsigned short Bmp[]; //引入显示缓冲区数组#define LCD_READ_MEM(Off) *((U16*) (Bmp+(((U32)(Off)))))#define LCD_WRITE_MEM(Off,data) *((U16*) (Bmp+(((U32)(Off)))))=data//#define LCD_READ_REG(Off) //这个函数可以不用定义反正我们没有用到#define LCD_WRITE_REG(Off,data) //有些地方用到了定义为空避免做大改动#define LCD_SWAP_BYTE_ORDER (1) //这个是做字节转换的在LCD13XX.C中定义液晶总线宽度#ifndef LCD_BUSWIDTH#define LCD_BUSWIDTH (16)#endif这里提及关键对应部分->定义显示缓冲区时使用的short数据类型,它是16bit的:unsigned short Bmp[ARRAY_SIZE_G16/2];//液晶显示缓冲数组->定义读写缓冲区时使用的数据类型,也是16bit的U16:#define LCD_READ_MEM(Off) *((U16*) (Bmp+(((U32)(Off)))))#define LCD_WRITE_MEM(Off,data) *((U16*) (Bmp+(((U32)(Off)))))=data//#define LCD_READ_REG(Off) //这个函数可以不用定义反正我们没有用到#define LCD_WRITE_REG(Off,data) //有些地方用到了定义为空避免做大改动 ->定义液晶总线宽度定义位16bit的#ifndef LCD_BUSWIDTH#define LCD_BUSWIDTH (16)#endif->定义字节顺序#define LCD_SWAP_BYTE_ORDER (1) //16bit时需要交换的读者已经能看到了对应关系了都是使用16bit的数据类型这是关键别用错了由此延伸若是把这些对应关系换成8bit的数据类型如下->定义显示缓冲区时使用的char数据类型,它是8bit的:unsigned char Bmp[ARRAY_SIZE_G16];//液晶显示缓冲数组->定义读写缓冲区时使用的数据类型,也是8bit的U8:#define LCD_READ_MEM(Off) *((U8*) (Bmp+(((U32)(Off)))))#define LCD_WRITE_MEM(Off,data) *((U8*) (Bmp+(((U32)(Off)))))=data//#define LCD_READ_REG(Off) //这个函数可以不用定义反正我们没有用到#define LCD_WRITE_REG(Off,data) //有些地方用到了定义为空避免做大改动 ->定义液晶总线宽度定义位8bit的#ifndef LCD_BUSWIDTH#define LCD_BUSWIDTH (8)#endif->定义字节顺序#define LCD_SWAP_BYTE_ORDER (0) //8bit时不需要交换的这样的对应关系也是可行的我测试过不过若是你想把它换成32bit的话就不行了因为UCGUI不支持32bit 的液晶总线宽度的以上两部分是整个移植工作的关键当然还有一些繁琐的事情请阅读UCGUI的手册中Getting Started一章在IAR下移植时需要建立group对照文件夹加入UCGUI代码需要说明的是除了LCDDriver下只加入LCD13XX.C在Config下额外加入GUI_X.C外其余的都是加入相应文件夹中的所有C文件我还额外加入了跟开发板有关的文件:LCDLIB.C(液晶的初始化函数LcdInit())Platform.C(板级初始化函数它会调用LcdInit()来初始化液晶控制器)设置include路径:我加入的inclide路径为D:\Program Files\IAR Systems\UCGUI\gui\core\D:\Program Files\IAR Systems\UCGUI\Config\D:\Program Files\IAR Systems\UCGUI\gui\WM\D:\Program Files\IAR Systems\UCGUI\gui\Widget\D:\Program Files\IAR Systems\UCGUI\Sample\GUIDemo\在GUIConf.H中定义#define GUI_OS (0) /* Compile with multitasking support */#define GUI_WINSUPPORT (1) /* Use window manager if true (1) */#define GUI_SUPPORT_MEMDEV (1) /* Support memory devices */#define GUI_SUPPORT_TOUCH (0) /* Support a touch screen (req. win-manager) */#define GUI_SUPPORT_UNICODE (1) /* Support mixed ASCII/UNICODE strings */我们还没有移植到OS上也没有加入触摸屏的支持在GUI_X.C中定义三个未定义的函数void GUI_X_Log (const char *s) {}void GUI_X_Warn (const char *s) {}void GUI_X_ErrorOut(const char *s) {}修改一个函数定义void GUI_X_Delay(int ms) {// int tEnd = OS_TimeMS + ms;// while ((tEnd - OS_TimeMS) > 0);extern void Delay(int time);//我自己的延时函数Delay(150*ms);}原因是在UCGUI的应用中有一些函数是跟时间相关的UCGUI认为使用的是UCOS UCOS会维护时间OS_TimeMS;这里我调用我自己的延迟程序来实现延迟事实上正是因为有一些函数跟时间有关因此在UCGUI提供的演示程序中就出现了问题例如在GUIDEMO_Speed.C中有这么个循环for (i = 0; (((t + 8000) - (int)GUI_GetTime()) > 0) && !GUIDEMO_CheckCancel(); i++) {}它调用了GUI_GetTime读取当前系统时间来控制循环若是系统没有维护时间OS_TimeMS那就会出问题了我的简单解决方法是改为for (i = 0;i<0xFFF;i++){}在其它的GUIDEMO_XXXX.C中也有这样一些循环你要是调试是发现液晶屏上的显示一直停在一个画面上很久的话估计就是碰上了上面的问题好了加入那个最简单的主函数Basic_Helloworld.Cvoid BoardInit (void);void main(void) {/*ToDo: Make sure hardware is initilized first!!*/BoardInit ();//板级初始化它调用了LcdInit()GUI_Init();GUI_DispString("Hello world!");while(1);}应该能在你的液晶屏上看到UCGUI跟你打招呼的了"Hello world!"这样UCGUI的移植基本上已经完成了当然了这里只提供了移植关键的部分更多的更完整的移植还需要做不少的工作如触控屏的移植键盘鼠标的移植中文字体的移植UCGUI支持UNICODE中文字体不成大问题的还有DEBUG输出的移植不难吧直接输出到串口不久可以了嘛若是在做UCGUI的移植前你的系统已经使用同一个编译环境移植了UCOS那么UCGUI的演示效果将是更好的原因就是由于UCGUI中有一些跟时间相关的调用――liandaolycld@。
uClinux port to S3C44B0X 心得
硬件其实可以根据你的配置在BIOS中设置好,当然用自启动版可以在解压缩前设置好。
在好几个坛子上面看到大家对uC的讨论热火朝天,但差不多都是基于4510开发板的,而基于44B0的好象很少,并且不象4510的那样成熟和清晰。
可能和4510主要是网络应用有关吧,它可以充分利用uC的网络功能。
如果在44B0上加入uC,也可以体验一下这个操作系统,再加入往卡驱动的话,也能实现网络哦!记得以前在ARM开发论坛看到一位高人写过在44B0的uC上加网卡驱动的文章,想做这个的兄弟可以去找找。
我手头有4510和44B0的板子各一块,4510是代博的,上面带的uC挺好用。
于是想在44B0上也跑跑uC,两周前我调通了8019后觉得条件差不多了,因为uC的IMAGE.RAM是非压缩的,有1M多,调试的时候如果不用到网络下载的话会很慢,即使用串口调到115.2K也要几分钟时间,而且可靠性也较低,所以有网卡芯片是移植的一个重要条件,当然有USB通讯的话也很快,不过我的板那块坏了,并考虑到以后会用到网络,还是用8019吧。
从我有板开始我就一直找可用于44B0的uC,并下载过TPU兄的源文件,上次看到TPU兄的留言可帮忙移植就马上留言联系,后来通过一封MAIL好象就没消息了,只好自己摸索着做做,所以我的移植过程可能存在很多不对的地方,大家一起参考修正.开始我想跑跑TPU的ZIMAGE,这是一个压缩后的文件,运行时需要自解压,查到它的起始运行地址是0XC300 000,KENERL运行地址是0XC008000,用自己的BIOS将数据DOWN到设定地,再RUN,运行出现结果了,开始是些乱码,调了一下串口速率,在38400,显示UCOMPRESS KERNEL...不过到START KERNEL后,再没下文了,于是用AXD反汇编调试,发现是因为进入KERNEL后没找到PROCESSER ID而停掉,可能是要在BIOS中传递过去。
后来想到一个办法,把我现在在4510板上跑的uC改动后移植到44B0上,在那一版上大家对uC的应用都做得比较熟了,编起来也比较方便。
基于S3C44B0X的μCLinux内核移植
的 内核 发展 而来 , 是专 门为 没有 内存管 理单元 M U微处理器 ( A M T M ) M 如 R 7 D I 而设计 的嵌人式 操作系统.LLnx p i 是对标准 Lnx C u i 进行适 当裁剪 u
嵌入式操作系统 的移植技术成为嵌入式开发中的
一
个重要问题. 本文详细论述 了 t Lnx L i 嵌入式 C u
文 章 编 号 :10 4 2 (0 1 0 0 5 0 6— 7 9 2 1 )4— 3 9一o 4
基 于 S C 4 O 的 i L n x内核 移 植 3 4B X  ̄ iu C
陆 静 , 凤勤 李
209 ) 000
Байду номын сангаас( 上海 电力 学院 计算机与信息工程学院 , 上海 摘
要 :阐述 了 i L u 嵌入式操 作系统和 SC 4O x ix C n 3 4B X处理器 的特 点 , 介绍 了引导 转载程 序的操作 模式 , 详
所谓嵌入式操作系统 内核 移植 , 就是使一个 操作系统能够在某个微处理器平 台或微控制器上 运行. 嵌入式操作系统是嵌人式系统 的灵魂 , 在同
一
操作系统移植 到 S C 4 O 3A B X微处理器的过程及方
法, 为其他类型的系统内核移植提供借鉴.
个 硬 件 平 台上 可 以嵌 入 不 同 的 嵌 入 式 操 作 系
On t e Tr n p a t to f iCLi ux Ke n l h a s l n a in o  ̄ n r e
Ba e n S C4 s d o 3 4B0 X
L ig IF n -i U Jn ,L e g qn
(co/fC m ue n frai n i e n , Sho o o p tr dI om t nE gn r g a n o ei
通过U-Boot实现基于S3C44B0X的uClinux移植
通过U-Boot实现基于S3C44B0X的uClinux移植
王丽伟;杨厚俊;范延滨
【期刊名称】《南京师范大学学报(工程技术版)》
【年(卷),期】2008(008)004
【摘要】在嵌入式系统开发中,为了加快应用程序以及设备驱动的开发周期,需要建立一个完备的嵌入式操作系统.首先,建立U-Boot引导程序是必不可少的.在U-Boot引导程序为操作系统内核准备好环境之后,利用它实现了uClinux基于
S3C44B0开发的移植.最后,从板级移植的角度,结合硬件平台结构系统地分析和讲解了移植过程.
【总页数】6页(P150-154,172)
【作者】王丽伟;杨厚俊;范延滨
【作者单位】青岛大学信息工程学院,山东,青岛,266071;青岛大学信息工程学院,山东,青岛,266071;青岛大学信息工程学院,山东,青岛,266071
【正文语种】中文
【中图分类】TP316
【相关文献】
1.基于S3C44B0X的U-Boot及μClinux的移植分析 [J], 郭建磊;杨厚俊
2.基于S3C44B0X的U-Boot的分析与移植 [J], 杨虹;徐超强;李杨
3.基于S3C44B0X处理器的U-BOOT的设计与实现 [J], 李兴霞
4.基于恒丰锐科S3C44B0X的U-BOOT启动流程分析 [J], 王璐鑫
5.U-BOOT在基于S3C44B0X系统板上的移植 [J], 袁进刚;高清维;翟寄文;程蒲
因版权原因,仅展示原文概要,查看原文内容请购买。
基于S3C44BOX开发板的μClinux嵌入式系统移植
一 般
<52B 1k
多
约 1 MB
的 L n x衍 生 操 作 系 统 , 具 有 内核 精 简 、 iu 它 支持 多 任 务、 高效 、 定 等 优 点 。移 植 系 统 的主 要 内容 是 : 稳 获取 某 一 版本 的 L n x内核 源码 , 据 目标板 对 源 码 中与 iu 根 体 系结 构相关 部 分进 行修 改 , 然后 添加 一些外 设 驱动 ,
Tr ns l nt 0 Clnu a e n S C44 a pa fU i x b s d o 3 BOX a d Bo r
熊整 文 严 朝 军
( 三峡 大学 宜 昌
4 30 ) 4 0 2
【 摘 要】S C 4 O 是 三 星公 司设 计 的一款基 于 ARM7 MI的 3 3 4B X TD 2位 RI C处理 器 。实验 以 P S C机 为宿 主机 , 通过在 宿 主机 上对  ̄ l u C i x内核进 行编 译 ,然后 向 目标板 S C 4 OX 移植 。 比较 了 / l u n 3 4B * i x的应 用领域 ,从 交 Cn
Co p r to Th s e p r e t t n c mp ls t e k r e ft i u i ah s g n r l p r o e c mp t r n r n p a t tt h r o a in. i x e i n a i o i h e n l Cl x v a o t( e e a - u p s o m o e o t n * u e )a d t a s l n si O t e t r e 3 4 a g tS C4 BOX b a d.Th p l d r am f/ i u n h u l i g o r s o i to n io me t t e C t n d f a i n o r ea p i e l o * n x a d t e b i n fc o s c mp l i n e v r n n , h u d mo i c to e Cl d a a i o e n l r n r d c d i h s p p r h n t e t a s l n f ̄ i u a e n S C4 BOX i s s e ial e c i e . fk r e e i to u e n t i a e ,t e h r n p a to Cl x b s d o 3 4 a n s y t m c l d s r d y b KEYW ORDS S C4 BOX , Cl u , o to d r k r e , r n p a t 3 4 / i x B o l a e , e n l t a s ln * n
基于ARM7的uClinux移植(嵌入式课程设计)
基于ARM7的uClinux移植1.引言随着计算机技术的发展,嵌入式系统已不仅仅属于计算机领域的一个研究热点,在电子、工业控制、航空航天等领域都有广泛的应用。
嵌入式设备应用广泛,几乎包括了我们周围的所有电器设备:PDA、手机、机顶盒、汽车、微波炉、自动取款机等。
和通用计算不同的是嵌入式系统针对的是具体的专用系统,一般也都具有成本和空间的敏感性,它的硬件和软件都必须高效率的设计。
在航空航天、医疗等特殊应用领域还要求做到很高的安全可靠性。
嵌入式系统还可以根据任务灵活的增减软硬件。
uClinux在官方网站()中有源代码提供,同时也有文档说明所支持的体系结构。
结合实际的应用,在众多的体系结构中选择一种。
下面介绍一下在移植uClinux中会遇到的一些关键问题。
(1)交叉编译环境的建立移植uClinux必须有一台PC机,安装了Linux操作系统。
同时还要有一块测试板,测试板的体系结构uClinux必须支持。
对于不同体系结构,GNU都提供了相应的开发软件包。
这可以到网上查找,有些是源代码包,下载后要经过GCC的编译才能应用;有些是应用程序包,安装后即可使用。
安装完了工具包后,Linux中就有了基于该体系结构的编译器,链接器,调试器以及一些实用小工具,例如反汇编,反编译等,以后编译uClinux内核,制作文件系统都要依赖交叉编译系统。
(2)uCli nux的内核加载方式的问题uClinux的内核有两种可选的运行方式:可以在Flash上直接运行,也可以加载到内存中运行。
前者可以减少内存需要。
Flash运行方式:把内核的可执行映像文件烧到Flash上,系统启动时从Flash的某个地址开始逐句执行。
这种方法实际上是很多嵌入式系统采用的方法。
内核加载方式:把内核的压缩文件存放在Flash上,系统启动时读取压缩文件在内存里解压,然后开始执行,这种方式相对复杂一些,但是运行速度可能更快(RAM的存取速率要比Flash高)。
基于S3C44B0X的uClinux操作系统内核移植
2 内核 的编 译
2 1 交 叉环境 的建 立 .
生操作系统. 具有支持多任务 、 内核精简 、 高效 、 稳定
L a I Y h , W NG We. ig , S N o g c u A i n b U Y n .h n
( . oeeo o p t cec ,H ri Un .S i eh ,H ri 5 0 0, hn ; 1 C l g f m ue Si e abn i e.T c. abn10 8 C ia l C r n v
摘
要 : ulu 与 Ci x内核体 系结构相关部分, n 主要完成硬件寄存器设置 , 存映射 等初始工作, 内
它是代 码移植 的主要 部 分. 绍 了实验进 行 的硬 件环境 , 交叉环 境的 建 立 , 介 从 源代 码 的修 改 , 内核 的
编译 , 内核的 下栽 与执行 等 方面 , 系统描 述 了将 u l u 作 系统移植 到 ¥ C 4 0的过程 . Ci x操 n 34 B
它具有低电压 、 低功耗和低集成度等特点 , 并具有开
放性和可扩性 , 已经成为嵌入式系统首选 的处理器 架构….3 4 B ¥C 4 0是三星公司推出的一款为手持设 备或其他通用设备而开发的 1/ 2位处理器 , 63 它基 于 AMTM R 7 D I核, 有 内 存 管 理 单 元 ( M . 没 M U)
维普资讯
第 1卷 1
第2 期
20 06年 4月
哈 尔 滨 理 工 大 学 学 报 J RNAL HAR N U V.S I & rECt . OU BI NI C. I 1 t
! == == = = == = ======= = = ==:= == ==== ==:== == === =;: === == == : = :
基于S3C44B0X的_CLinux内核移植
上
Journal of
海
电
力
学
院
of
学
Electric
报
Pow er
Vol. 27 ,No. 4 Aug. 2011
Hale Waihona Puke ShanghaiUniversity
LU Jing,LI Fengqin
( School of Computer and Information Engineering,Shanghai University of Electric Power,Shanghai 200090 ,China)
Abstract:
The features of the embedded operating system μCLinux and the S3C44B0X processor are elucidated. The operating mode of Boot Loader is introduced. The method of transplanting
S3C44B0X 是 SAMSUNG 公 司 推 出 的 16 /32 RISIC 位 处理器, 它为手持设备和一般应用提供 了高 性 价 比 和 高 性 能 的 微 控 制 器 解 决 方 案. SAMSUNG S3C44B0X 微 处 理 器 芯 片 内 集 成 ARM7TDMI 核, 并在 ARM7TDMI 核基本功能的基 础上集成了丰富的外围功能模块, 便于低成本设 计嵌入式应用系统. 这些外围功能模块包括: 8 kB Cache; 内部 SRAM, LCD 控制器; 带自动握手的 2 4 通道 DMA; 系统管理器; 带 PWM 功 通道 UART, 能的 5 通道定时器; I / O 端口; 具有日历功能的实 时时钟 RTC ; 8 通道 10 位 ADC ; IIC 总线接口; IIS 总线接口; 同步 SIO 接口; PLL 倍频器等. 通过提 大大减少了系统中除处 供全面通用的片上外设, 理器 以 外 的 原 件 配 置, 从而使系统成本大为降 [4 ] 低 . 设计中选用的开发板以 S3C44B0X 为控制核 心, 外部晶振频率为 10 MHz, 内核主频最高可达 64 MHz, 通 过 RS232 接 口 与 上 位 机 通 讯, 外接 JTAG 接 口,支 持 在 线 调 试. 开 发 板 采 用 SST39VF1601 芯片( 2 M 字节 ) 作为程序存储器, 对应 的 地 址 空 间 为 0x00000000-0x001fffff, 采用 HY57VF641620 芯 片 ( 8 M 字 节 ) 作 为 数 据 存 储 器,对应的地址空间为 0x0c000000-0x0c7fffff.
基于S3C44B0芯片的uClinux内核引导过程分析
基于S3C44B0芯片的uClinux内核引导过程分析前言随着计算机硬件技术的不断发展,功能强大、资源丰富的嵌入式芯片,成为研究人员开发专业应用领域产品的首选。
三星公司生产的S3C44B0 芯片,采用ARM7TDM I 内核,具有功耗小、成本低的特点,是一款专门针对移动终端及PDA 手持设备市场的产品。
近几年,源码开放的L inux 系统迅速发展,很快成为跨平台操作系统中的佼佼者,并且出现了专门针对嵌入式系统的产品———uClinux。
在S3C44B0 芯片上移植uClinux 操作系统,能够充分发挥该芯片系统资源丰富(相对单片机而言)的特点,开发出功能强大的应用产品。
嵌入式系统的启动引导程序与硬件严格相关,对编写人员的要求较高,而在移植uClinux 后又大大增加了引导程序的复杂程度,因此这部分代码往往是各个嵌入式产品开发厂商严格保密的部分。
下面将以一款市场上成熟的基于S3C44B0 芯片的嵌入式开发板为蓝本,对引导uClinux 内核的过程进行分析。
系统引导过程分析嵌入式系统中uClinux 内核的系统引导过程通常可以分为3个阶段,即boot 阶段、系统初始化阶段和uClinux 内核引导阶段。
通常情况下boot 阶段和系统初始化阶段的工作由一段被称为bootloader 的代码完成,而内核引导则是由事先编译好了的uClinux 可执行镜像来实现。
系统内存组织由于嵌入式系统的硬件环境千差万别,即使选用同一种型号的嵌入式芯片,其外围设备也大不相同,特别是存储设备的组织,将直接关系到引导程序的实现。
对于S3C44B0 芯片,其生产厂家规定在系统加电自举后,从0x00000000 处开始执行(其他芯片如ARM9 系列可以通过地址映射改变该地址) ,故此处通常安排的是Flash 地址空间,用于保存bootloader 启动代码以及uClinux 映象。
对于S3C44B0 芯片,RAM 地址被固定在0x0c000000 到0x0fffffff 的64 兆,开发人员可以根据自己的需要再组织RAM,如本开发板存储器地址安排如下:。
基于S3C44B0的UBOOT移植
基于S3C44B0的UBOOT移植1 UBOOT源码结构 (3)1.1根目录 (3)1.2 board目录 (3)1.3 common目录 (3)1.4 cpu目录 (3)1.5 disk目录 (4)1.6 doc目录 (4)1.7 drivers目录 (4)1.8 dtt目录 (4)1.9 examples目录 (4)1.10 fs目录 (4)1.11 Include目录 (4)1.12 lib_xxx目录 (4)1.13 net目录 (5)1.14 post目录 (5)1.15 rtc目录 (5)1.16 tools目录 (5)2 UBOOT启动分析 (5)2.1 第一阶段分析 (5)2.1.1 异常中断向量表 (5)2.1.2 定义变量 (6)2.1.3 初始化cpu寄存器 (7)2.1.4 初始化memory控制器 (8)2.1.5 UBOOT映射到SDRAM (8)2.1.6 堆栈指针设置 (10)2.1.7 进入第二阶段 (10)2.2 第二阶段分析 (10)2.2.1 初始化全局数据结构 (10)2.2.2 通用初始化函数 (11)2.2.3FLASH初始化 (12)2.2.4env_relocate重定向配置参数 (12)2.2.5MAIN_LOOP (13)3 U-BOOT移植 (13)3.1创建目录和文件 (13)3.2修改移植文件 (13)3.2.1 编译配置文件 (13)3.2.2 开发板配置文件 (14)3.2.3 GPIO初始化文件 (15)3.2.4 网卡驱动文件 (15)3.2.5 串口配置文件 (16)3.2.6 Flash驱动文件 (16)3.2.7 第一阶段启动文件 (17)4 小结 (18)1UBOOT源码结构此处介绍的uboot的版本是1.1.4。
1.1根目录根目录下包含的主要文件有README、config.mk、Makefile和编译生成的执行及调试文件。
基于S3C44BOX的uClinux的移植
第10卷第4期2007年10月西安文理学院学报:自然科学版Journal of Xi ’an University of Arts &Science (Nat Sci Ed )Vol.10 No.4Oct.2007文章编号:100825564(2007)0420074204收稿日期:2007205225作者简介:王长安(1963—),男,陕西西安人,陕西警官职业学院公安信息技术系讲师.基于S3C44BOX 的uClinux 的移植王长安(陕西警官职业学院公安信息技术系,陕西西安 710043)摘 要:uClinux 是一种支持多种体系结构处理器的操作系统,有很强的移植性.文中详细描述了将uClinux 移植到基于S3C44BOX 处理器目标板上的方法与过程.讨论了在该开发板上Bootloader 的设计实现以及uClinux 内核的移植方法.关键词:嵌入式;uClinux ;ARM ;移植中图分类号:TP311 文献标识码:A1 引 言嵌入式操作系统一般都不是为特定的处理器设计的,不能通过简单的下载方式直接将厂商提供的内核的二进制文件下载到嵌入式系统的ROM 中运行,要使得某个操作系统在特定的CPU 上运行起来,必须修改一些操作系统内核中与硬件相关的文件内容.例如主频的设置,I/O 口的地址,存储映射方式等等.2 操作系统内核配置由于新的处理器不断出现,如果重新进行移植工作则会十分困难,此时,可以借助相似硬件结构的其他型号处理器的移植经验,将之应用到新的处理器型号上.本设计中采用的S3C44BOX 的移植工作便可以在早己完成的同类型产品S3C4510B 的基础上进行.S3C4510B 和S3C44BOX 都属于SamSung 公司生产的ARM7TDM I 核的芯片,在很多硬件结构上都很类似.因此,移植到S3C44BOX 上的工作就可以在此基础上开始.下面对一些内核中需要修改的参数进行介绍.2.1 修改压缩内核运行地址1)Arch/armnommu/Makefile 中的TEXTADDR 决定内核起始运行地址,即linux.rom 应下载到Flash 中的位置,该值应为OxOc00800002)修改Arch/armnommu/boot/Makefile ,增加ifeq ($(CONFIG ARCHes S3C44B0),y )ZRELADDR =OxOc008000ZTEXTADDR =OxOc100000endif其中的ZRELADDR 决定内核的运行地址.ZTEXTADDR 为不带bootloader 的压缩内核文件烧入Flash 中的固定地址,即从哪个位置开始执行内核.在这里把内核运行地址改为0x0c008000.2.2 修改硬件寄存器地址和IRQ在include/asm -armnommu/arch -s3c44bOx/HARDWARE.H 中加入S3C44BOX 的寄存器地址.如#define SYSCF G REG L (0x000000)在include/asm -armnommu/arch -s3c44bOx/IRQ.h 加入各个中断的IRQ 号.2.3 修改处理器配置选项修改/linux -2.4.x/arch/armnommu/config.in ,修改其中的ARM 处理器的主频和存储器大小及起始地址的定义.增加如下行:define int CONFIG ARM CL K 64000000#72000000#define bool CONFIG SERIAL S3C44BOX y#define int CONFIG FORCE MAX ZON EORDER 5If [“$CONFIG SET M EM PARAM ”=“n ”];thendefine hex DRAM BASE OxOC000000define hex DRAM SIZE 0x00800000define hex FLASH M EM BASE 0x00000000define hex FLASH SIZE 0x00200000fi2.4 修改内核起始地址修改文件:/linux -2.4.x/arch/armnommu/Makefile ,修改如下内容:ifeq ($(CONFIG ARCH S3C44B0),y )TEXTADDR =OxOc008000MACHIN E ==S3C44BOXINCDIR =$(MACHIN E )endif2.5 ROMFS 定位修改修改/linux -2.4.x/drivers/block/blkmem.c ,增加#define ROMFS BASE (0x0c700000)#ifdef CONFIG ARCH S3C44B0{0,ROMFS -ASE ,-1},#endif2.6修改存储空间配置在文件/linux -2.4.x/include/asm -armnommu/arch -s3c44b0/memory.h 中增加如下内容:#define PHYS OFFSET (DRAM BASE )#define PA GE OFFSET PHYS OFFSET#define END M EM (DRAM BASE +DRAM SIZE )#endif2.7 定义二级异常中断矢量表的起始地址修改/linux -2.4.x/include/asm -armnommu/proc -armv/system.h ,增加:#ifdef CONFIG ARCH S3C44B0#undef vectorses base#define vectors based (0x0c000000)#endif即定义了二级异常中断矢量表的起始地址,以便重新映射中断向量.2.8 修改网络控制器基地址修改修改/linux -2.4.x/include/rim -armnommu/armne.h 增加:57 第4期王长安:基于S3C44BOX 的uClinux 的移植67西安文理学院学报:自然科学版第10卷#define N E2000 ODDOFFSET0x00000020#define N E2000 ADDR0x06000000因为R TL8019AS处于bank3区,该区从0x6000000开始编址,并且对奇地址的寄存器进行操作时,必须偏移0x20.3 Bootloader的实现Bootloader的主要功能是初始化一些必要的硬件,主要是芯片的时钟和存储器以及一些外设.然后根据具体的硬件设置相应修改嵌入式操作系统内核中涉及到与硬件进行交互的文件.必须按照设计的嵌入式系统的硬件结构进行修改,否则就不能在该平台上运行嵌入式操作系统.如果必要,还必须编写板级支持包(Board Support Package,BSP).板级支持包在操作系统和硬件之间充当一个转换层的角色,操作系统必须通过BSP对硬件进行控制.最后,借助Bootloader或者J TA G口将操作系统的镜像文件下载到嵌入式系统的存储系统.本系统的Bootloader实现的功能主要包括两个阶段:第一阶段是硬件初始化和软件运行环境初始化,该阶段主要是负责建立主机(一般是PC机)和目标机(嵌入式系统)的以太网通信,包括初始化以太网控制器R TL8019AS及设置网络参数如IP等,通信建立后,目标机就可以通过tftp协议下载内核、文件系统和应用程序等到Flash的固定位置,即所谓的固化,同时主机也可以将Flash中的映像文件传送到主机的硬盘上.第二个阶段就是复制内核到SDRAM,同时复制中断向量表,接着直接加载uClinux内核,即直接跳转到内核在SDRAM中的首地址,将系统交由内核管理,uClinux所需要的参数可以由ARM寄存器RO,R1,R2传递,也可以将参数列表存于SDRAM中,将列表的首地址传递给内核,该过程由heads完成.在Bootloader的编写过程中,地址映射表的配置是Bootloader需要关注的问题.地址映射表的配置包括设置Flash地址空间、SDRAM地址空间、外部I/O地址范围和处理器寄存器地址范围. ARM7TDM I处理器在加电后首先执行地址0x0处的代码,因此在加电启动时,首先将存储了Bootload2 er的Flash地址空间设置为几个区间,分别存放Bootloader,uClinux内核镜像和ROMFS文件系统镜像.接着将SDRAM的地址空间设置为Oxc000000-Oxcffffff,并且设置内核的复制地址.由于S3C44BOX的地址空间不可重新映射,因此本次设计的Bootloader也不考虑这方面的问题.若对于可重新映射地址空间的处理器,Bootloader还需要在内核复制到SDRAM中后,将SDRAM的地址空间映射到0x0,这样系统重启后处理器就会从SDRAM开始运行.在Bootloader将内核复制到SDRAM中去,并跳转至内核的首地址后,剩下的工作就由内核的引导程序完成.在uClinux的发布包中,该引导程序的代码在linux/arch/armnommu/boot/compressed目录,其中heads的作用最关键,它完成了加载内核的大部分工作,另外内核的加载还必须知道系统必要的硬件信息,该硬件信息在hardware.h中并被heads所引用.当Bootloade:将控制权交给内核的引导程序时,第一个执行的程序就是heads.heads首先配置S3C44BOX的系统寄存器;再初始化S3C44BOX的ROM,RAM以及总线等控制寄存器,将Flash和SDRAM的地址范围分别设置为0x0-0x200000和0xc000000-0xcffffff;接着将内核的映像文件从Flash拷贝到SDRAM,然后调用misc.c中的解压内核函数(decompress kernel),对拷贝到SDRAM的内核映像文件进行解压缩,最后跳转到执行调用内核函数(call kernel),将控制权交给解压后的uClinux系统.若内核映像是非压缩型的,则不需要进行解压缩而直接跳转到call kernel.执行call kernel函数实际上是执行linux/init/main.c中的start kernel函数,包括处理器结构的初始化、中断的初始化、进程相关的初始化以及内存初始化等重要工作.4 系统编译在编译uClinux的内核之前,首先必须具备交叉编译环境,即一台主机,以及目标板.PC机可以安装Linux 操作系统,也可以在Windows 操作系统上安装Linux 的虚拟机.软件上则必须在PC 机建立交叉编译环境,本文不再叙述.在完成系统配置后,执行make dep 设置各个文件之间的依赖关系.这之后运行make lib only 和make user only 编译库文件和用户程序.编译完后运行make romfs 生成romfs 文件系统目录.之后执行make imag.生成映像文件.在第一次运行时会出现以下错误:arm -elf -objcopy :/home/uClinux -Release/linux -2.4.x/linux :No such file or directorymake[1]:333[image ]Error 1make[1]:Leaving directory ’/home/uClinux -Release/vendors/Samsung/44BOmake :333[image ]Error 2这是由于第一次编译的时候尚未生成romfs.o ,此时可以执行make linux 然后再执行make image 就可以编译出映像文件.此时内核的编译工作完成.当uCLinux 内核比较稳定并不需要经常修改的时候,可以将它下载到开发板中的Flash 中.此时可以继续为开发板开发其他的应用,然后将应用加入到romfs 中.当应用业务不需要经常修改的时候它也被下载到开发板中的Flash 中.5 结 语嵌入式系统是继网络技术之后,又一个新的技术发展方向.由于嵌入式uClinux 系统具有代码开放、费用低、体积小、性能强、功耗低、可靠性高以及网络应用丰富等突出特征,目前已经广泛地被应用于军事国防、消费电子、网络通信、工业控制等各个领域,具有庞大的市场前景.随着计算机技术与通信技术的发展,uClinux 系统的研究与开发会有着越来越重要的实际意义.[参 考 文 献][1] 李善平,刘文峰,李程远,等.Linux 内核2.4版.源代码分析大全[M ].北京:机械工业出版社,2002.[2] 陈渝,李明,杨哗,等.源码开放的嵌入式系统软件分析与实践[M ].北京:北京航空航天大学出版社,2004.[3] 李善平,刘文峰,王涣龙,等.Linux 与嵌入式系统[M ].北京:清华大学出版社,2003.[4] 邹思轶.嵌入式Linux 设计与应用[M ].北京:清华大学出版社,2002.[5] uClinux 系统特点及开发调试等相关技术资料[G /OL ].uClinux 官方网站:http ://www.uclinux.orm ,2006-06-10.[责任编辑 王新奇]T ransplant of uClinux B ased on S 3C 44BOXWAN G Chang 2an(Department of Public Security Information Technology ,Shaanxi Police Officer Vocational College ,Xi ’an 710043,China )Abstract :uClinux support is a kind of processor architecture operating system ,witha strong portability.The transplant will be based on uClinux S3C44BOX processor target boards.The design and realization of uClinux kernel method of transplant development board Bootloader are discussed.K ey w ords :embedded ;uClinux ;ARM ;transplant 77 第4期王长安:基于S3C44BOX 的uClinux 的移植。
基于s3c44B0X嵌入式uCLinux系统原理及应用[001]
8.2.2 标准Linux的内存管理
内核主要通过页目录和页表的地址转换功能将 应用程序的虚拟地址转换成物理地址。
这个过程中可能将应用程序中使用的超过了实 际物理内存大小的虚拟地址映射到适当的真实物理 地址,从而使应用程序可以随心所欲地使用巨大的 虚拟存储空间(对Linux 2.4内核来说为4GB)。
目前,在无MMU平台上能够运行的Linux 仅有uClinux一家。
第 8章 目录
★1 缺少MMU支持的内存管理 ★2 FLAT平模式内存管理
2.1 3种内存管理模型 2.2 标准Linux的内存管理 2.3 uClinux内存管理 2.4 uClinux内存管理的局限性 ★3 内存管理模块的启动过程 ★4 可执行程序的加载 4.1 用户程序的内存分布 4.2 reloc段机制 4.3 FLAT可执行文件格式 4.4 执行文件加载流程
8.1 缺少MMU支持的内存管理
目前的Linux内核已经被移植到大量的 非x86平台上,包括ARM,M68K,PPC, Alpha,Sparc等。
其中uClinux主要针对缺少MMU内存 管理的优秀嵌入式Linux操作系统。
8.1 缺少MMU支持的内存管理
目前,由于体积限制或者出于降低成本的考虑, 嵌入式系统中所使用的微处理器大多缺少MMU。
应用程序使用的是虚拟地址,CPU实际 执行程序所使用的是物理地址,从虚拟地 址到物理地址的转换需要操作系统和MMU 硬件的参与。
标准Linux以及大多数现代操作系统都 使用这种内存管理模型。
第 8章 目录
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
S3c44B0在uClinux中需要修改的文件一.内核基本文件的修改 1.uClinux-Samsung\vendors\Samsung\S3C44B0
“config.linux-2.4.x”这个是linux内核编译配置选项文件。
# System Type
#
# CONFIG_ARCH_DSC21 is not set
# CONFIG_ARCH_CNXT is not set
# CONFIG_ARCH_SWARM is not set
#CONFIG_ARCH_SAMSUNG=y
CONFIG_ARCH_MBA44B0=y
# CONFIG_ARCH_ATMEL is not set
CONFIG_NO_PGT_CACHE=y
CONFIG_CPU_32=y
# CONFIG_CPU_26 is not set
CONFIG_CPU_ARM710=y
CONFIG_CPU_WITH_CACHE=y
# CONFIG_CPU_WITH_MCR_INSTRUCTION is not set
CONFIG_SERIAL_44B0=y
#CONFIG_SET_MEM_SAMSUNG=y
DRAM_BASE=0x0c000000 #SDRAM起始是地址
DRAM_SIZE=0x01000000 #SDRAM大小16M
FLASH_MEM_BASE=0x00000000 #FLASH起始地址
FLASH_SIZE=0x00200000 #FLASH大小2M
#
# General setup
以后的make都以CONFIG_ARCH_S3C44B0=y这选项来解决是编译和S3C44B0相关的其他选项。
2.arch/armnommu/Makefie:
ifeq ($(CONFIG_ARCH_S3C44B0),y)
TEXTADDR = 0x0c008000
MACHINE = s3c44b0
endif
TEXTADDR = 0x0c008000表明未压缩的内核的位置
3.arch/armnommu/boot/Makefie:
ifeq ($(CONFIG_ARCH_S3C44B0),y)
ZRELADDR = 0x0c008000
ZTEXTADDR = 0x0c300000
endif
ZRELADDR = 0x0c008000表明未压缩的内核的位置
ZTEXTADDR = 0x0c300000表明压缩内核的位置
4.include/asm-armnommu//proc-armv/system.h
#ifdef CONFIG_ARCH_S3C44B0
#undef vectors_base()
#define vectors_base() (0x0c000008)
#endif
5.arch/armnommu/mach-s3c44b0/arch.c
MACHINE_START(MBA44B0, "S3C44B0")
MAINTAINER("Mac Wang")
BOOT_MEM(0x0c000000, 0x01c00000, 0x01c00000)
BOOT_PARAMS(0x0c000100)
INITIRQ(genarch_init_irq)
MACHINE_END
其中MACHINE_START(MBA44B0, "S3C44B0")的“MBA44B0”是在asm/mach-types.h 里定义的平台类型BOOT_MEM(0x0c000000, 0x01c00000, 0x01c00000)指定了启动的RAM 地址0x0c000000,特殊功能寄存器地址0x01c00000,BOOT_PARAMS(0x0c000100) 表示内核参数的传递地址。
6.arch/armnommu/tools/Match-types
s3c44b0 ARCH_S3C44B0 S3C44B0 178
178是arch_number
在跳转到内核时,r0=0,r1=arch_number,
7./driver/net/ne.c
dev->base_addr = base_addr = NE2000_ADDR;
dev->irq = NE2000_IRQ_VECTOR;
NE2000_ADDR和NE2000_IRQ_VECTOR分别是RTL8019AS的I/O起始地址和中断向量号,根据硬件连接改成相应的值。
ne_probe1中wordlength=2代表数据宽度为16位,改为wordlength=1代表数据宽度为8位。
二.内核和romfs联系的两种方式
1 使用inird技术,在加载内核前传递参数
static void setup_initrd_tag(void)
{
/* an ATAG_INITRD node tells the kernel where the compressed
* ramdisk can be found. ATAG_RDIMG is a better name, actually.
*/
params->hdr.tag = A TAG_INITRD;
params->hdr.size = tag_size(tag_initrd);
params->u.initrd.start = RAMDISK_RAM_BASE;
params->u.initrd.size = RAMDISK_FLASH_LEN;//k byte
params = tag_next(params);
}
此时initrd的第一个初始化文件为linuxrc,这种方式下romfs根目录下需包含linuxrc。
2 用block memory技术
(make menuconfig时选定romfs 和rom disk support)
driver/block/Blkmem.c
arena[] = {
#ifdef CONFIG_ARCH_S3C44B0
{0, 0x0CC00000, -1},
#endif这样只要将romfs加载到相应的地址0x0CC00000,内核就可以找到。
3 整合kernel和romfs
在调试好内核和ROMFS之后,可以将两个文件整合起来
char romfs_data[];
arena[] = {
#ifdef CONFIG_ARCH_ S3C44B0
{0, romfs_data, -1},
#endif
将romfs.img 转换成romfs.o文件与内核编译在一起,
arch/armnommu/Vmlinux-armv.lds.in
*(.got) /* Global offset table */
romfs_data = .;
romfs.o
romfs_data_end = .;
这样在压缩内核时,romfs和kernel都能被压缩。
以上只是一种实现方法,只要掌握了原理,可以根据自己的需要修改。
在相关的地方必须保持内核和BOOTLOADER一致才行。