바로 tls에 대한 내용임.
tls가 어떻게 구현되어있을까 너무 궁금했었음.
동적 tls의 경우에는 뭐 시스템콜을 써서 스레드별 pcb같은데에라도 접근해서 정보를 가져온다고 치자.
그러면 정적 tls는 어떻게 할건데?
정적 tls에서
__thread int hi;
라고 되어있으면
*hi = ?
read hi
둘다 모든 쓰레드가 같은 코드로 이루어져있어야할텐데
그러면 모두 뭐 시스템콜을 사용하도록 조정되려나?
애초에 그런 시스템콜이 존재하긴 하나?
그래서 내가 또 어셈블리로 어케 번역되나 까봤지.
그랫더니 fs 세그먼트 레지스터를 사용한다는거야!!!
현대 리눅스는 fs 세그먼트를 tls를 위해서 할당하는거였어.
그렇다면 지금 딱봐도 유저스페이스 메모리공간에다가, tls영역 만들어놓고 세그먼트 레지스터 지정해놓고
각 스레드가 자기 사물함에만 들락날락 거린다는거잖아??
아 또 해볼 실험이 있지
일단 각 쓰레드별로 tls의 주소를 찍는다.
이게 어떻게 찍힐지 모르겠어. 다른 세그먼트에 있는 데이터인데 주소가 어떻게 찍힐라나....
일단 이거를 실험해보고,
만약 주소가 기본 세그먼트 (뭔진모름) 기준으로 번역되어서 출력되어서 나온다면,
다른 tls의 영역에다가 직접 주소지정해서 접근가능한지,
이 보안이 막혀있는지 안막혀있는지
실험해볼 생각임
우후훗
TLS는 threesome love sex 인데 뭔소리야
근데 애초에 tls 자체가 뜨레드간에 독자적인 영역을 할당하기 위한 메커니즘인데 다른 영역에 주소를 직접 주소를 지정하려면 엑세스 자체가 안 되지 않을까?
되더라. 방금 실험해봄 ㅋㅋㅋㅋ
너도 실험해봐. 그리고 내가 알게된 사실이 하나가 더 있는데, fs 레지스터로 tls 데이터를 접근하는게 아니라, fs0x0에 tls주소가 써져있고, 그 받아온 tls주소에다가 오프셋을 빼서 주소계산을 다시하네. 주소계산을 두번진행함. 한번에 fs 디스크립터로 진행하는게 아니라, 두번 계산함