Study/Kenrel

Segment & Offset

Mungsul 2015. 9. 21. 13:11

컴퓨터가 부팅하면서 디스크 첫 512바이트(MBR)를 램으로 읽어들인다.

이 과정에서 바이오스는 디스크에 있는 프로그램을 램의 0x07c00 번지에 복사한다.


0x07c00은 0x07c0:0000, 0x0000:7c00, 0x0700:0c00 등 많은 방법으로 표현할 수 있는데, 0x07c00 을 물리주소라 칭하고 0x07c0:0000 등을 논리주소라고 한다.


물리주소는 CPU와 RAM의 연걸선인 어드레스 버스에 실제로 나타나는 전기 신호이다.

논리주소는 프로그래머가 소스를 작성할 때와 기계어에서 사용된다. CPU에서 실행될 때는 이 논리주소를 물리주소로 변환시켜 사용함.


논리주소 -> 물리주소 변환 (Real Mode)

0x07c0:0000 => 0x7c00 + 0x0000 = 0x07c00

0x2004:0101 => 0x20040 + 0x0101 = 0x20141

(세그먼트):(오프셋) => (세그먼트 << 4) + 오프셋 = 물리주소

16진수로 세그먼트에서 오른쪽에 0하나 붙이고 오프셋 더하면 됨.


Protected Mode에서는 다른 방식으로 변환을 한다.