2016-08-07 16 views

ответ

2

Под 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; 
} 
+0

Спасибо за ответив. На самом деле я работаю над аркой ARM. Я просто искал папку arch/arm64, и я получил только файл с именем «unistd32.h», который включал sys_getcpu. Тем не менее, пока нет данных, подобных вашему примеру x86. Вы знаете, где эта функция ARM? Еще раз спасибо за ответ и надеюсь, что у вас отличный выходной! –

+0

@ S.Wan Теперь полный и точный. Дайте мне знать, если вам нужна дополнительная информация. – pah

+0

Это очень подробный ответ для меня. Однако у меня есть еще один связанный с этим вопрос о getcpu. Теперь я хочу развернуть такую ​​функцию, как sched_getcpu, но я не хочу использовать системный вызов или включать заголовочный файл, например, «sched.h», есть ли способ достичь этого? Я знаю, что для x86 есть команда под названием «CPUID», но я новичок в части ARM, спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^