bitliu1983 发表于 2009-09-11 13:19

再请教大家一个powerpc异常向量表的问题

再请教大家一个powerpc异常向量表的问题,我用的是E300核,开发板是mpc8313,自己写bootloader(参考uboot),首先要设置中断向量表,E300比较奇怪,没有象E500内核使用IVPR和IVORn寄存器保存中断向量。每个中断向量的入口地址是IVPR+IVORn。IVPR提供中断向量的基址,IVORn提供中断向量的偏移。在linux底下用下面这个宏:
#define SET_IVOR(vector_number, vector_label)       \                                             
      lir26,vector_label@l;         \
      mtspr   SPRN_IVOR##vector_number,r26;   \
      sync

但是在uboot底下。

#define START_GOT         \
    .section    ".got2","aw";   \   
.LCTOC1 = .+32768

#define END_GOT             \
    .text

#define GET_GOT             \
    bl1f      ;   \   
    .text   2       ;   \   
0:.long   .LCTOC1-1f;   \   
    .text         ;   \   
1:mflr    r14   ;   \   
    lwz r0,0b-1b(r14)   ;   \   
    add r14,r0,r14;

#define GOT_ENTRY(NAME)   .L_ ## NAME = . - .LCTOC1 ; .long NAME

#define GOT(NAME)       .L_ ## NAME (r14)

GOT_ENTRY(_start_of_vectors)
GOT_ENTRY(_end_of_vectors)

用got段Global Offset Table,全局向量表来保存,异常函数入口地址,我想问下,这个got全局向量表原理是什么?是怎么保存函数入口地址的?~

Cyberman.Wu 发表于 2009-09-13 14:44

这些编译器相关的东西没搞懂,不过E300和E500的区别我知道,E500是每一个可以独立地设置入口处理的地址,而E300沿用了原来603E系列的处理,可以指定中断向量的起始位置(如果没记错是在MSR中设置的),但他们之间的相对位置是固定的。如ISI通常是0x400处,但如果设置了那个bit,则是0xNNN_400处(记不准确了,好像是FFF)。

bitliu1983 发表于 2009-09-14 16:44

是的,那个是MSR的IP位,可以设置异常向量从高端起始,还是从低端0x000n_nnnn~~
不过,程序编译链接成elf文件后,全局向量表怎么导入这几个函数的地址,这个没搞明白。.got2这个段是在链接脚本里定义的。
arm直接把一个地址load给pc就可以了,比较简单。~
E300没有E500的那个IVORn寄存器。
这个论坛,好像只有我和你做这个涉及powerpc底层的东西啊,其它人都做powerpc的linux应用程序吗?
呵呵,只有我们两个在交流啊!~

Cyberman.Wu 发表于 2009-09-14 18:36

PowerPC + Linux是近两年才流行的吧,以前多数是PowerPC + VxWorks。目前PowerPC集中在通信等一些行业,这些行业几个公司的人估计来这里的很少;而且在大公司里面真正熟悉低层的也就少数人。以前VxWorks里面是直接Hard-coded一小段机器指令到代码的数据区,系统启动时把它拷贝到指定的位置,有一个缺省调用的C函数到时候是以偏移的方式直接修改指令码搞定的,比较直观。你现在用的这个以前我还没接触过。

bitliu1983 发表于 2009-09-22 17:00

再问大侠一个问题,以前我和你讨论了E300采用hash页表方式的地址转换方式,那个基本我搞明白了~
我目前再备份做另外一种地址转换方式,块地址转换方式,BAT机制可以将一连续的大于一页地址的逻辑地址映射到物理内存中。如果有效地址与相应的BAT寄存器匹配,将使用BAT寄存器中的信息来转换有效地址为物理地址。通过16个(8对)特殊寄存器来实现BAT,就是有4对IBAT和4对DBAT,分别对于指令和数据的块地址转换。我想的是对于地址空间,我是每个128k的地址空间都初始化IBAT和DBAT吗?还是说划分地址空间,一部分用IBAT,一部分用DBAT?~

Cyberman.Wu 发表于 2009-09-25 18:51

回复 #5 bitliu1983 的帖子

最近一直出差所以没怎么上来过。映射为相同的还是一部分用IBAT一部分使用DBAT完全取决于你系统中如何去配置,CPU本身并没有规定。对于指令的Fetch,它使用IBAT来完成翻译,而对于Load/Store则使用DBAT,至于具体如何对应,那是系统设计上的事了。如某一段空间(如Flash)仅做Load/Store,那可以只映射DBAT,而如果是可执行代码(有text也有data),则可能要同时在IBAT和DBAT中映射。

bitliu1983 发表于 2009-09-27 17:01

嗯,明白了,我看uboot底下就这么搞的,有text和data的就IBAT和DBAT设置一样,或者都设置成一样,minix3好像也有借鉴意义啊~不过minix powerpc好像没有移植完全,出了一个pdf。我关注了下官网,发现说继续中。
vxworks5.4的代码我一直没找到,或不全!

Cyberman.Wu 发表于 2009-09-28 09:42

VxWorks 5.4好像从来没见过出现在网上,网上出现过的是VxWorks 5.5,以前是在一个嵌入式论坛中下载的,在电驴中应该能找到。不过对于Arch部分那个只有i86,没有PowerPC。有些学校的老师和研究生手中有源代码,如果有认识的你能找到。

Minix感觉是个挺好的东西,至少微内核的概念感觉挺好的,只是人本来就懒还工作很忙,所以仅在早期了解过2.0,Minix3好像已经重新设计了。如果玩熟了给大家推广一把吧。
页: [1]
查看完整版本: 再请教大家一个powerpc异常向量表的问题