Как напечатать время CMOS в секундах в программе C? - PullRequest
0 голосов
/ 20 июня 2011

Я написал небольшую программу, которая была фактически извлечена из исходного кода 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 Ответ

4 голосов
/ 20 июня 2011

У вас нет прав доступа к портам ввода / вывода CMOS.Вам нужно будет работать с CAP_SYS_RAWIO (обычно с правами root, хотя вы также можете использовать файловые возможности) и вызывать ioperm (2) для запроса доступа к портам ввода / вывода CMOS.

Кроме того, <sys/io.h> определяет макросы доступа ввода-вывода, поэтому вам не нужно определять их самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...