wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
阅读:2091回复:28

关于修改OAL--给分的 (wxl_50685330请进)

楼主#
更多 发布于:2004-12-08 14:02
我想把我的ISR放在OAL层, 我是这么做的:
(1)修改%_WINCEROOT%\Public\common\oak\csp\i486\oal下面的fwpc.c,在其中增加我自定义的ISR,并在InitPIC函数中与指定的中断号相关联。
(2)在上面目录下,利用命令行编译生成i486oal.lib(确实生成了)

请问大侠:
是不是这样做就可以了?以后创建的工程都会使用更新后的i486oal.lib?

[编辑 -  12/9/04 by  wwei_wang]
Come on, let us drive the world.
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-08 15:39
对头!
根据地的兄弟们,团结就是力量
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-09 10:35
(续)
wxl_50685330大哥,我有几个问题不太明白,请耐心你听我罗嗦几句 :P:
(1)关于函数PeRPISR().从代码可以看出它负责在ISR列表中定位对应的ISR来执行。可不可以这么理解:在所

有的中断被真正处理之前,内核都要先调用PeRPISR()函数?我说的是对所有的中断。
(2)在函数InitPIC()中,有
 /* Setup the PeRP interrupt handler and enable the PeRP interrupt in the BasePSR */
    for (i = 64; i < 80; i++)
        HookInterrupt(i, (void *)PeRPISR);
这里,应该是初始化16个中断服务例程吧?但是变量i为什么是从64开始,一直到80?
(3)我是通过下列代码把中断9和我的ISR相连的
/* Setup the PeRP interrupt handler and enable the PeRP interrupt in the BasePSR */
    for (i = 64; i < 80; i++)
        HookInterrupt(i, (void *)PeRPISR);
    HookInterrupt(9, myisr); // 我的isr.
这么做有问题吗?这里应该是9还是73?(64+9=73)

请wxl_50685330以及其他各位大虾指点迷津,谢谢!
Come on, let us drive the world.
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-12-09 15:13
哇,为了回答兄弟的问题,我复习了半天喔,好久没有弄x86了:)))

我看了一下你说的东西,我觉得是这样:

我看了一下pc.h的定义,PeRPISR是处理8259的16个硬件中断的函数(InitPIC写的64到80共16个,记得pc是2个8259级联的)。你可以看到它把16个中断的中断向量都指向了PeRPISR。所以这个函数只处理硬件中断(不包括nmi中断等)。

这里选择64-80这16个中断向量来处理硬件中断是cepc自己的安排,不过我查了一下bios中断向量表安排这部分好像有冲突,不知道怎么回事,因为Pc跑cepc需要使用bios服务吧,不应该有冲突啊,要不就是我查的资料太老了:(


你的中断号9如果是8259给出的数字(即int9)的话就需要从64开始算,即73,如果是你自己假定的也可以随便安排,只要不和bios冲突就行,你可以随时用int n来模拟一个硬件中断。


好久没操练了,说错的地方原谅哈:)
根据地的兄弟们,团结就是力量
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-12-09 16:28
谢谢wxl_50685330大哥的鼎力相助,小弟真是感激涕零啊。
你的解答我还没来得及仔细研究,奉上10分先,请大哥笑纳! :P :P  :D
Come on, let us drive the world.
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-12-09 16:44
谢谢wxl_50685330大哥的解答,有一点小弟还是不太明白,你就帮人帮到底吧:
 :P
(1)前面你说“你的中断号...如果是你自己假定的也可以随便安排,只要不和bios冲突就行”,这是什么意思?自己假定?随便安排?还请大哥明示。
(2)怎么用int n来产生一个硬件中断?在哪里调用啊? 是在应用中利用汇编调用它吗?:D
(3)你是如何使用HookInterrupt()函数的?假设要将硬件中断号9与自定义的ISR相关联,你是在哪里定义ISR的?又是在哪里调用HookInterrupt()的?如何调用的?请大哥给出代码示例,小弟不胜感激。

好像我的问题是挺多,不过还是希望大哥不嫌小弟罗嗦啊,耐心解答哈哈:)

[编辑 -  12/10/04 by  wwei_wang]
Come on, let us drive the world.
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-12-10 14:03
......你娃的功力越来越深了,说话也和哥哥一样,都是一大片一大片的了,佩服佩服!!!!:)))))

1.如果你想模拟一个中断,你可以自己指定一个值(比如就是9吧),并在中断向量表中相应位置(偏移9*4)指定你的isr的入口地址,在需要模拟中断时用int 9(x86汇编指令)来调用isr,当然如果是硬件中断也这么做

2.用那个hookinterrupt你不是会了吗?你看的代码里面不就有的嘛,咋个还在问喔???你只是注意硬件中断是9,这个值是相对于8259的中断0的,我看你说的那部分代码,就那个initpic里面对8259编程不是设了8259的int 0的基中断号是0x40嘛,所以后面他设isr的时候从64开始的三,你应该设成64+9,如果你要加自己的isr的话不用单独做了,你就把你的中断服务写到PeRPISR()里面就可以了,这里你可以指定你的中断号是9就行
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-12-10 14:33
我看到你在那边的帖子里说的了,我没仔细看代码执行流程,initpic在oeminit之前还是之后执行?你应该在initpic之后来hook,而且使用73(硬件中断号9),就写hookinterrupt(73,UrISR);不过你也可以按刚才说的直接改PeRPISR()
根据地的兄弟们,团结就是力量
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-12-10 16:42
经wxl_50685330大哥一番讲解,小弟真是豁然开朗啊,哈哈

对了大哥,你前面说:
“1.如果你想模拟一个中断,你可以自己指定一个值(比如就是9吧),并在中断向量表中相应位置(偏移9*4)指定你的isr的入口地址,在需要模拟中断时用int 9(x86汇编指令)来调用isr,当然如果是硬件中断也这么做”

问题:
(1)你说的方法在DOS下我知道如何实现。
(2)在CE下,执行Initpic中hookinterrupt(73,UrISR);之后,是不是就等价于将UrISR的入口地址放到中断向量表中9号中断对应的位置了?这样的话我就可以用汇编指令int 9 来触发硬件中断,对吗?如果我的理解不对,还请你不吝赐教
 :P
Come on, let us drive the world.
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-12-10 17:09
是放到了73号中断的对应位置

兄弟儿,上次我记得你弄过Hive registry的吧,那边有个兄弟在问,我告诉他找你了:)))
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-12-10 17:10
是放到了73号中断的对应位置

兄弟儿,上次我记得你弄过Hive registry的吧,那边有个兄弟在问,我告诉他找你了:)))

http://www.driverdevelop.com/forum/html_83007.html?1102668663
根据地的兄弟们,团结就是力量
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-12-10 18:20
谢谢wxl_50685330大哥指点!我去试试,我会把结果告诉你的。
对了大哥,我哪能跟你比啊,我说话只是一小片一小片的,你说话才是一大片一大片di
 :P :P :P

另外,刚才那个兄弟照过我了,他的板子是ARM架构的,我给了他一些建议,不知对他是否有帮助 :cool:
Come on, let us drive the world.
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-12-13 15:24
哈哈,谦虚喔,现在有超英赶美之势!
根据地的兄弟们,团结就是力量
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-12-13 15:27
岂敢岂敢 :P :P :P :P
Come on, let us drive the world.
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-12-14 10:08
wxl_50685330大哥,问题还是没有解决啊,你再帮我看看吧:)))
我想利用汇编指令int 9来触发硬件中断9,我是这么做的:
运行平台是:PB的Emulator
我修改了OemIocontrol,并添加了相应代码,与触发中断相关的主要代码如下:
。。。
BOOL ret = TRUE;
__try {
         _asm {
              int 9
         }
      } __except (EXCEPTION_EXECUTE_HANDLER) {
                ret = FALSE;
        }
。。。
我重新编译了(先clean,然后rebuild platform)。然后在应用中调用KernelIocontrol,当代码执行到int 9时,产生例外,每次都是这样。不知为何?究竟如何模拟硬件中断还请大哥多多指点! :P :P
Come on, let us drive the world.
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-12-14 13:11
喂,你娃哪儿弄这么个东西,头都看晕了,有点儿拉风喔,哈哈


兄弟儿,你不是把你的9号中断安排在了73号位置得嘛,用int 73三,咋个搞起的嘛:)))
ps : int n指令工作为,从中断向量表基址处加n*4的位置得到中断服务入口地址并跳转到那里执行

根据地的兄弟们,团结就是力量
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-12-14 13:39
真是英雄难过美人关啊,唉,看样子有人要小心了 :P :P :P :P

多谢大哥指点,我再试试先!!

 :cool:

[编辑 -  12/14/04 by  wwei_wang]
Come on, let us drive the world.
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-12-14 13:52
哪个要小心???说的是我了吧,哈哈
根据地的兄弟们,团结就是力量
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-12-14 14:02
你是得小心点,不过还有一个人得要小心你了,哈哈哈哈
Come on, let us drive the world.
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-12-14 14:51
哪个要小心的,不要怕哈,我不吃人的哈

革命成功没有喔?应该没得问题了三
根据地的兄弟们,团结就是力量
上一页
游客

返回顶部