网易首页 > 网易号 > 正文 申请入驻

微软技术专家谈x86架构的怪异之处

0
分享至

  【CSDN 编者按】1978年6月8日,Intel发布了新款16位微处理器“8086”,也同时开创了一个新时代:x86架构诞生了。x86指的是特定微处理器执行的一些计算机语言指令集,定义了芯片的基本使用规则,一如今天的x64、IA64等。它不仅成就了Intel如日中天的地位,也成为了一种业界标准,即使是在当今强大的多核心处理器上也能看到x86的身影。

  微软技术专家Raymond Chen参与Windows开发已经25年了,在实际的操作中,他认为X86构架有很多奇怪之处。

  原文地址:https://devblogs.microsoft.com/oldnewthing/20220418-00/?p=106489

  本文由CSDN翻译,转载需注明来源出处。

  译者 | 章雨铭 责编 | 张红月

  出品 | CSDN(ID:CSDNnews)

  以下为译文:

  最近,我发现x86架构还有一个和其他的架构不同的地方——Windows结构化异常的管理方式。

  在Windows上,所有其他架构都是通过使用unwind代码和声明为元数据的其他信息来跟踪异常处理。如果在其他架构上单步执行一个函数,就不会看到与异常处理相关的任何指令。只有在发生异常时,系统才会在元数据中的异常处理信息中查找指令指针,并使用它来决定要执行的操作:应该运行哪个异常处理程序?哪些对象需要销毁?和其他诸如此类的问题。

  但奇怪的是,在Windows上,x86在运行时跟踪异常信息。当控制进入一个需要处理异常的函数时(要么是因为它想要处理异常,要么只是因为它想在异常被抛出函数时运行析构函数),代码必须在一个通过堆栈的链接列表中创建一个条目,并以.NET中的值为锚。在Microsoft Visual C++的实现中,链接列表节点还包含一个整数,代表当前函数的进度,每当需要销毁的对象列表发生变化时,该整数就会被更新。它在一个对象的构建完成后立即更新,并在对象的销毁开始前立即更新。fs:[0]

  这个特殊的整数是一个非常麻烦的问题,因为优化器视其为废弃储存,想把它优化掉。的确,有时它确实是废弃储存,但有时它不是。

  struct S { S(); ~S(); };

void f1();void f2();

S g()S s1;f1();S s2;f2();return S();

  此函数的代码生成过程如下:

  struct ExceptionNodeExceptionNode* next;int (__stdcall *handler)(PEXCEPTION_POINTERS);int state;

S g()// Create a new nodeExceptionNode node;node.next = fs:[0];node.handler = exception_handler_function;node.state = -1; // nothing needs to be destructed

// Make it the new head of the linked listfs:[0] = &node;

construct s1;node.state = 0; // s1 needs to be destructed

f1();

construct s2;node.state = 1; // s1 and s2 need to be destructed

f2();

construct return value;node.state = 2; // s1, s2, and return value need to be destructed

node.state = 3; // s1 and return value need to be destructeddestruct s2;

node.state = 4; // return value needs to be destructeddestruct s1;

  每当 "需要销毁的对象 "的列表发生变化时,就会更新unwind状态变量。就优化器而言,所有这些更新看起来都是废弃储存,因为似乎没有人读它们。.state

  但确实有人读它们:.the。问题是,对the的调用是不可见的。当一个异常被或函数抛出时,它被调用,或者被对象的析构器调用。

  但是,其中有些真的是废弃储存。例如,2的赋值是一个废弃储存,因为它后面紧跟着3的存储,中间没有任何东西,所以当值是2的时候,不会有异常发生。同样,3的存储是废弃的,因为3的析构器是隐含的。当破坏.node.stateSnoexcepts1时,不可能发生异常。

  如果或改为.f1f2noexcept,废弃储存就可能被消除。

  因此,优化器进退两难。它想消除废弃储存,但识别废弃储存的简单算法在这里不起作用,因为有可能出现异常。

  Coroutine使情况变得更糟:当一个coroutine暂停时,异常处理节点需要从堆栈中复制到coroutine框架中,然后从堆栈框架中删除。而当协程恢复时,状态需要从协程框架复制回堆栈,并链接到异常处理程序链中。

  确切地知道何时执行此操作取消链接和重新链接是很困难的,因为你仍然必须捕获其中发生的异常,并把它们存储在promise中。但这很可能不可行,因为在返回之前,coroutine可能已经恢复并运行到完成。

  .await_suspendawait_suspendawait_suspend

  void await_suspend(coroutine_handle<> handle)arrange_for_resumption(handle);throw oops; // who catches this?

  抛出的异常被coroutine框架捕获,该框架调用.NET Framework。但是promise可能已经不存在了!promise.unhandled_exception()

  处理所有这些情况使得x86上的异常处理,特别是x86上的coroutine的异常处理,成为一项相当复杂的工作。

  END

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
看来华谊兄弟现在混的是真的不行了啊,一个大牌明星也请不到

看来华谊兄弟现在混的是真的不行了啊,一个大牌明星也请不到

青瓜娱评
2024-06-16 10:06:26
42岁凯特惊喜亮相,新造型向戴安娜致敬,加冕王后只差临门一脚

42岁凯特惊喜亮相,新造型向戴安娜致敬,加冕王后只差临门一脚

红袖说事
2024-06-16 11:00:21
绝大部分支持“维持现状”的台湾人没意识到一个问题

绝大部分支持“维持现状”的台湾人没意识到一个问题

观察者网
2024-06-16 08:36:13
指挥所遭空袭,数十人被埋!这次偷袭俄本土的不明战机是F-35吗?

指挥所遭空袭,数十人被埋!这次偷袭俄本土的不明战机是F-35吗?

锋芒毕露
2024-06-16 12:24:54
0-2到3-2!女排绝地反击,逆转世界第1,日本队空欢喜一场!

0-2到3-2!女排绝地反击,逆转世界第1,日本队空欢喜一场!

钉钉陌上花开
2024-06-15 22:43:32
中国曾三次忍辱负重“装孙子”,完美躲过美国制裁!最终迎来崛起

中国曾三次忍辱负重“装孙子”,完美躲过美国制裁!最终迎来崛起

猫眼观史
2024-05-16 18:11:46
上海最短的三条马路,一条只有33米,正宗的上海人也未必知道全部

上海最短的三条马路,一条只有33米,正宗的上海人也未必知道全部

苗苗情感说
2024-06-16 07:15:02
妻子和网友睡3次,被网友转走5万多,2021年妻子:寂寞才找男人的

妻子和网友睡3次,被网友转走5万多,2021年妻子:寂寞才找男人的

汉史趣闻
2024-06-15 10:48:04
高考结束家长拆了放在孩子卧室6年的监控,网友:满满的窒息感,专家:培养自信更重要

高考结束家长拆了放在孩子卧室6年的监控,网友:满满的窒息感,专家:培养自信更重要

极目新闻
2024-06-14 10:52:19
博士老师为何留守中专?编制,穷孩子逆袭的最后防线!

博士老师为何留守中专?编制,穷孩子逆袭的最后防线!

华庭讲美食
2024-06-16 08:57:11
孔子问一7岁小孩:天上有多少颗星星?小孩回答后,孔子行礼拜师

孔子问一7岁小孩:天上有多少颗星星?小孩回答后,孔子行礼拜师

否知
2024-06-10 09:50:11
德国欧洲杯6月16日(周日)比赛预测

德国欧洲杯6月16日(周日)比赛预测

元爸体育
2024-06-16 08:28:45
欧洲杯第3日赛程看点:波兰VS荷兰一触即发,夺冠热门英格兰登场

欧洲杯第3日赛程看点:波兰VS荷兰一触即发,夺冠热门英格兰登场

ALL体育
2024-06-16 08:40:07
小米公司两位总经理涉贪腐被开除!

小米公司两位总经理涉贪腐被开除!

互联网坊间八卦
2024-06-15 17:51:11
淮安文旅、涟水文旅连发多条视频祝贺姜萍,网友:省了几百万广告费

淮安文旅、涟水文旅连发多条视频祝贺姜萍,网友:省了几百万广告费

极目新闻
2024-06-15 19:33:39
《墨雨云间》周夫人永远不会知道,害惨周彦邦的其实是姜玉娥

《墨雨云间》周夫人永远不会知道,害惨周彦邦的其实是姜玉娥

娱记掌门
2024-06-16 08:35:13
瑞士3-1匈牙利!赢欧洲杯开门红,埃比舍尔传射,索博送助攻

瑞士3-1匈牙利!赢欧洲杯开门红,埃比舍尔传射,索博送助攻

侃球熊弟
2024-06-15 22:52:25
刚和中国海军过完招,十多位美军舰长被解职,原因是“失去信心”

刚和中国海军过完招,十多位美军舰长被解职,原因是“失去信心”

蓝莓防务
2024-06-15 22:09:50
068期双色球之解析,惊喜6+1,蓝定10,11,3区防26,28,33

068期双色球之解析,惊喜6+1,蓝定10,11,3区防26,28,33

王晓爱体彩
2024-06-16 11:45:05
记者辟谣三元里成空城,村民表示适应,商户生意也没受太大影响

记者辟谣三元里成空城,村民表示适应,商户生意也没受太大影响

映射生活的身影
2024-06-15 15:36:04
2024-06-16 13:48:49
CSDN
CSDN
成就一亿技术人
24726文章数 241820关注度
往期回顾 全部

科技要闻

iPhone 16会杀死大模型APP吗?

头条要闻

上海一家三口出动去香港过周末 在高铁动卧睡一晚就到

头条要闻

上海一家三口出动去香港过周末 在高铁动卧睡一晚就到

体育要闻

没人永远年轻 但青春如此无敌还是离谱了些

娱乐要闻

上影节红毯:倪妮好松弛,娜扎吸睛

财经要闻

打断妻子多根肋骨 上市公司创始人被公诉

汽车要闻

售17.68万-21.68万元 极狐阿尔法S5正式上市

态度原创

时尚
本地
艺术
健康
公开课

女人年过40岁,会不会打扮差异太大了,穿对显年轻、穿错显老

本地新闻

粽情一夏|海河龙舟赛,竟然成了外国人的大party!

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

晚餐不吃or吃七分饱,哪种更减肥?

公开课

近视只是视力差?小心并发症

无障碍浏览 进入关怀版