小编Met*_*est的帖子

获取x86的当前指令的地址

我使用Linux与x86(准确地说是64位).有没有办法可以得到当前指令的地址.其实我想写自己的简化版本的setjmp/longjmp.在这里,R ..发布了longjmp的简化版本.知道如何实现setjmp.一个简化的版本,没有考虑异常和信号等...

c linux 64-bit x86 assembly

11
推荐指数
3
解决办法
2万
查看次数

关于setjmp/longjmp

我正在调查setjmp/longjmp,发现setjmp保存了诸如指令指针,堆栈指针等寄存器......

但是我不知道的是,在调用setjmplongjmp之间,不能修改线程堆栈中的数据本身.在这种情况下,不会longjmp不能按预期工作.

为了说清楚,例如,当longjmp恢复堆栈指针时,说现在堆栈指针所指向的内存中的数据与调用setjmp时的数据不同.这会发生吗?如果发生这种情况,我们不是有麻烦吗?

另外,语句的意思是" 在调用setjmp()例程的例程返回后,可能不会调用longjmp()例程. "

c linux x86 setjmp

11
推荐指数
2
解决办法
8641
查看次数

解析和修改LLVM IR代码

我想读取(解析)LLVM IR代码(保存在文本文件中)并添加一些我自己的代码.我需要一些这样做的例子,也就是说,如何通过使用LLVM提供的库来实现这一目的.基本上我想要的是将IR代码从文本文件读入内存(也许LLVM库以AST形式表示它,我不知道),进行修改,比如在AST中添加更多节点然后最后写在IR文本文件中备份AST.

虽然我需要阅读和修改IR代码,但如果有人能够提供或推荐我刚刚读取(解析)它的一些示例,我将非常感激.

c c++ llvm

11
推荐指数
1
解决办法
8781
查看次数

流程链接表和全局偏移表

我正在阅读有关PLT(流程链接表)和GOT(全球抵消表)的这篇文章.虽然PLT的目的对我来说很清楚,但我仍然对GOT感到困惑.我从文章中了解到,GOT仅对于extern在共享库中声明的变量是必需的.对于static在共享库代码中声明的全局变量,它不是必需的.

我的理解是正确的,还是我完全忽略了这一点.

c linux gcc x86-64

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

在64位Linux中,内核占用了哪个地址空间?

64位Linux内核的地址空间是多少,也就是说,它所使用的代码,堆栈,堆和数据段的地址范围是多少.

linux x86-64 linux-kernel

11
推荐指数
1
解决办法
8718
查看次数

如何在Spark中获取地图任务的ID?

有没有办法在Spark中获取地图任务的ID?例如,如果每个map任务调用一个用户定义的函数,我是否可以从该用户定义的函数中获取该map任务的ID?

hadoop scala hadoop-yarn apache-spark

11
推荐指数
1
解决办法
5211
查看次数

乱序执行和记忆围栏

我知道现代CPU可以无序执行,但是他们总是按顺序退出结果,如维基百科所述.

"Out of Oder处理器及时填写这些"插槽"并准备好其他指令,然后在结尾处重新排序结果,使其看起来正常处理指令. "

现在,当使用多核平台时,据说需要内存防护,因为由于乱序执行,可以在此处打印错误的x值.

Processor #1:
 while f == 0
  ;
 print x; // x might not be 42 here

Processor #2:
 x = 42;
 // Memory fence required here
 f = 1
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,由于乱序处理器(我假设MultiCore处理器的情况下的核心)总是按顺序退出结果,那么内存栅栏的必要性是什么.难道多核处理器的核心不会看到仅从其他核心退役的结果,或者它们是否也会看到正在进行中的结果?

我的意思是在我上面给出的例子中,当处理器2最终退出结果时,x的结果应该在f之前,对吗?我知道在乱序执行期间它可能在x之前修改了f,但它必须在x之前没有退役,对吗?

现在有了按顺序退出结果和缓存一致性机制,为什么你需要在x86中使用内存栅栏?

c cpu x86 memory-fences memory-barriers

10
推荐指数
2
解决办法
3033
查看次数

IPC通过共享内存与atomic_t; 它对x86有用吗?

我有以下代码通过共享内存进行进程间通信.一个进程写入日志,另一个进程从中读取.一种方法是使用信号量,但在这里我使用的是atomic_t类型的原子标志(log_flag),它位于共享内存中.日志(log_data)也是共享的.

现在问题是,这适用于x86架构还是需要信号量或互斥量?如果我使log_flag非原子化怎么办?鉴于x86具有严格的内存模型和主动缓存一致性,并且优化不适用于指针,我认为它仍然有用吗?

编辑:请注意,我有一个8核的多核处理器,所以我在这里忙等待没有任何问题!

// Process 1 calls this function
void write_log( void * data, size_t size )
{
    while( *log_flag )
           ;
    memcpy( log_data, data, size );
    *log_flag = 1;
}

// Process 2 calls this function
void read_log( void * data, size_t size )
{
    while( !( *log_flag ) )
       ;
    memcpy( data, log_data, size );
    *log_flag = 0;
}
Run Code Online (Sandbox Code Playgroud)

c c++ linux gcc c++11

10
推荐指数
1
解决办法
1462
查看次数

线程局部变量和fs段

我在我的代码中读取线程局部变量,如下所示,

// tid_local is declared as __thread int tid_local;
long tid = tid_local
Run Code Online (Sandbox Code Playgroud)

看看反汇编的代码,我看到了类似的东西,我怀疑这是通过读取tid_local来指定tid的指令.

movslq %fs:0xfffffffffffffffc,%rbx
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,这是否真的可以成为执行此操作的指令,即从本地线程变量读取,以及gcc是否始终使用fs段存储线程局部变量.这应该怎么样?

c linux multithreading gcc x86-64

10
推荐指数
1
解决办法
2739
查看次数

为什么这个内联汇编不起作用?

对于以下代码:

long buf[64];

register long rrax asm ("rax");
register long rrbx asm ("rbx");
register long rrsi asm ("rsi");

rrax = 0x34;
rrbx = 0x39;

__asm__ __volatile__ ("movq $buf,%rsi");
__asm__ __volatile__ ("movq %rax, 0(%rsi);");
__asm__ __volatile__ ("movq %rbx, 8(%rsi);");

printf( "buf[0] = %lx, buf[1] = %lx!\n", buf[0], buf[1] );
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

buf[0] = 0, buf[1] = 346161cbc0!
Run Code Online (Sandbox Code Playgroud)

它应该是:

buf[0] = 34, buf[1] = 39!
Run Code Online (Sandbox Code Playgroud)

任何想法为什么它不能正常工作,以及如何解决它?

c linux assembly gcc x86-64

10
推荐指数
1
解决办法
9235
查看次数