2016-04-17 1 views
8

Similaire à comment l'appel système fonctionne sur int 0x80, est-il possible d'implémenter mon propre ISR dans le noyau de sorte que sur softirq assumer int 0x120 ou avec un autre programme Softirq Counter peut passer de espace utilisateur à espace noyau? Est-ce que entrer le noyau en mode privilégié est associé uniquement à int 0x80, ou avec n'importe quelle implémentation de softirq je peux entrer en mode privilégié automatiquement ou pour désactiver le mode protégé et entrer en mode privilégié nous devons faire manuellement en écrivant son drapeau associé?Y at-il un moyen de faire un appel au noyau Linux avec mon propre softirq

et encore une chose, s'il est possible de mettre en œuvre ce type de ISR, est la meilleure façon d'échanger des données avec les registres EBX, ECX, EDX, ESI, EDI et EBP ou autre?

J'ai déjà vu How to define and trigger my own new softirq in linux kernel? mais je n'ai pas eu la solution que je recherchais. Je voudrais que ce soit plus clair, pourquoi j'ai besoin de cela
J'avais implémenté quelques fonctions du noyau, qui sont directement en communication avec les périphériques matériels, je veux qu'elles se déclenchent à partir de l'espace utilisateur en utilisant l'interruption logicielle. Je ne peux pas utiliser les appels système avec l'architecture de pilote disponible car j'ai besoin de réduire le temps d'exécution.

+0

Le noyau Linux * ne rentre jamais en mode réel (http://wiki.osdev.org/Real_Mode) une fois qu'il l'a quitté. Une fois que le bootloader a terminé son travail, un système d'exploitation décent garantit que le (s) processeur (s) sont tous en [protected] (http://wiki.osdev.org/Protected_Mode)/[long] (http://wiki.osdev.org/Long_Mode # Long_Mode) mode jusqu'à un redémarrage. Peut-être que vous vouliez dire [anneau 0] (https://en.wikipedia.org/wiki/Protection_ring)? – 3442

+0

oui droit je voulais dire 0 anneau, édité. Merci –

+0

Le moyen le plus simple d'entrer en mode noyau sous Linux est d'écrire votre propre pilote. –

Répondre

3

En premier lieu, les interruptions logicielles et softirq sont complètement différents: interruption logicielle est l'instruction de montage pour passer du mode utilisateur au mode de privilège et c'est ce que vous cherchez softirq est un mécanisme pour diviser gestionnaire d'interruption du matériel vers le haut , halfs bas

pour votre question - vous aurez besoin d'écrire du code assembleur et modifier le code spécifique de la plate-forme

  1. vous devez définir le nombre int sous Linux arch/x86/include/asm/irq_vectors.h:

    #define MY_SYSCALL_VECTOR    0x120 
    
  2. Modifier la fonction trap_init sous Linux arch/x86/kernel/traps.c:

    set_system_trap_gate(MY_SYSCALL_VECTOR, entry_INT120_32); 
    
  3. Maintenant, vous devez écrire la fonction d'assemblage entry_INT120_32. vous pouvez voir un exemple dans le fichier: arch/x86/entry/entry_32.S à partir de ENTRY(entry_INT80_32).

Vous aurez besoin de prendre soin des registres CPU comme indiqué au début du fichier entry_32.S.

+0

c'est ce que je trouvais, compris le flux selon vos instructions merci. –