[C] 커널은 현재 스레드가 무엇인지 어떻게 알 수 있습니까?


Answers

Linux의 커널 스택은 고정 크기 ( THREAD_SIZE - 2 페이지 또는 x86의 경우 8KB)입니다. 스레드에 대한 struct thread_info 는 스택의 메모리 블록 맨 아래에 보관됩니다. 스택이 아래쪽으로 움직이므로 스택 포인터는 처음에는 메모리 블록의 끝을 가리키고 데이터가 스택에 푸시 될 때 스택 포인터는 메모리 블록의 아래쪽을 향해 이동합니다. 물론 다른 CPU 아키텍처는 다른 기술을 사용할 수도 있습니다.

따라서 현재 스택 포인터 값을 가져 와서 하위 비트를 마스크하면 현재 스택을 사용하는 스레드에 대한 struct thread_info 대한 포인터가 struct thread_info .

라인 :

register unsigned long sp asm ("sp");

GCC에게 변수 sp 를 CPU 레지스터 sp 에 매핑하도록 지시합니다 (16 비트 레지스터 이름이 여기에서 사용되는 것은 이상합니다. 실제 Linux 소스 트리에서입니까?).

GCC가 컴파일러 일 때 __attribute_const__ 는 일반적으로 __attribute__((__const__)) 으로 정의됩니다 (Linux 커널의 경우에는 다른 것입니까?). 이 함수는 GCC에 부작용이 없다는 사실을 알려주고 있습니다. 실제로는 그보다 약간 강합니다. 함수는 인수 만 사용하고 그 인수 만 기반으로 값을 반환합니다. 이것은 컴파일러에 대한 최적화 기회를 제공 할 수 있습니다. 전역 변수가 변경되거나 읽히지 않는다고 가정 할 수 있습니다. 따라서 컴파일러는 '정상'함수 호출을 위해 업데이트해야하는 업데이트 메모리를 연기 할 수 있습니다.

Question

누군가 리눅스 커널 에서 가져온 코드 조각을 설명해 주시겠습니까?

/*
  * how to get the thread information struct from C
 */
 static inline struct thread_info *current_thread_info(void) __attribute_const__;

 static inline struct thread_info *current_thread_info(void)
 {
        register unsigned long sp asm ("sp");
        return (struct thread_info *)(sp & ~(THREAD_SIZE - 1));
}

질문 :

  1. __attribute_const__ 은 무엇입니까?
  2. 이것이 register unsigned long sp asm ("sp"); 하는 것은 무엇입니까 register unsigned long sp asm ("sp");
  3. 이유 (struct thread_info *)(sp & ~(THREAD_SIZE - 1)); 구조체에 대한 포인터를 반환 하시겠습니까?