0

Я пытаюсь получить доступ к данной области памяти на am335x-процессоре в Linux. Идея состоит в том, чтобы сначала назначить физические адреса, затем получить доступ к указанным адресам, используя ioremap. Я давно искал эту проблему, но, похоже, не нашел хороших решений.ioremap - Невозможно обработать запрос подкачки ядра по виртуальному адресу XXXXXXXX

функции, чтобы сделать эти задачи заключаются в следующем:

Функция для получения физических адресов:

static int initPaddr(struct regref **reg, long unsigned int *base, int count) 
{ 
    int i; 

    reg = kmalloc(sizeof(struct regref*) * count, GFP_KERNEL); 
    for(i = 0; i < count; i++) 
     reg[i] = kmalloc(sizeof(struct regref), GFP_KERNEL); 

    for(i = 0; i < count; i++) 
     reg[i]->paddr = REG_ADDR(base, regArray[i]); 

    return 0; 
} 

Функция для регистрации виртуальных адресов:

static int initVaddr(struct regref **reg, int blocksize, int count) 
{ 
    int i; 

    for(i = 0; i < count; i++) 
     reg[i]->vaddr = (unsigned long*) ioremap((unsigned long) reg[i]->paddr, blocksize); 

    return 0; 
} 

Здесь regArray[] просто массив которые содержат все соответствующие физические адреса, а структура regref определяется следующим образом:

struct regref = { 
    long unsigned int *paddr; 
    long unsigned int *vaddr; 
}; 

Чтобы код компилируется, но когда я пытаюсь загрузить его, я в конечном итоге получаю следующее сообщение об ошибке:

Unable to handle kernel paging request at virtual address 702f7373 

Если адрес может меняться.

Я предполагаю, что я делаю что-то неправильно, но не вижу точно, что это может быть. Конечно, код может быть намного лучше, но я хотел бы решить эту проблему, прежде чем делать дальнейшие изменения. У кого-нибудь есть предложения?

ответ

0

Оказывается, ошибка была не в коде выше, а в другом месте. Приведенный выше код является рабочим примером для использования ioremap().

+0

Можете ли вы рассказать немного больше о том, в чем проблема? Это не очень полезно. – tothphu