如何在C程序中以秒为单位打印CMOS时间?

时间:2011-06-20 06:02:49

标签: c linux

我编写了一个小程序,它实际上是从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;
}

它编译得很好,但在执行时它会产生一个段错误 有人可以指导我吗?

1 个答案:

答案 0 :(得分:4)

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

此外,<sys/io.h>定义了I / O访问宏,因此您无需自己定义它们。