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

发布于 2022-09-18 03:11:38 字数 2118 浏览 10 评论 0

再请教大家一个powerpc异常向量表的问题,我用的是E300核,开发板是mpc8313,自己写bootloader(参考uboot),首先要设置中断向量表,E300比较奇怪,没有象E500内核使用IVPR和IVORn寄存器保存中断向量。每个中断向量的入口地址是IVPR+IVORn。IVPR提供中断向量的基址,IVORn提供中断向量的偏移。在linux底下用下面这个宏:
#define SET_IVOR(vector_number, vector_label)       \                                               
        li  r26,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             \
    bl  1f      ;   \   
    .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全局向量表原理是什么?是怎么保存函数入口地址的?~

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

罪#恶を代价 2022-09-25 03:11:38

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

归属感 2022-09-25 03:11:38

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

农村范ル 2022-09-25 03:11:38

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

轻许诺言 2022-09-25 03:11:38

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

心作怪 2022-09-25 03:11:38

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

风尘浪孓 2022-09-25 03:11:38

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

德意的啸 2022-09-25 03:11:38

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

Minix感觉是个挺好的东西,至少微内核的概念感觉挺好的,只是人本来就懒还工作很忙,所以仅在早期了解过2.0,Minix3好像已经重新设计了。如果玩熟了给大家推广一把吧。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文