2016-08-07 4 views

답변

2

Linux에서 sched_getcpu() 함수는 sys_getcpu() 시스템 호출에 대한 glibc 래퍼이며 아키텍처에 따라 다릅니다. x86_64의 아키텍처에 대한

, 그것은 __getcpu() (트리 4.x의)로 arch/x86/include/asm/vgtod.h에서 정의됩니다

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를 참조하십시오

#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 */ 

arch/entry/vdso/vgetcpu.c에 선언 __vdso_getcpu()에 의해 호출이 함수 인 접두어가 무엇인지에 대한 자세한 내용은 vdso을 참조하십시오.

EDIT 1

static inline struct thread_info *current_thread_info(void) 
{ 
     return (struct thread_info *) 
       (current_stack_pointer & ~(THREAD_SIZE - 1)); 
} 

이 함수가 사용된다

는 그것은 arch/arm/include/asm/thread_info.h 파일에서 발견 될 수있는 ARM 코드 위치

(ARM 코드의 위치를 ​​회답) 파일 arch/arm/include/asm/smp.h에 정의 된 raw_smp_processor_id()에 의해

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

는 회신 주셔서 감사합니다 : (210)
#define raw_smp_processor_id() (current_thread_info()->cpu) 

그리고이 getcpu 시스템 호출로 불리는 파일 kernel/sys.c에 선언했다. 사실 저는 ARM 아치에서 작업하고 있습니다. 방금 arch/arm64 폴더를 검색했고 sys_getcpu가 포함 된 'unistd32.h'라는 파일 만 얻었습니다. 그러나 x86 예제와 같은 세부 사항은 아직 없습니다. ARM의이 기능이 어디 있는지 알고 있습니까? 답장을 보내 주셔서 감사 드리며 훌륭한 주말을 보내시기 바랍니다. –

+0

@ S.Wan 이제 완전하고 정확합니다. 자세한 내용이 필요한 경우 알려주십시오. – pah

+0

그것은 나를 위해 매우 상세한 답변입니다. 그러나 getcpu에 관한 또 다른 관련 질문이 있습니다. 이제 sched_getcpu와 같은 함수를 배포하고 싶지만 시스템 호출을 사용하거나 'sched.h'와 같은 헤더 파일을 포함하고 싶지 않습니다.이를 수행하는 방법은 무엇입니까? 나는 x86에 대해 'CPUID'라는 명령어가 있지만 ARM 부분에는 익숙하지 않다는 것을 알았어, 고마워! –