현재 GCC로 컴파일 된 32 비트 x86 ELF 파일을 실행하기위한 에뮬레이터를 구현하고 있으며 TLS (Thread Local Storage)를 이해하려고합니다. 스레드 제어 블록 (TLS 변형 2?)
는 지금까지 내가 이해할 수있는, %의 GS에 참조 된 메모리 : 0이 TCB를 (제어 블록 스레드)이 포함되어 : - 나는 다음과 같은 질문을 가지고있는 주제에 울리히 Dreppers 용지를 읽으면서. 그러나이 구조체에 어떤 구조가 저장되어 있는지 정확히 알 수 없습니다. 내 kernals 소스 코드를 검색해 보면 유망한 (tcbhead_t 및 몇 가지 다른) 구조체를 찾을 수 있지만 내 시스템 (Ubuntu 2.6.32-41-generic)의 오프셋 0x10에 저장된 값을 알고 있습니다. 구조체는 __kernal_vsyscall 함수에 대한 포인터이며, 이것은 내가보고있는 구조체와 일치하지 않는 것처럼 보입니다.내가 누락 된 부분을 지적하거나, 관련 문서를 제안하거나, 소스 코드의 올바른 부분을 지적하면 매우 감사 할 것입니다.
감사합니다.
릭.
감사합니다. Ira. TLS는 스레드 당 데이터를 저장한다는 것을 알고 있습니다. OS TLS 초기화를 복제해야한다고 말하면 나는 동의한다. 내 질문은 이것이 어디에서/어떤 구조로 이루어 졌는가? 감사합니다 – rick
스레드를 만들려면 호출이 이루어질 때 수행됩니다; 그 시점에서 OS는 프로세스의 가상 공간 어딘가에 TCB를 할당하고 그 스레드 *를 가리 키도록 GS 레지스터를 설정합니다. 물론 이것을 에뮬레이션해야합니다. Linux에 대해서는 Dunno가 아니지만 Windows에서는 TLS 할당/액세스/업데이트 루틴이 있습니다.이 루틴은 스레드 가시/흥미로운 방식으로 해당 TCB의 내용을 수정합니다. 당신도 이것들을 에뮬레이션해야합니다. 하지만 다른 일은해서는 안됩니다. ... –
... 스레드가 TLS 슬롯에 넣기로 결정한 것은 비즈니스이고, 이미 데이터를 처리하기 위해 이미 에뮬레이트하고있는 시스템 코드가 있습니다. 따라서 에뮬레이터가 에뮬레이트하는 것보다 더 많은 데이터 구조가 참조되는 데이터 구조에 신경 쓸 필요가 없습니다. ... –