标签: x86-64

为什么int 3以64位生成SIGSEGV而不是停止调试器?

在32位模式编程中,我习惯int 3在我的程序中使用调试器在指定位置停止(将指令嵌入源中).现在64位似乎不起作用,在gdb下生成一个非常普通的SIGSEGV并且破坏程序超出希望("程序终止于信号SIGSEGV,分段错误.程序不再存在.").我想知道64位模式是否有另一种机制,或者我是否应该做一些缓存 - 刷新(int 3在这种情况下是动态生成的操作码(0xcc),是一些类似jit的代码).

debugging assembly signals x86-64

18
推荐指数
3
解决办法
1万
查看次数

为什么内核代码不能使用Red Zone

强烈建议在创建64位内核(对于x86_64平台)时,指示编译器不要使用用户空间ABI所执行的128字节红区.(对于GCC,编译器标志是-mno-red-zone).

如果启用了内核,则内核不会是中断安全的.

但那是为什么呢?

x86-64 abi red-zone

18
推荐指数
3
解决办法
2874
查看次数

Bounds检查64位硬件

我正在hacks.mozilla.org上阅读64位Firefox版本的博客.

作者说:

对于asm.js代码,增加的地址空间还允许我们使用硬件内存保护来安全地从asm.js堆访问中删除边界检查.收益非常显着:asmjs-apps上的8%-17%- * - arewefastyet.com上报告的吞吐量测试.

我试图了解64位硬件如何对C/C++进行自动边界检查(假设编译器支持硬件).我在SO中找不到任何答案.我找到了一篇关于这个主题的技术论文,但我无法理解这是怎么做到的.

有人可以在边界检查中解释64位硬件辅助吗?

c c++ x86-64 sandbox virtual-memory

18
推荐指数
1
解决办法
548
查看次数

如何在运行时后期绑定32位/ 64位lib

我遇到的问题与此处描述的类似,但略有不同(加载程序集及其依赖项).

我有一个用于3D渲染的C++ DLL,这是我们向客户销售的产品.对于.NET用户,我们将有一个CLR包装器.C++ DLL可以在32位和64位版本中构建,但我认为这意味着我们需要有两个CLR包装器,因为CLR绑定到特定的DLL?

现在假设我们的客户有一个可以是32位或64位的.NET应用程序,并且它是一个纯粹的.NET应用程序,它让CLR从一组程序集中解决它.问题是应用程序代码如何在运行时动态选择我们的32位和64位CLR/DLL组合?

更具体地说,这里也适用于上述问题的建议答案(即创建一个ResolveEvent处理程序)?

.net c# clr 64-bit x86-64

17
推荐指数
1
解决办法
4129
查看次数

如何让`gcc`从标准C生成x86-64的`bts`指令?

最近一个问题的启发,我想知道是否有人知道如何在Linux x86-64平台上gcc生成x86-64 bts指令(位测试和设置),而无需借助内联汇编或非标准编译器内在函数.

相关问题:

可移植性比bts我更重要,所以我不会使用和asm指令,如果有另一个解决方案,我宁愿不使用编译器instrinsics.

编辑:C源语言不支持原子操作,所以我对获得原子测试和设置并不特别感兴趣(尽管这是测试和设置首先存在的原始原因).如果我想要一些原子,我知道我没有机会使用标准C源:它必须是内在的,库函数或内联汇编.(我在支持多线程的编译器中实现了原子操作.)

c gcc x86-64

17
推荐指数
1
解决办法
4644
查看次数

Linux上的线程局部变量访问速度有多快

在Linux中访问线程局部变量的速度有多快.从gcc编译器生成的代码中,我可以看到它是使用fs段寄存器.显然,访问线程局部变量不应该花费额外的周期.

但是,我继续阅读有关线程局部变量访问缓慢的恐怖故事.怎么会?当然,有时不同的编译器使用与使用fs段寄存器不同的方法,但是通过fs段寄存器访问线程局部变量也很慢?

c linux multithreading gcc x86-64

17
推荐指数
2
解决办法
2159
查看次数

在x86中增量是一个整数原子?

在多核x86机器上,假设在core1上执行的线程增加一个整数变量a,同时核心2上的线程也增加它.鉴于初始值为a0,它是否总是2在最后?或者它可能有其他价值?假设a声明为volatile并且我们没有使用原子变量(例如C++的atomic <>和gcc中的原子操作).

如果a在这种情况下,值确实总是2,那是否意味着long intx86-64 中的a 也具有相同的属性,即a最终总是2?

c c++ x86 gcc x86-64

17
推荐指数
4
解决办法
2万
查看次数

使用背靠背rdtsc进行负时钟周期测量?

我正在编写一个C代码,用于测量获取信号量所需的时钟周期数.我正在使用rdtsc,在对信号量进行测量之前,我连续两次调用rdtsc来测量开销.我在for循环中重复了这么多次,然后我将平均值用作rdtsc开销.

这是正确的,首先要使用平均值吗?

尽管如此,这里的一个大问题是,有时我会得到开销的负值(不一定是平均值,但至少是for循环中的部分值).

这也影响了连续计算sem_wait()操作所需的cpu周期数,有时也证明是负数.如果我写的不清楚,这里有一部分我正在编写的代码.

为什么我会得到这样的负值?


(编者注:请参阅获取CPU周期计数?以获得完整的64位时间戳的正确和可移植方式."=A"编译为x86-64时,asm约束只能得到低或高32位,具体取决于寄存器分配是否发生为uint64_t输出选择RAX或RDX .它不会选择edx:eax.)

(编辑的第二个注释:哎呀,这就是为什么我们得到负面结果的答案.仍然值得留下一个注释作为警告,不要复制这个rdtsc实现.)


#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>

static inline uint64_t get_cycles()
{
  uint64_t t;
           // editor's note: "=A" is unsafe for this in x86-64
  __asm volatile ("rdtsc" : "=A"(t));
  return t;
}

int num_measures = 10;

int main ()
{
   int i, value, res1, res2;
   uint64_t c1, c2;
   int tsccost, tot, a;

   tot=0;    

   for(i=0; i<num_measures; i++)
   { …
Run Code Online (Sandbox Code Playgroud)

c x86-64 overhead inline-assembly rdtsc

17
推荐指数
3
解决办法
1万
查看次数

64位版本的Visual Studio 2015?

这可能不是问这个问题的合适的地方,但我还是会试一试......我买了Visual Studio 2015 Professional,出于某种原因,当我按照下载链接时它只给了我下载32bit的选项.exe或32bit.iso,我想要一个64位版本.然后我登录到visualstudioonline并从那里下载了ISO,但仍然没有选择是否需要32位版本或64位版本.是的,我的笔记本电脑是64位,我正在运行的Windows 10操作系统也是如此.我打电话给微软,花了一个光荣的4个小时在世界各地转移了15次,并且不得不重复自己15次才被转移,但无济于事.

那么有谁能告诉我在哪里可以获得64位版本的VisualStudio 2015?

谢谢

x86-64 32bit-64bit visual-studio visual-studio-2015

17
推荐指数
1
解决办法
4万
查看次数

将CPU寄存器中的所有位有效地设置为1

要清除所有位,您经常会看到一个独占或在XOR eax, eax.反过来也有这样的伎俩吗?

我能想到的是用额外的指令反转零.

assembly arm x86-64 mips

17
推荐指数
1
解决办法
2154
查看次数