2013-10-03 3 views
1

현재 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 함수에 대한 포인터이며, 이것은 내가보고있는 구조체와 일치하지 않는 것처럼 보입니다.

내가 누락 된 부분을 지적하거나, 관련 문서를 제안하거나, 소스 코드의 올바른 부분을 지적하면 매우 감사 할 것입니다.

감사합니다.

릭.

답변

1

Linux에서는 말할 수 없지만 일반적으로 TLS 저장소를 사용하여 각 스레드에 스레드와 관련된 임의의 저장소를 할당 할 수 있습니다.

저는 elf가로드 된 이후에 x86 명령어를 실제로 모방한다고 가정하기 때문에 여기서는 elf가 재미 있지 않습니다.

그런 경우 TLS 저장소를 시뮬레이트해야합니다. 즉, 에뮬레이트 된 각 스레드 (추적해야 함)마다 해당 스레드의 GS 레지스터와 관련된 별도의 값을 추적해야합니다. 이렇게하려면 OS 스레드 생성/중지/inspect/kill 호출과 OS-TLS 초기화 호출을 에뮬레이션해야합니다. (에뮬레이트 된) 스레드 생성 호출은 에뮬레이트 된 VM 내부의 특정 할당 공간을 에뮬레이트 된 스레드의 GS 레지스터에 할당하게합니다.

일단 TLS에 관한 모든 것이 프로세스 공간에서 작동하는 일반 기계 명령어이므로 GS 액세스를 에뮬레이트하는 것으로 충분합니다.

+0

감사합니다. Ira. TLS는 스레드 당 데이터를 저장한다는 것을 알고 있습니다. OS TLS 초기화를 복제해야한다고 말하면 나는 동의한다. 내 질문은 이것이 어디에서/어떤 구조로 이루어 졌는가? 감사합니다 – rick

+0

스레드를 만들려면 호출이 이루어질 때 수행됩니다; 그 시점에서 OS는 프로세스의 가상 공간 어딘가에 TCB를 할당하고 그 스레드 *를 가리 키도록 GS 레지스터를 설정합니다. 물론 이것을 에뮬레이션해야합니다. Linux에 대해서는 Dunno가 아니지만 Windows에서는 TLS 할당/액세스/업데이트 루틴이 있습니다.이 루틴은 스레드 가시/흥미로운 방식으로 해당 TCB의 내용을 수정합니다. 당신도 이것들을 에뮬레이션해야합니다. 하지만 다른 일은해서는 안됩니다. ... –

+0

... 스레드가 TLS 슬롯에 넣기로 결정한 것은 비즈니스이고, 이미 데이터를 처리하기 위해 이미 에뮬레이트하고있는 시스템 코드가 있습니다. 따라서 에뮬레이터가 에뮬레이트하는 것보다 더 많은 데이터 구조가 참조되는 데이터 구조에 신경 쓸 필요가 없습니다. ... –