2010-06-13 4 views
0

Sous Windows, je peux définir l'affinité du processeur pour le code du pilote à l'aide de KeSetSystemAffinityThread et vérifier sur quel processeur mon code s'exécute à l'aide de KeGetCurrentProcessorNumber.Paramètres d'affinité du processeur pour les modules du noyau Linux?

J'essaie de faire quelque chose de similaire dans un module noyau Linux, mais les seuls appels d'affinité que je peux voir sont pour les processus utilisateur. Est-il possible de faire cela, de sorte que je puisse exécuter le code d'assemblage sur un processeur spécifique? (À savoir SGDT)

Edit:

Je pense avoir compris comment obtenir le processeur actuel. smp_processor_id() semble fonctionner correctement.

Répondre

3

Je pense que vous devrez probablement modifier le noyau, mais le changement n'est pas trop brutal. Juste exporter sched_setaffinity en sched.c aux modules:

long sched_setaffinity(pid_t pid, const struct cpumask *in_mask) 
    { 
    ... 
    } 
+ EXPORT_SYMBOL_GPL(sched_setaffinity); // Exported, now callable from your code. 
+0

Je l'ai déjà vu auparavant et j'ai supposé qu'il était uniquement destiné aux processus utilisateur, cependant, si je mets l'argument pid à 0 cela fonctionne réellement. J'ai réussi à le faire sans recompiler le noyau en utilisant un pointeur de fonction et en recherchant sched_setaffinity dans /boot/System.map, juste pour le tester. long (* extern_sched_setaffinity) (pid_t pid, const structure cpumask * in_mask) = (void *) 0xffffffff81066a70; sur mon système. Merci. –

+3

Cela ne devrait pas être une bonne idée, sauf si vous ne faites que définir l'affinité d'un thread de noyau créé spécifiquement par votre pilote. Sinon, le code du pilote peut s'exécuter dans le contexte de nombreux processus différents à des moments différents, chacun ayant son propre affinité avec le planificateur *. Si vous voulez simplement exécuter une courte section de code sans être renvoyé à un autre processeur, vous pouvez utiliser 'preempt_disable()' et 'preempt_enable()' pour créer une section critique préemptive-désactivée. – caf

+0

@caf: J'ai supposé que ce que vous avez décrit est le cas, car il dit "mon code". Bon conseil en tout cas, cependant. –

1

smp_processor_id() devrait vous dire ce processeur logique que vous utilisez sur.

Certaines architectures prennent également en charge la fonction noyau smp_call_function_single qui utilisera une interruption inter-processeurs pour exécuter une fonction sur un autre processeur.

Questions connexes