Como permitir o acesso à memória em um módulo do kernel? [fechadas]

1

Suponha que eu tenha um periférico mapeado para memória que possa ser lido ou gravado em algum endereço, digamos 0x43C00000. Eu quero ser capaz de ler a partir desse mesmo local de memória no meu sistema operacional Linux, a fim de se comunicar com esse periférico. Como o endereço em questão seria um endereço físico, eu deveria ser capaz de escrever um módulo do kernel que possa ler a partir desse endereço.

No kernel, se eu tiver algo como

#define BASE_ADDR   0x43C00000
#define OFFSET      4

    int     * mem_addr;

    mem_addr = BASEADDR + OFFSET;

Isso, eu acho, deve me dar o ponteiro para o segundo bloco de escrita do periférico, em 0x43C00004. Imprimindo

    printk(KERN_INFO "%p\n", mem_addr) 

parece me dizer que isso está certo.

Agora, se eu tentar fazer algo como

    printk(KERN_INFO "%d\n", *mem_addr);

Eu teria pensado que isso deveria ler os dados que estão sendo gravados na memória pelo meu periférico, realizando o que eu estava tentando fazer. Mas se eu tentar colocar uma declaração como essa em um módulo, o Linux a mata. Olhando para o meu / var / log / messages eu vejo isso:

Oops: 0000 [#1] SMP
Modules linked in; TEST_MOD(0+) ...

seguido por um monte de informações sobre estados de registro. Então, aparentemente, não posso simplesmente ler a memória assim. Existe alguma maneira de conceder acesso a um módulo do kernel para ler a memória?

    
por Zephyr 19.07.2016 / 17:32

1 resposta

2

Você precisa configurar um mapeamento de endereço virtual do kernel para o local, por exemplo,

mem_addr = ioremap_nocache(BASEADDR + OFFSET, SIZE);

(parece que você fez a mesma pergunta duas vezes - consulte insira a descrição do link aqui ).

    
por 20.07.2016 / 08:48