作者:清雅竹gf_644 | 来源:互联网 | 2023-05-17 12:33
我想在vc中一次执行少量的代码,由于一些特殊的原因不能被中断,怎么才能做到这一点呢?由于windows在用户模式下不可以执行关中断的特权指令,所以无法通过关中断来实现。
我想在vc中一次执行少量的代码,由于一些特殊的原因不能被中断,
怎么才能做到这一点呢?
由于windows在用户模式下不可以执行关中断的特权指令,所以无法通过关中断来实现。
37 个解决方案
也就是说不能让任何消息中断你的程序咯,如果知识一点点代码的话,应该不会中断掉的,CPU的任务调度时间片不短啊。
不过要是很特殊的指令来了的话那就另当别论了!
实在不行,那你就来个DDK好了,取得0 RING的特权,靠,看谁还打断你!
sohou说的不错,使用驱动程序来执行你的代码,系统不能中断。不过,假如发生了问题,那么代价将是:蓝屏~
提高线程的优先级也是不行的,好像window对优先级的实现有问题,只是简单的按照优先级排队,其它线程还是有机会被执行。
驱动程序我也试过,不过和应用程序的联系比较复杂,而且代价比较高呀。如果谁有这方面的代码,可以给我发一份吗。
API:
EnterCriticalSection()
DeleteCriticalSection()
InitializeCriticalSection()
LeaveCriticalSection ()
to: ShaftWhy(归去来兮)
设置实时优先级是没有用的,我试过。
xjtt2000(沧海一笑):
给程序加锁。怎么个加锁法?
to QunKangLi(雾痕):
你说的是进程内同步,是阻止进程内其它程序进入,而不是阻止中断。
写驱动,把IRQL提高到PASSIVE_LEVEL级别以上,不接受线程调度。
但是,运行在任何IRQL级上的活动都可以被更高IRQL级上的活动中断。所以彻底不响应中断的话还是使用cli吧。不过不能太长时间。
这是不可能实现的。。。
熟悉操作系统的人都知道。
除非你能控制到你的那段代码恰好在一个操作系统调度的时间片里执行完,就像上面有个兄弟说的那样
实在不行,那你就来个DDK好了,取得0 RING的特权,靠,看谁还打断你!
---------------------
软件中断呢?硬件中断呢?
Ring 0不是万能的
fzd999(花差花差):
不会吧,,,驱动也分优先级别的,低级别的驱动绝对有可能被高级别的驱动所中断,还有硬件中断这些。。。
其实写驱动时关中断即可,确实如此,不过我不知道操作系统是否有什么原语可以简单一些。
写驱动还是比较麻烦的呀,搞不好操作系统就崩溃了。而且要传递参数也比较麻烦的。
还有,我觉得写软中断或许可以实现,在其中就是根据eax的值决定是关中断还是开中断,
不过我的驱动没有加载成功,如果谁有这方面的代码,希望提供一下。
os理论中确实有原语一说,不过到现在没有碰见过。
硬件中断优先级最大,写驱动又怎样?我强行把电源拔了你不照样不行。
可惜不是LINUX,没有原语给我们用:(
有难度,你不妨发个消息给Mr袁峰咨询一下:)
这问题好难.在说软件都不是咱们写的.没办让操作系统呀.编程器按我们的思想做事.同意上楼的N次发言
写驱动参数传递比较复杂,我没写过,哪为仁兄帮个忙?
还有,本来要执行的代码很少,却要进行2次内核模式与用户模式的切换,很费cpu时间的,
我觉得不太合算,但也没有什么好办法。
其实我想这么做的目的很简单,就是有一个队列,一个实时线程从队首读元素,读完后删除,
但是这个线程不可以被阻止执行(即不可以通过临界区来同步,因为临界区的原理是被别人占用时阻止进入)。另外的线程从队尾增加数据。增加只需要很少的代码,但是有可能在增加过程中被实时线程中断,而产生问题。提高其它线程在增加数据时的级别也没有用,因为实时线程是硬件中断,所以想把增加元素的代码一次执行完,让实时线程稍微等这一点时间是没有什么问题的。但利用同步就会出现问题。
其实解决问题很多途径
可不可以回头看看问题,是否还有其它的解决途径?
在一个支持多线程/时间片轮转的操作系统里,
控制cpu为你的进程独享,这本来就是个矛盾的问题
那解决途径就成为:你只能跳过操作系统的调度,自己去控制
最近看了在用户态执行特权指令的文章,没怎么弄清楚,不知有哪位高人能给个例子