【问题标题】:How are registers used in C?C语言中如何使用寄存器?
【发布时间】:2017-09-25 13:24:04
【问题描述】:

就像CR3寄存器用来指向页面目录一样。 Linux 也使用分页,是用 C 编写的,但是这些寄存器在 C 中是如何使用的(如何使用 C 选择特定的寄存器)?

【问题讨论】:

  • 如果要直接使用寄存器,需要用汇编语言编写代码。
  • 以及如何初始化宏?(我的意思是我已经阅读了一些宏来选择寄存器)并且我还没有在 linux 的分页源代码中看到汇编语言。该代码是如何工作的?
  • 实际上想要达到什么目的。通常你不需要在 C 中使用 CPU 寄存器,顺便说一句,C 语言 C 没有指定如何访问寄存器。但是许多编译器都有扩展,允许您直接寻址 CPU 寄存器。
  • @karansharma 那你看的不够仔细。为了编写 cr3,在 arch/x86/include/system.h 中有一个名为 write_cr3 的函数。它具有内联汇编器。 (这是我使用的特定版本的 linux,可能在其他版本中有所不同)
  • 谢谢阿特,我明白了。

标签: c linux linux-kernel


【解决方案1】:

C 语言无法访问特定的处理器寄存器。这完全取决于编译器。

要访问特定的寄存器,您必须至少在汇编程序中编写这部分代码。

【讨论】:

  • 我的意思是你的回答没有回答这个问题,你应该把它作为评论发布。
  • @MichaelWalz - 但它确实回答了这个问题。 OP 在纯 C 的范围内询问。纯 C 不允许这样做。因此,这就是答案。身材矮小并不会减损它。
  • @StoryTeller 好吧,也许,我会删除我的评论。
  • @SisterFister 我删除了我的评论,你也可以删除你的。
  • @StoryTeller 因为毕竟你是对的。我不应该首先发布它。
【解决方案2】:

您所说的寄存器不是语言的属性,而是您运行程序的硬件的属性。我相信您在谈论 x86 类型的硬件。 cr0-4 和其他特定的 regs 是操作系统的属性,由它管理,包括分页表。

因此,该语言不提供访问这些硬件特定寄存器的方法。唯一的方法是编写汇编代码(特定于硬件)来操作它们。该语言唯一提供的是asm() 运算符,它允许在程序中插入汇编代码。

【讨论】:

  • __asm__是具体实现提供的extension;它不是标准 C 语言定义的一部分。
  • @JohnBode 对,标准的是asm()。我修好了。
  • asm 作为通用扩展名列在 J.5.10 下,但它不是核心语言或库的一部分。正如 J.5/1 中所说:“以下扩展在许多系统中广泛使用,但不能移植到所有实现中。”
  • @JohnBode 它在10.4 The asm declaration 中定义。我认为,让它成为语言的一部分就足够了。虽然是conditionally supported
  • 您在看哪个文件?我在C 2011 online draft 的任何地方都没有看到
【解决方案3】:

标准 C 不提供任何直接访问处理器寄存器的工具。某些实现可能提供允许您在 C 代码中嵌入汇编代码的扩展(例如 gcc 提供的 asm 扩展)。

一般来说,如果您需要直接访问处理器寄存器(或其他特定于硬件的位置),您可以在汇编程序中编写该例程并将其链接到更大的程序中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 2012-03-16
    相关资源
    最近更新 更多