Я пытаюсь получить доступ к заданной области памяти на процессоре am335x в Linux. Идея состоит в том, чтобы сначала назначить физические адреса, а затем получить доступ к этим адресам, используя ioremap
. Я уже некоторое время гуглю эту проблему, но, похоже, не могу найти хороших решений.
Функции для выполнения этих задач следующие:
Функция для получения физических адресов:
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
Где адрес может меняться.
Я предполагаю, что делаю что-то не так, но не вижу, что именно это может быть. Конечно, код тоже может быть намного лучше, но я хотел бы решить эту проблему, прежде чем вносить дальнейшие изменения. У кого-нибудь есть предложения?