【问题标题】:How to print the CMOS time in seconds in C program?如何在 C 程序中以秒为单位打印 CMOS 时间?
【发布时间】:2011-06-20 14:23:06
【问题描述】:

我写了一个小程序,实际上是从linux源代码中提取的。请找到我的示例代码。

#include <stdio.h>

#define CMOS_READ(addr) ({ \
outb_p(0x80|addr,0x70); \
inb_p(0x71); \
})

#define outb_p(value,port) \
__asm__ ("outb %%al,%%dx\n" \
                "\tjmp 1f\n" \
                "1:\tjmp 1f\n" \
                "1:"::"a" (value),"d" (port))

#define inb_p(port) ({ \
unsigned char _v; \
__asm__ volatile ("inb %%dx,%%al\n" \
        "\tjmp 1f\n" \
        "1:\tjmp 1f\n" \
        "1:":"=a" (_v):"d" (port)); \
_v; \
})

#define outb(value,port) \
__asm__ ("outb %%al,%%dx"::"a" (value),"d" (port))


#define inb(port) ({ \
unsigned char _v; \
__asm__ volatile ("inb %%dx,%%al":"=a" (_v):"d" (port)); \
_v; \
})

int main(void)
{
        int val = 0;
        val  = CMOS_READ(0);
        printf("val = %d", val);
        return 0;
}

它编译得很好,但在执行时它给出了一个段错误。
有人可以指导我吗?

【问题讨论】:

  • 这更像是一个汇编程序而不是 C 程序。
  • 用户程序不能直接访问 I/O 端口,这是内核领域。你的 SEGFAULT 就是这个意思:你访问一个你不被允许的 SEGment,这是你的错误。

标签: c linux


【解决方案1】:

您无权访问 CMOS I/O 端口。您需要使用 CAP_SYS_RAWIO(通常以 root 身份运行,但您也可以使用文件功能),并调用 ioperm(2) 请求访问 CMOS I/O 端口。

另外,&lt;sys/io.h&gt; 定义了 I/O 访问宏,因此您无需自己定义它们。

【讨论】:

    猜你喜欢
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    相关资源
    最近更新 更多