Memory Segmentation

Knowledge 2016. 12. 27. 17:27


 Memory Segmentation이란 메모리를 '세그먼트'라는 영역으로 나눠 관리하는 것을 의미한다.




 먼저 어떤 프로세스에 대해 '액세스해도 좋은 메모리 범위(세그먼트)'를 정한다. 이는 해당 메모리의 시작 주소(Base Address), 크기(Limit), 권한을 포함하고 있다. 이런 각 세그먼트에 관한 정보를 Segment Descriptor라고 하며, 이를 모아서 테이블로 만든 것을 Descriptor Table 이라고 한다.


 16비트 리얼 모드에서는 ( 세그먼트 레지스터 * 16 + 오프셋 주소 )로 실제 주소를 구했지만, 보호 모드에서는 세그먼트 레지스터에 씌여진 값이 바로 주소로 연결되는 것이 아닌 Descriptor Table에서의 오프셋을 의미한다.


 세그먼트 레지스터에는 CS, DS, SS, ES, FS, GS 등이 있다.




 세그먼트 레지스터는 상위 13비트는 Index, 그 다음 1비트는 TI(Table Indicator) 플래그, 그다음 2비트는 RPL(Requested Privilege Level)이라는 값으로 사용된다. 프로그램이 메모리 속의 데이터를 읽어 들일 때 DS 레지스터의 내용을 암시적으로 참조하게 된다.


 세그먼트 레지스터로 Segment Descriptor를 참조하여 Base Address를 구한 뒤, 오프셋 주소를 더해서 액세스할 번지를 구하는 것이다. 식으로 나타내면 ( DescriptorTable[DS_Register].BaseAddress + Offset ) 이라고 할 수 있다.


 이 때문에 보호 모드에서는 세그먼트 레지스터를 세그먼트 셀렉터(Segment Selector)라고 한다. Descriptor table을 각 프로세스마다 준비해두면 메모리를 보호할 수 있지만, 이는 다시 말해서 Descriptor Table을 프로세스 수만큼 생성해야 한다는 뜻이다. 따라서 여러 프로세스가 동시에 동작하면서 메모리에는 한 개 이상의 LDT가 존재하게 되는데, 이를 관리하기 위해 CPU는 시스템에 딱 하나만 존재하는 GDT(Global Descriptor Table)이라는 테이블을 이용한다. GDT는 LDT의 시작 주소와 그 크기 등이 작성된 테이블이다.


 CPU 내에는 GDT의 시작 주소와 그 크기를 담고 있는 GDTR이라는 레지스터가 존재한다.


 CPU는 현재 작동중인 프로세스의 Descriptor Table의 주소를 참조하기 위해 LDTR이라는 것을 사용한다. LDTR은 Local Descriptor Table Register의 약자로, 각 프로세스에 대해 준비된 Descriptor의 위치를 나타내기 위한 레지스터이다. OS에서 애플리케이션으로 제어가 넘어갈 때 OS는 LDTR에 해당 프로세스의 LDT를 가리키는 GDT의 Offset을 설정한다. 당연하게도 프로세스는 이 레지스터에 참조 또는 수정을 할 수 없는데, 수정할 수 있게 되면 프로세스 마음대로 Descriptor Table을 만들고 이를 참조하여 메모리 보호가 깨져버리기 때문이다. 


"세그먼트 레지스터 (셀렉터) 내부에는 TI라는 1비트짜리 플래그가 있는데, TI가 0일 경우 GDT를 참조하며 1인 경우 LDT를 참조한다."


이 부분이 의문이다.

LDTR을 이용하여 LDT를 참조한 후 Index를 이용해 Descriptor를 찾고 여기서 Base Address를 구하는 일반적인 방식을 사용하지 않고 어째서 GDT를 참조하는가 하는 것이다.

GDT를 참조한다고 해도 얻을 수 있는 것은 LDT의 주소 뿐이고 LDT 내부로 한번 더 참조해 들어가야 Base Address를 구할 수 있는데 셀렉터의 Index는 GDT를 구하는데 사용했으므로 더이상 LDT를 참조할 때 사용할 Offset이 없다.





...미완성된 글입니다. 혹시 의문을 해소해주실 수 있는 분이나 잘못된 부분을 발견하시면 댓글로 알려주시면 감사하겠습니다.

'Knowledge' 카테고리의 다른 글

리눅스 커널 공부 정리 0x02  (1) 2017.06.21
리눅스 커널 공부 정리 0x01  (0) 2017.06.20
Memory Segmentation  (0) 2016.12.27
NAT와 NAPT의 개념과 원리  (10) 2016.12.01
멀티 태스킹(Multi-Tasking)의 원리  (0) 2016.11.21
PCB (Process Control Block)  (0) 2016.11.14
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

댓글을 달아 주세요