Gibt es eine Möglichkeit, einen Aufruf an den Linux-Kernel mit meiner eigenen Softirq zu machen

8

Ähnlich wie der Systemaufruf auf int 0x80 funktioniert, ist es möglich, meinen eigenen ISR innerhalb des Kernels zu implementieren, so dass auf Softirq int 0x120 oder mit einem anderen Softirq-Programmzähler von Benutzerraum zu Kernelraum ?

Ist der Eintritt in den Kernel im privilegierten Modus nur mit int 0x80 verbunden, oder kann ich mit irgendeiner Softirq-Implementierung automatisch in den privilegierten Modus wechseln oder den geschützten Modus deaktivieren und in den privilegierten Modus wechseln, müssen wir manuell das dazugehörige Flag schreiben?

und noch eine Sache, wenn es möglich ist, diese Art von ISR zu implementieren, ist der beste Weg für den Datenaustausch ist mit den Registern EBX, ECX, EDX, ESI, EDI und EBP oder eine andere Möglichkeit ist immer noch da?

Ich habe bereits How to definiere und trigge mein eigenes neues Softirq im Linux-Kernel? , habe aber nicht die Lösung gefunden, nach der ich gesucht habe.

Ich werde es klarer machen, warum ich das brauche Ich hatte einige Kernel-Funktionen implementiert, die direkt mit Hardware-Peripheriegeräten kommunizieren, ich möchte, dass sie aus dem Benutzerbereich mit Software-Interrupt ausgelöst werden. Systemaufrufe mit verfügbarer Treiberarchitektur können nicht verwendet werden, da ich die Ausführungszeit reduzieren muss.

    
Samrat Das 17.04.2016, 21:05
quelle

1 Antwort

3

Erstens sind Software-Interrupts und Softirq völlig verschieden: Software-Interrupt ist die Assembly-Anweisung, um vom Benutzermodus in den Privilege-Modus zu wechseln, und das ist es, wonach Sie suchen Softirq ist ein Mechanismus, um den Hardware-Interrupt-Handler in die obere, untere Hälfte aufzuteilen

Für Ihre Frage - Sie müssen Assemblercode schreiben und plattformspezifischen Code ändern

  1. Sie müssen die int-Nummer in Linux arch/x86/include/asm/irq_vectors.h definieren:

    %Vor%
  2. Ändern Sie die Funktion trap_init in Linux arch/x86/kernel/traps.c :

    %Vor%
  3. Jetzt müssen Sie die Assembly-Funktion entry_INT120_32 schreiben. Sie können ein Beispiel in der Datei sehen: arch/x86/entry/entry_32.S beginnt bei ENTRY(entry_INT80_32) .

Sie müssen sich um die CPU-Register kümmern, wie am Anfang von entry_32.S -Datei dokumentiert.

    
Liran Ben Haim 18.04.2016, 21:01
quelle