网站导航: 首页 > 设计参考 > 正文 文章搜索
关于三星S3C44B0X目标板的uClinux Bootloader
 
文章编号:
090105113329
文章分类: 单片机 ARM
点 击:
...
关 键 词: S3C44B0X,uClinux,Bootloader,三星
文章来源:
网络
摘 要:
嵌入式Linux系统通常由三部份组成:Bootloader、Kernel和File System。其中Bootloader是在系统启动之后、Kernel运行之前所执行的第一段代码,其任务是为调用Kernel准备必要的软硬件环境。由此可见,Bootloader是非常

       2. 加载uClinux Kernel
       Bootloader是否需要执行加载操作,取决于uClinux Kernel Image的类型。根据不同的配置方式,可以生成以下几种uClinux Kernel Image:

       2.1 非压缩,非XIP
       XIP(eXecute In Place)是指在存放代码的位置上就地运行程序;而非XIP就是指在运行之前需要对代码进行重定位。该类型的uClinux Kernel Image以非压缩格式存放在Flash中,需由Bootloader加载到RAM然后调用。该类型在开发调试阶段最为常用。

       2.2 非压缩,XIP
       该类型的uClinux Kernel Image以非压缩格式存放在Flash中,不需加载,由Bootloader直接调用。复制Data段和清零BSS段的工作由Kernel自行完成。该类型常用于RAM空间非常有限的系统中,缺点是程序在Flash中运行的速度稍慢。

       2.3 RAM自解压
       压缩格式的uClinux Kernel Image由开头的一段自解压代码和其后的压缩数据组成。由于是以压缩格式存放,因此Kernel只能以非XIP方式运行。RAM自解压的uClinux Kernel Image存放在Flash中,由Bootloader加载到RAM中的临时空间,然后调用自解压代码。Kernel被解压到最终的目标空间然后运行;压缩镜像所占据的临时空间在随后由uClinux回收利用。该类型占用Flash较少,且运行速度较快,在最终产品中更为常见。

       2.4 ROM自解压
       解压缩代码也能够以XIP的方式在Flash中运行。ROM自解压的uClinux Kernel Image存放在Flash中,不需加载,由Bootloader直接调用其自解压代码,将uClinux Kernel解压到最终的目标空间并运行之。与RAM自解压相比,ROM自解压并不真正节省RAM,而且解压缩的速度较慢,因此实用价值不大。

       3.设置内核启动参数
       Linux 2.4版本以后的内核都期望以标记列表(tagged list)的形式来接收启动参数。每个标记存放在一个tag结构中,每个tag结构由标识被传递参数的tag_header结构以及随后的参数值组成。通常由Bootloader设置的启动参数有:ATAG_MEM、ATAG_CMDLINE、ATAG_SERIAL等。启动参数的标记列表以 ATAG_CORE开始,以ATAG_NONE结束,代码示例如下。其中0x0C000100是内核启动参数在RAM中的基地址,Bootloader应当将要传递的启动参数复制到该处RAM中;指针params的类型是struct tag。宏tag_next()以指向当前标记的指针为参数,计算下一个标记的起始地址。
       params = (struct tag *)0x0C000100;
       params->hdr.tag = ATAG_CORE;
       params->hdr.size = tag_size(tag_core);
       params->u.core.flags = 0;
       params->u.core.pagesize = 0;
       params->u.core.rootdev = 0;
       params = tag_next(params);
     
       params->hdr.tag = ATAG_NONE;
       params->hdr.size = 0;

       对应地,在Linux内核源码arch/armnommu/mach-s3c44b0/arch.c中设置内核启动参数在RAM中的基地址:
       MACHINE_START (S3C44B0, "44B0")
     
       BOOT_PARAMS (0x0C000100)
     
       MACHINE_END

       4.调用uClinux Kernel
       Bootloader调用Kernel的方法是直接跳转到其第一条指令处。对于ARM处理器,在跳转时应当满足下列条件:r0=0;r1=Machine ID;禁止IRQ和FIQ;处理器运行在Supervisor模式;关闭MMU;关闭Data Cache。

       对于S3C44B0X,它没有MMU,其Cache是指令与数据合一的,因此只能全部关闭。各种ARM处理器的Machine ID均由www.arm.linux.org.uk分配;S3C44B0X的Machine ID是178。据此,用C代码实现的Kernel调用示例如下,其中r0和r1的值通过参数传递:
       void (*CallKernel)(int zero, int mach) = (void (*)(int, int))KERNEL_ADDR;
       CallKernel(0, 178);

       5. 辅助功能
       完整的Bootloader还应该允许更新Flash中存放的uClinux Kernel Image以及Bootloader自身。为此,必要的辅助功能包括:从主机下载文件到目标板的RAM;用RAM中的数据烧写Flash;以及实现上述操作所需的人机交互接口,这里就不赘述了。

 
相关文章:

上一页 12
 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4