добавить запись mtrr в linux с кодом C - PullRequest
0 голосов
/ 04 октября 2011

Я пытаюсь добавить запись в MTRR, чтобы пометить область памяти как объединение записи, но ядро ​​не принимает мой вызов. Возвращает EINVAL errno. В чем может быть проблема? Я перепробовал все, но не повезло. Вот код и вывод после его запуска:

   #define NUM_ELTS        (1024*64)

    struct mtrr_sentry sentry;

    void register_wc(uint *addr);

    void register_wc(uint *addr) {
        int fd,ret;
        int aux1,aux2;
        int page_size;

        sentry.base=(ulong) addr;
        sentry.size=NUM_ELTS;
        sentry.type=MTRR_TYPE_WRCOMB;

        page_size=getpagesize();
        aux1=sentry.base & (page_size - 1);
        aux2=sentry.size & (page_size - 1);

        printf("aux1=%d, aux2=%d, base=%d, size=%d, type=%d\n",aux1,aux2,sentry.base,sentry.size,sentry.type);

        fd=open("/proc/mtrr",O_WRONLY); if (fd==-1) { perror("open()"); exit(2); }
        printf("fd=%d\n",fd);
        ret=ioctl(fd,MTRRIOC_ADD_ENTRY,&sentry); if (ret==-1) { perror("ioctl()"); exit(3); }
        sleep(10);
        close(fd);
    }
int main(int argc, char **argv) {
    ulong size;
    uint *data;

    size=sizeof(uint)*NUM_ELTS;

    data=(uint*) memalign(4096,size);   if (!data) { exit(1); }
    printf("data address is %d, PAGE_SIZE=%d\n",data,getpagesize());
    register_wc(data);
}

Вывод программы:

data address is -1420279808, PAGE_SIZE=4096
aux1=0, aux2=0, base=-1420279808, size=65536, type=1
fd=3
ioctl(): Invalid argument

Код скопирован (почти) из /usr/src/linux/Documentation/x86/mtrr.txt

Ответы [ 2 ]

2 голосов
/ 04 октября 2011

Базовый адрес, который вы передаете MTRRIOC_ADD_ENTRY, должен быть физическим адресом.Похоже, вы передаете логический адрес только что выделенному блоку памяти, что не имеет никакого смысла.MTRR используются для управления доступом к отображенному в памяти оборудованию, а не к ОЗУ.

0 голосов
/ 04 октября 2011

Что сказал @duskwulf.

Вы не определили

struct mtrr_sentry sentry

, а у участников нет адресов.

РЕДАКТИРОВАТЬ: Я думаю, что вы хотитедобавить определение mtrr_sentry.

#include <asm/mtrr.h>
...