Ошибка шины в операции чтения / записи памяти - PullRequest
0 голосов
/ 20 мая 2011

Я написал программу ядра для операции чтения / записи памяти.

#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/init.h>
#include<linux/io.h>

static uint32_t *mem_alloc(void)
{
   uint32_t *base, *mem;
   base=kmalloc(5*sizeof(uint32_t),GFP_KERNEL);
   mem=ioremap(base,5*sizeof(uint32_t));
   return(mem);
}

static void mem_write(uint32_t *memory)
{
  uint32_t *mem1;
  mem1=memory;
  int i;
  for(i=0;i<5;i++)
  {
    *mem1=0x1010F0F0;
    mem1++;
  }
}

static int __init insert(void)
{
  uint32_t *memory;
  memory=mem_alloc();
  mem_write(memory);
  return 0;
}

static void __exit remove(uint32_t *memory)
{
  kfree(memory);
}

в этой программе при выполнении инструкции

 *mem1=0x1010F0F0;
возникает ошибка шины

Ответы [ 2 ]

3 голосов
/ 21 мая 2011

ioremap () используется для отображения памяти шины в пространство процессора.

ioremap выполняет последовательность операций для конкретной платформы, чтобы сделать доступным память шины процессора через readb / readw /функции readl / writeb / writew / writel и другие помощники mmio. Возвращенный адрес не гарантируется для непосредственного использования в качестве виртуального адреса.

kmalloc выделяет память в непрерывной ячейке памяти в физической памяти и возвращает указатель виртуального адреса.

ioremap ожидает физический адрес на входе , , но вы предоставляете виртуальный адрес в качестве физического адреса для ioremap . Это значение виртуального адреса может совпадать с физическим адресомзначение any of bus, и оно отображало пространство физической шины на виртуальное (и мы должны получить доступ к регистрам устройства, используя readb / readw / readl / writeb / writew / writel), из-за того, что оно выдавало ошибку.

0 голосов
/ 20 мая 2011

Это то, что я нахожу в качестве ссылки для ioremap:

void * ioremap (unsigned long phys_addr,
без знака длинный размер
)

Переопределить память ввода / вывода в адресное пространство ядра.

Параметры: phys_addr начало диапазона физических адресов
размер размер диапазона физических адресов

Возвращает: виртуальный начальный адрес сопоставленного диапазона Здесь никакого реального картирования не делается. Только виртуальный адрес возвращается.

Похоже, он отображает адрес аппаратного устройства в виртуальную память, а не блок памяти, выделенный из реальной памяти.

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