skyeye的初始化

原创 2007年09月24日 23:56:00

今天早早地回到了住处,早上起来感觉到脖子很不舒服,白天在实验室里扭动一下都不容易,得好好善待自己,身体是革命的本钱啊!

看了一下以前的blog,本来很早就想写关于ipv6的总结,可是过去都快一个月了,现在都提不起兴致,看来干什么都得趁热打铁,学习也是,不及时总结好多

心得,经验都白白丢失了,将来想捡起来又得费一番功夫。不知道什么时候把这个好习惯给丢了  :(

这段时间因为产品开始联调,所以接触到了单板,bootloader等东西,虽然以前有过相关的学习,但是进入真正的环境还是第一次。所以刚开始好多东西不清

楚,好在经过两个星期的学习,也算是渐渐弄清楚了一些东西。

嵌入式系统开发是时下很热的话题,在各个领域的应用极为广泛,所以有很多人都想望着上面发展。另一方面因为其设计到很多底层的软硬件只是,更是能吸

引一部分底层技术爱好者的兴趣。可是对于很多人来说,嵌入式开发板需要的一笔投入让其望而却步。正是在这种背景下,skyeye--天目应运而生。关于

skyeye的介绍,百度一下就可以知道。最新本版应该是1.2。研究了他一个星期,主要是看它的初始话代码,因为我想弄清楚他的配置文件里面各项究竟是什么

含义。它的源码里面用到了大量的函数指针给跟踪带来了很大的麻烦。在main函数中解析完输入参数后,调用init函数,主要的初始化流程可以解释如下:
1)init: 如果是第一次调用init,那么初始化device--->初始化所有以支持的设备:net,lcd,flash等,将其放入到全局二维指针global_mod_set中;初始化

arch--->初始化所有支持的架构,目前包括arm,bfin,mips,clodfire,ppc,将每种架构对应的arch_config_t 放入到全局数组skyeye_archs中;
2)读取config文件,并一步步解析里面的选项,这里用到了一个重要的变量skyeye_option_t skyeye_options;它的每一项表示对于某种选项,应该用那个函数

进行解析。下面是一些常用的解析过程:
   A)arch:一般来说这是首先被解析确定的,有些选项依赖于它。从arch_config_t skyeye_archs[]中,找到于配置相等的arch(arm,ppc,mips等),赋给

skyeye_config.arch;
   B)cpu:如果已经解析了arch,那么调用此arch的cpu解析函数,初始化全局结构cpu_config_t *p_arm_cpu;如果还没有初始化arch,则默认arch为arm。以

arm的cpu解析为例,他在全局结构arm_cpus中找与配置选项一致的cpu name,并用*p_arm_cpu指向匹配的项;
   C)mach:此选项指定特定的开发板,是整个skyeye运行的中心配置结构。与cpu的解析类似,都是调用arch的mach解析函数(每种arch对应若干种cpu,针对每

种cpu有可能有若干种开发板,所以,arch是根本)。同样,也是在一个全局数组machine_config_t arm_machines中,找mach name与配置中一致的项,并赋值

给skyeye_config.mach。
   D)mem:类似,调用以初始化好的arch的mem解析函数。以arm为例,主要工作是初始化mem_config_t arm_mem结构体。
typedef struct
{
 int bank_num;
 int current_num; /*current num of bank */
 mem_bank_t mem_banks[MAX_BANK];
} mem_config_t;
    核心结构是mem_banks-->记录了读写数据的方法,此mem_bank对应的起始地址,文件名,类型(RAM,ROM,FLASH)。解析函数的工作就是初始

arm_mem.mem_banks,依据选项中的MAP,TYPE,FILE等参数,初始各mem_banks的成员。如果有FILE选项,则将指定的文件名拷贝到mem_banks中的相应char数组

中(仅仅是拷贝文件名,真正的装入文件将在arm_reset_state-->ARMul_Reset-->mem_reset 函数调用中进行);如果有BOOT=YES,则将

skyeye_config.start_address = mb[num].addr--->此mem_bank的起始地址。
  其他的选项的解析思路应该与此类似,只是每种选项的特性不同,需要初始化的设置的变量不一样而已。比如net,在linux平台下,需要特定的设备文件存

在,所以要求你装载某个net驱动模块,以在/dev下面生成指定的设备文件。
  现在的版本的skyeye与internal文档的描述有些出入,但实现思路应该还是不变的。核心的结构还是skyeye_option_t 。与设备有关的是

machine_config_t.struct device_desc **devices;可以把它看作是指向了一张表,里面的每一项都是指向此machine的某个设备的指针。结构体struct

device_desc 是描述具体的设备。里面有大量的函数指针,用于读取字节,字等,进行I/O操作的函数。这些函数指针大致可以分为两类(这是我自己归纳的,

不一定正确。参考源码中的 set_device等函数):IO/mem/init类,此设备特有的操作函数。设备描述结构体中还有一个指向其所属的设备类型的指针,以获得

一些此类型设备共有的操作函数。
  因为对bootloader比较感兴趣,所以特别关注了一下程序运行的起始地址,以下是确定方法。
    相关的变量有三个 static unsigned long load_addr = 0x0;
                     static unsigned long load_addr_mask = 0xffffffff;
                     uint32_t             skyeye_config.start_address;
    1)通过-e参数输入elf文件名,-l参数输入load_addr ,load_addr_mask。没有-l参数的话,elf将被装载到它的入口处,也就是elf文件里的指定的地址;

否则装载到-l指定的地址。通过 tea_load_exec
    2)通过内存选项的boot,可以指定 skyeye_config.start_address。在tea_load_exec 中,如果skyeye_config.start_address为零,那么将会被置为elf

文件的入口。
    3)在main函数中,init后,如果输入了elf文件,则调用tea_load_exec (exec_file, 0),载入elf文件,设置skyeye_config.start_address。并把pc指针

设置为(skyeye_config.start_address & load_addr_mask)|load_addr --->  相当于是在skyeye_config.start_address的基础上偏移 load_addr ???有时间

可以试验一下

所以,指定程序运行的起始地址有一下几种方法:
1) 在elf文件中,通过链接器等指定程序的入口,不用-l参数,boot选项。那么从elf的entry开始执行
2) 使用-l参数,指定load_addr,和load_addr_mask ,那么从load_addr开始执行
3) 在mem设置中,指定boot=yes,那么起始运行地址为(skyeye_config.start_address & load_addr_mask)|load_addr。如果没有elf文件,则起始地址就是此

mem_bank的起始地址。如果有elf文件,又有-l选项,那么依据上式确定起始地址。 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

在skyeye上运行最新的S3C6410的Linux内核版本

1、交叉编译工具链skyeye是模拟硬件开发板的模拟器,想在skyeye上运行linux内核需根据你所需要的体系结构来进行交叉编译。上s3c6410是arm11系列的开发板,所以我们需要arm-lin...
  • oubang
  • oubang
  • 2011-05-26 21:22
  • 1842

安装Skyeye学习ARM汇编

对于希望学习ARM汇编的同学而言, 购买ARM开发板进行板上实测无疑是一个有效的方法,不过购买ARM开发板需要一笔费用,而且每次测试都需要连接开发板,比较麻烦。如果有一个ARM的模拟器就好了,抱着这样...

SkyEye 仿真

http://www.cnitblog.com/schkui/default.html?page=4 SkyEye是一个可以运行嵌入式操作系统的硬件仿真工具,这样就可以在没有硬件条件下来进行嵌入...

Ubuntu 10.10下安装配置SkyEye 1.3.1

Ubuntu 10.10下安装配置SkyEye 1.3.1   1.安装所需要的基本库   sudo apt-get install libatk1.0-0 libc6 libcairo2 lib...

Linux SkyEye安装交叉编译器

Linux SkyEye对于电脑使用的玩家的常用软件,然后我就学习及深入的研究Linux SkyEye,在这里和大家一起探讨Linux SkyEye的使用方法,希望对大家有用。Linux Sk...

Ubuntu 16.04 编译安装 SkyEye 1.3.5

本文介绍在操作系统 Ubuntu 16.04 中编译安装硬件仿真软件 SkyEye 1.3.5 的方法。 Ubuntu 12.04 安装 SkyEye 1.3.5 以及 SkyEye Testsu...

VMware 6.5+fedora 10下安装skyeye

操作系统:VMware 6.5+fedora 10( 从http://sourceforge.net/project/showfiles.php?group_id=85554 下载)        ...

RTEMS 4.9.4 CSB337 的 skyeye 仿真环境的建立

(原创,欢迎转载,但请注明出处,谢谢。)因为我一直有自己的开发板,公司有这样的条件,并且开发的代码很多与外设有关系,基本没法用软件仿真,所以基本没用到skyeye。最近忙着写rtems的文章,有朋友问...

在ubutntu的skyeye环境下调试ucos-ii

参考网页:http://blog.csdn.net/chenvsa/article/details/7011562 要用的工具是: 1.skyeye 2.arm-elf-tools 3.u...

Skyeye中运行操作系统

利用croostool脚本编译工具建立好的交叉编译环境进行skyeye的安装: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)