小编san*_*ana的帖子

如何在linux上使用gcc汇编在x86-64中设置控制寄存器0(cr0)位

我使用以下代码将cr0位设置为禁用缓存.当我编译这个

#include <stdio.h>

int main()
{
        __asm__("pushl  %eax\n\t"
                "mov    %cr0,%eax;\n\t"
                "orl    $(1 << 30),%eax;\n\t"
                "mov    %eax,%cr0;\n\t"
                "wbinvd\n\t"
                "popl   %eax"
);

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到错误说操作数对mov无效.

谁能指点我做一个好的gcc x86-64指南来做这些事情?以上代码究竟出了什么问题呢?

linux gcc x86-64 inline-assembly

8
推荐指数
1
解决办法
7709
查看次数

在 Linux/ARM64 中如何唤醒自旋锁?

在Linux内核中,arch_spin_lock()的实现如下:

static inline void arch_spin_lock(arch_spinlock_t *lock)
{
    unsigned int tmp;
    arch_spinlock_t lockval, newval;

    asm volatile(
    /* Atomically increment the next ticket. */
"   prfm    pstl1strm, %3\n"
"1: ldaxr   %w0, %3\n"
"   add %w1, %w0, %w5\n"
"   stxr    %w2, %w1, %3\n"
"   cbnz    %w2, 1b\n"
    /* Did we get the lock? */
"   eor %w1, %w0, %w0, ror #16\n"
"   cbz %w1, 3f\n"
    /*
     * No: spin on the owner. Send a local event to avoid missing an
     * unlock before …
Run Code Online (Sandbox Code Playgroud)

assembly linux-kernel arm64

5
推荐指数
1
解决办法
1671
查看次数

如何衡量CUDA中内核启动的开销

我想测量CUDA中内核启动的开销.

我知道有各种参数会影响这种开销.我对以下内容感兴趣:

  • 创建的线程数
  • 要复制的数据大小

我这样做主要是为了衡量使用CUDA 6.0中引入的托管内存的优势.我将使用我开发的代码和评论更新此问题.谢谢!

cuda

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

在RISC-V Rocket处理器中实现FENCE

FENCE指令在Rocket CPU中做了什么?我试过通过fpga源但无法找到它.

除此之外,写缓冲区在哪里实现?我可能会得到我的答案:)

riscv

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

在 ARMv7(rpi2) 上从用户模式刷新缓存行

我使用以下代码刷新树莓派 2 上的缓存行:

 static inline void flush(void addr)
 {
     asm volatile("mcr p15, 0, %0, c7, c6, 1"::"r"(addr));                                              
 } 
Run Code Online (Sandbox Code Playgroud)

当我运行此指令时,我收到一条错误消息,指出这是一条特权指令。这段代码正确吗?有没有办法从这台机器上的用户空间刷新缓存行?在 x86 上clflush无需任何修改即可运行。

assembly caching arm raspberry-pi2

2
推荐指数
1
解决办法
1887
查看次数

这个内联汇编如何定义变量?

在linux内核中,您可以找到如下组件:

#define DEFINE(sym, val) \
        asm volatile("\n->" #sym " %0 " #val : : "i" (val))
Run Code Online (Sandbox Code Playgroud)

当像这样使用时

DEFINE(NR_PAGEFLAGS, __NR_PAGEFLAGS);
Run Code Online (Sandbox Code Playgroud)

生成以下程序集

->NR_PAGEFLAGS $24 __NR_PAGEFLAGS
Run Code Online (Sandbox Code Playgroud)

这显然是有效的集会.这是做什么的?

这个asm如何定义一个变量?请指出任何更详细解释这一点的文档.谢谢!

c inline-assembly linux-kernel

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

标签 统计

assembly ×2

inline-assembly ×2

linux-kernel ×2

arm ×1

arm64 ×1

c ×1

caching ×1

cuda ×1

gcc ×1

linux ×1

raspberry-pi2 ×1

riscv ×1

x86-64 ×1