2016-09-25 3 views
1

"gs"레지스터는 지금까지 발견 된 바에 따라 스레드의 특정 영역 (TSD)을 가리 킵니다. 하나의 포인터 크기의 메모리는 pthread_key_create를 사용하여이 영역에 할당 할 수 있으며 pthread_setspecific을 사용하여 쓸 수 있습니다. apple's tsd.h보고 후64 비트 OSX에서 스레드 별 데이터 사전 정의 구조가 설정되는 방법 또는 위치는 어디입니까?

이 또한 즉 __TSD_THREAD_SELF, __TSD_ERRNO, __TSD_MIG_REPLY 및 __TSD_SEMAPHORE_CACHE의 TSD 메모리 영역의 시작 부분에서 미리 정의 된 같은 크기 (포인터 크기)의 일부 항목 것으로 보인다.

그래서 지금은 내 질문은 :

  • 이 항목 미리 정의 된 구조의 모든입니까?
  • pthread_key_create는 새 항목의 메모리를 예약합니까? (구 버전은 "gs"레지스터의 주소에서 오프셋으로 _PTHREAD_TSD_OFFSET을 사용하지만 새로운 OSX 소스에서는 찾을 수 없습니다)
  • 여기서 사전 정의 된 구조를 초기화하는 소스 코드는 무엇입니까?
  • 여전히 _PTHREAD_TSD_OFFSET이 있고 여전히 __TSD_RESERVED_MAX * sizeof (포인터)보다 훨씬 큰 경우 그 사이에 사용 된 공간은 무엇입니까?

답변

1

이것은 libpthread subcomponent에 정의되어 있습니다 (OSX 바이너리 마하 - O를 사용하기 때문에, dyld도 어떻게 든이에 관여하는 것으로 보인다). 특히 struct _pthreadinternal.h입니다. tsd 필드는 gsbase가 가리키는 스레드 특정 데이터의 배열입니다. 첫 번째 _INTERNAL_POSIX_THREAD_KEYS_MAX (현재 256 개) 요소는 Apple에 예약되어 있습니다. 나머지 _EXTERNAL_POSIX_THREAD_KEYS_MAX (현재 512 개의 macOS) 요소는 pthread_key_create()의 발신자 용입니다.

내부 슬롯은 다양한 시스템 라이브러리/프레임 워크 및 C 라이브러리 용도로 예약되어 있습니다. 일부 예약은 tsd_private.h에 설명되어 있습니다.

관련 문제