Récemment, j'utilise la fonction "sched_getcpu()" du fichier d'en-tête "sched.h" sous Linux.Où puis-je trouver le code de "sched_getcpu()"
Cependant, je me demande où pourrais-je trouver le code source de cette fonction?
Merci.
Récemment, j'utilise la fonction "sched_getcpu()" du fichier d'en-tête "sched.h" sous Linux.Où puis-je trouver le code de "sched_getcpu()"
Cependant, je me demande où pourrais-je trouver le code source de cette fonction?
Merci.
Sous Linux, la fonction sched_getcpu()
est un appel système enveloppe glibc à sys_getcpu()
, spécifique à l'architecture.
Pour l'architecture x86_64, il est défini dans arch/x86/include/asm/vgtod.h
comme __getcpu()
(4.x arbre):
#ifdef CONFIG_X86_64
#define VGETCPU_CPU_MASK 0xfff
static inline unsigned int __getcpu(void)
{
unsigned int p;
/*
* Load per CPU data from GDT. LSL is faster than RDTSCP and
* works on all CPUs. This is volatile so that it orders
* correctly wrt barrier() and to keep gcc from cleverly
* hoisting it out of the calling function.
*/
asm volatile ("lsl %1,%0" : "=r" (p) : "r" (__PER_CPU_SEG));
return p;
}
#endif /* CONFIG_X86_64 */
Être cette fonction appelée par __vdso_getcpu()
déclaré dans arch/entry/vdso/vgetcpu.c
:
notrace long
__vdso_getcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *unused)
{
unsigned int p;
p = __getcpu();
if (cpu)
*cpu = p & VGETCPU_CPU_MASK;
if (node)
*node = p >> 12;
return 0;
}
(Voir vDSO pour plus de détails concernant le préfixe vdso
).
EDIT 1: (en réponse à l'emplacement de code du bras)
code ARM emplacement
Il se trouve dans le fichier arch/arm/include/asm/thread_info.h
:
static inline struct thread_info *current_thread_info(void)
{
return (struct thread_info *)
(current_stack_pointer & ~(THREAD_SIZE - 1));
}
Cette fonction est utilisée par raw_smp_processor_id()
qui est défini dans le fichier arch/arm/include/asm/smp.h
comme:
#define raw_smp_processor_id() (current_thread_info()->cpu)
Et il est appelé par getcpu
appel système déclaré dans le fichier kernel/sys.c
:
SYSCALL_DEFINE3(getcpu, unsigned __user *, cpup, unsigned __user *, nodep, struct getcpu_cache __user *, unused)
{
int err = 0;
int cpu = raw_smp_processor_id();
if (cpup)
err |= put_user(cpu, cpup);
if (nodep)
err |= put_user(cpu_to_node(cpu), nodep);
return err ? -EFAULT : 0;
}
Merci pour le lui répondre. En fait je travaille sur ARM arch. J'ai juste cherché le dossier arch/arm64 et j'ai seulement obtenu un fichier nommé 'unistd32.h' qui incluait le sys_getcpu. Cependant, il n'y a toujours pas de détails comme votre exemple x86. Avez-vous une idée de l'endroit où est cette fonction d'ARM? Merci encore d'avoir répondu et j'espère que vous passerez un bon week-end! –
@ S.Wan Maintenant complet et précis. Faites-moi savoir si vous avez besoin de plus de détails. – pah
c'est une réponse très détaillée pour moi. Cependant, j'ai une autre question connexe sur le getcpu. Maintenant, je veux déployer une fonction comme sched_getcpu mais je ne veux pas utiliser l'appel système ou inclure le fichier d'en-tête comme 'sched.h', y at-il un moyen d'y parvenir? Je sais pour x86 il y a une instruction appelée 'CPUID' mais je suis nouveau dans la partie ARM, merci! –