Недавно я использую функцию «sched_getcpu()» из файла заголовка «sched.h» в Linux.Где я могу найти код «sched_getcpu()»
Однако, мне интересно, где я могу найти исходный код этой функции?
Спасибо.
Недавно я использую функцию «sched_getcpu()» из файла заголовка «sched.h» в Linux.Где я могу найти код «sched_getcpu()»
Однако, мне интересно, где я могу найти исходный код этой функции?
Спасибо.
Под Linux функция sched_getcpu()
является оболочкой glibc для системного вызова sys_getcpu()
, который является специфичным для архитектуры.
Для архитектуры x86_64, она определяется по arch/x86/include/asm/vgtod.h
в __getcpu()
(дерево 4.x):
#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 */
Будучи эта функция называется по __vdso_getcpu()
объявленную в 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;
}
(См vDSO подробности относительно какой vdso
префикс есть).
EDIT 1: (в ответ на код рычага место)
ARM код местоположения
Он может быть найден в 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));
}
Эта функция доступна по raw_smp_processor_id()
, которое определено в файле arch/arm/include/asm/smp.h
как:
#define raw_smp_processor_id() (current_thread_info()->cpu)
И это называется по getcpu
системного вызова объявлены в файле 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;
}
Спасибо за ответив. На самом деле я работаю над аркой ARM. Я просто искал папку arch/arm64, и я получил только файл с именем «unistd32.h», который включал sys_getcpu. Тем не менее, пока нет данных, подобных вашему примеру x86. Вы знаете, где эта функция ARM? Еще раз спасибо за ответ и надеюсь, что у вас отличный выходной! –
@ S.Wan Теперь полный и точный. Дайте мне знать, если вам нужна дополнительная информация. – pah
Это очень подробный ответ для меня. Однако у меня есть еще один связанный с этим вопрос о getcpu. Теперь я хочу развернуть такую функцию, как sched_getcpu, но я не хочу использовать системный вызов или включать заголовочный файл, например, «sched.h», есть ли способ достичь этого? Я знаю, что для x86 есть команда под названием «CPUID», но я новичок в части ARM, спасибо! –