SkyEye的地址映射接口的设计和实现

                 addr_mapping 的使用和测试
1、addr_mapping 接口描述
Addr_mapping 接口用来申请一段地址空间,并来控制这段地址空间的访问。其原型定义在
头文件[common/include/bank_defs.h:71]如下:
   exception_t addr_mapping(mem_bank_t* bank);
参数 bank,是客户需要分配和填充的一个数据接口,定义如下:
typedef struct mem_bank
{
          unsigned int addr, len;
          char (*bank_write)(short size, int offset, unsigned int value);
          char (*bank_read)(shortsize, int offset, unsigned int *result);
          char filename[MAX_STR];
          /* the name of object mapping to the bank */
          char* objname;
          unsigned type;
} mem_bank_t;
Mem_bank_t 的域 addr 是这段地址空间的起始地址,len为这段地址空间的长度。
Bank_write 和 bank_read 分别为这段地址的读写函数。当目标程序对这段地址空间进行访问
的时候,SkyEye 会调用这段地址空间对应的 bank_write 和 bank_read进行访问。
Filename 为加载的文件,在初始化这段地址空间的时候,SkyEye 可以把一个数据文件加载
到这段地址空间去。
objname 是一个字符串,用来标志一个对象的名称。
type 是这段地址空间的类型,有只读内存,可读写内存和 IO 这三种类型。
2、编程示例
编程示例的代码片段如下:
          /* 分配一个 mem_bank_t 的数据结构 */
          mem_bank_t *bank = (mem_bank_t *)malloc(sizeof(mem_bank_t));
          /* 初始化地址 */
          bank->addr =base_addr;
          bank->len = len;
          bank->bank_write = uart_16550_write;
          bank->bank_read =uart_16550_read;
           bank->type = MEMTYPE_IO;
           bank->objname = &uart->name[0];
           bank->filename[0] = '/0';
           /* register io space to the whole address space */
           addr_mapping(bank);


3、测试 addr_mapping 接口
3.1 使用命令测试
在执行完skyeye 之后,可以用show-map 命令显示当前的地址空间映射,看看 addr_mapping
申请的地址空间是否存在:
ksh@server:~/svn/skyeye/skyeye_git/systemc_hello> ../common_uart_install/bin/skyeye -e hello
SkyEye 1.3.1
SkyEye is an Open Source project under GPL. All rights of different parts or modules are reserved
by their author. Any modification or redistributions of SkyEye should not remove or modify the
annoucement of SkyEye copyright.
Getmore information about it, please visit the homepage http://www.skyeye.org.
T "help"to get command list.
  ype
  In insert_bank, insert bank at 0
Hello X world
Hello X world
Hello X world
(skyeye)show-map
Start Addr                              Length                    Type
0xe1000000                                          0xe1001000                             IO
3.2 读写申请的地址空间
我们可以修改 arm_hello 的测使用例,让 arm_hello 对我们申请的地址空间进行访问,看看
我们的读写函数是否被调用。具体步骤如下:
1、 假设我们使用 addr_mapping 申请了地址 0xe100_0000 到 0xe100_1000 这段地址空间。
2、 然后修改 hello.c, 让 paddr 的值等于 0xe100_0000,如下代码
      long* paddr=(long*)0xe1000000;
3、然后运行 hello 测试用例,看看我们前面注册的读写函数是否被调用。

你可能感兴趣的:(数据结构,exception,IO,测试,command,insert)