Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Exception Windows:避免在堆栈上推送完整的x86上下文_Exception_Assembly_Stack Overflow_Cpu Registers_Threadcontext - Fatal编程技术网

Exception Windows:避免在堆栈上推送完整的x86上下文

Exception Windows:避免在堆栈上推送完整的x86上下文,exception,assembly,stack-overflow,cpu-registers,threadcontext,Exception,Assembly,Stack Overflow,Cpu Registers,Threadcontext,我已经实现了,微软视窗下的一种语言,它使用cactus堆栈来实现并行程序。堆栈块在每个函数上分配 基和正是处理局部变量的合适大小, 表达式临时推送/弹出,并调用库(包括 用于库例程工作的堆栈空间)。这样的堆栈 在实践中,帧可以小到32字节,并且通常是 这一切都很好,除非代码做了一些愚蠢和错误的事情 导致硬件陷阱。。。窗口在哪一点出现 坚持将整个x86机器上下文推到“堆栈上”。 如果包括FP/MMX/etc寄存器,这大约是500+字节, 确实如此。当然,在32字节堆栈上推送500字节 砸不该砸的东

我已经实现了,微软视窗下的一种语言,它使用cactus堆栈来实现并行程序。堆栈块在每个函数上分配 基和正是处理局部变量的合适大小, 表达式临时推送/弹出,并调用库(包括 用于库例程工作的堆栈空间)。这样的堆栈 在实践中,帧可以小到32字节,并且通常是

这一切都很好,除非代码做了一些愚蠢和错误的事情 导致硬件陷阱。。。窗口在哪一点出现 坚持将整个x86机器上下文推到“堆栈上”。 如果包括FP/MMX/etc寄存器,这大约是500+字节, 确实如此。当然,在32字节堆栈上推送500字节 砸不该砸的东西。(硬件推了几句话 在陷阱上,但不是在整个上下文中)

[2012年11月27日编辑:见]

我可以让Windows存储异常上下文块吗 其他地方(例如,到特定于线程的位置)? 然后软件可能会出现异常 点击线程并处理它而不溢出我的 小堆叠框架

我认为这是不可能的,但我想我会问一个更大的问题 观众是否有操作系统标准调用/接口 这会导致这种情况发生吗

如果我能说服MS让我的 进程可以选择定义上下文存储位置“contextp”,该位置 默认情况下,初始化为启用当前旧行为。 然后更换中断/陷阱矢量代码:

  hardwareint:   push  context
                mov   contextp, esp
。。。与

  hardwareint:  mov <somereg> contextp
                test <somereg>
                jnz  $2
                push  context
                mov   contextp, esp
                jmp $1 
         $2:    store context @ somereg
         $1:    equ   *
hardwareint:mov contextp
试验
jnz$2
推送上下文
mov contextp,尤指
jmp$1
$2:存储上下文@somereg
$1:equ*
保存somereg等所需的明显更改

[我现在要做的是:检查每个函数生成的代码。 如果有机会产生陷阱(例如,除以零), 或者我们正在调试(可能是错误的指针deref等),添加 为FP上下文提供足够的堆栈帧空间。堆栈帧 现在的结果是~~ 500-1000字节的大小,程序不能 尽可能地递归,这有时对于 我们正在编写应用程序。因此我们有一个可行的解决方案, 但这会使调试复杂化]

编辑8月25日:我已经设法把这个故事告诉了一位微软的内部工程师 谁显然有权发现MS中的谁可能 照顾也许解决问题的希望渺茫

编辑9月14日:Kennal Group Architect女士听到了这个故事,并表示同情。他说,MS将考虑解决方案(如提议的那样),但不太可能在服务包中。可能需要等待下一版本的Windows。(叹气……我可能会变老……)

编辑:2010年9月13日(1年后)。微软方面没有采取任何行动。我最新的噩梦:在Windowsx64上运行32位进程时遇到陷阱,会在中断处理程序假装推送32位上下文之前推送堆栈上的整个X64上下文吗?这会更大(两倍于整数寄存器,两倍于宽度,两倍于SSE寄存器(?)

编辑:2012年2月25日:(1.5年过去了…)微软方面没有任何反应。我猜他们只是不在乎我的那种平行性。我认为这是对社会的伤害;MS在正常情况下使用的“大堆栈模型”通过吃掉大量VM,限制了一个人在任何时刻都可以进行的并行计算量。PARLANSE模型将使一个应用程序在各种运行/等待状态下有一百万个活动“颗粒”;这在我们的一些应用程序中确实发生了,在这些应用程序中,一个1亿节点的图形是“并行”处理的。PARLANSE方案可以用大约1Gb的RAM实现这一点,这是非常容易管理的。如果您尝试使用MS 1Mb“大堆栈”,您将需要10^12字节的虚拟机来存储堆栈空间,而且我非常确定Windows不会让您管理一百万个线程


编辑:2014年4月29日:(4年过去了)。我猜MS就是不这么认为。我已经在PARLANSE上做了足够多的工程,所以我们只在调试期间或有FP操作进行时支付大堆栈帧的价格,所以我们设法找到了非常实用的方法来解决这个问题。MS继续让人失望;不同版本的Windows在堆栈上推送的内容量似乎相差很大,远远超出了硬件环境的需要。有一些迹象表明,这种可变性是由非MS产品(如防病毒)在异常处理链中卡住鼻子造成的;为什么他们不能在我的地址空间之外这样做?任何情况下,我们只需为FP/debug陷阱添加一个较大的斜率因子,然后等待字段中不可避免的MS系统超过该值即可处理所有这一切。

Windows异常处理称为SEH。IIRC您可以禁用它,但您正在使用的语言的运行时可能不喜欢它。

如果Windows使用x86硬件来实现其陷阱代码,您需要环0访问(通过驱动程序或API)来更改陷阱使用的门

x86的gate概念包括以下几点之一:

  • 当整个寄存器上下文(包括返回地址)被推送到当前堆栈(=当前esp)上时调用的中断地址(代码段+偏移指针),或
  • 一个任务描述符,它切换到另一个任务(可以看作是硬件支持的线程)。所有相关数据将被推送到该任务的堆栈(esp)中
你当然想要后者。我会看看它是如何实现的,这可能比问谷歌更有效

我的猜测是,不幸的是,您需要实现一个驱动程序才能使其在x86上工作,根据我的猜测,驱动程序不可能在IA64平台上更改它。第二个最好的选择可能是在yo中交错空间