2013-03-06 9 views
7

Im Kernelmodul muss ich den Interrupt behandeln, indem ich eine "Null" an die Adresse des physischen Speichers schreibe.C - Vom Kernelmodul in den physischen Speicher schreiben

Zunächst sollte ich einen Speicher durch eine Funktion wie "mmap" zuweisen, aber für Kernel-Modul; zum Beispiel, ioremap.

static irqreturn_t int068_interrupt(int irq, void *dev_id) 
{ 
    unsigned int *p; 
    unsigned int address; 
    unsigned int memsize; 

    address = 0x12345678; 
    memsize = 1024; 

    p = ioremap(address, memsize); 
    p[0]=0; 

    printk("Interrupt was handled\n"); 

    return IRQ_HANDLED; 
} 

jedoch die Kernel-Abstürze beim Interrupt kommt und Interrupt-Handler Behandlung beginnt es (Kernel-Fehler in mm/vmalloc.c: numberofline)

Es scheint, dass etwas falsch mit meiner Nutzung von ioremap oder Ich sollte einen anderen "Kernel-Ersatz von mmap" verwenden

Bitte sagen Sie mir, wie um dieses Problem zu umgehen?

+2

Haben Sie versucht, den 'ioremap'-Aufruf außerhalb des Interrupts auszuführen? Z.B. im Modul Initialisierungscode? –

+0

@JoachimPileborg der gleiche Code funktioniert gut in Modul init! O_O Ich benötige diesen Code jedoch am Interrupt-Handler –

+1

Bewegt sich das Gerät im physikalischen Adressraum ??? –

Antwort

3

direkt von Linux ioremap.c:

Wenn Sie iounmap und ioremap eine Region, werden die anderen CPUs nicht sehen diese Änderung bis zu ihrem nächsten Kontextwechsel. Wenn (z. B.) ein Interrupt auf einer dieser anderen CPUs auftritt, für die die neue ioremap-Region referenziert werden muss, referenziert die CPU die alte Region.

Dies fordert, ioremap Aufruf innerhalb einer Interrupt-Service-Routine zu vermeiden.

+3

+ [ioremap/iounmap im Interrupt-Kontext] verschieben (http://www.spinics.net/lists/newbies/msg22020) .html). –

Verwandte Themen