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 ).
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?
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 ).
Tags kernel kernel-modules