세그먼트 셀렉트( ex. cs, ds, ss...)를 완전히 사용하지 않는것은 아닙니다.
그리고 리눅스가 세그먼트 기법을 사용하지 않는것도 아닙니다.
세그먼트는 사용하되 세그먼트 셀렉트에 의해 세그먼트를 사용(?)합니다. ^^?
뭔말인고 하니 32bit address mode로 넘어 오면서 세그먼트 레지스트는 세그먼트를 직접 지정하는 레지스트가 아니라 세그먼트 디스크립터를 지정하는 레지스트로 바뀌었습니다. 그래서 이름도 세그먼트 레지스트가 아니라 세그먼트 셀렉트입니다.
16bit 시절만 하더라도 cs 레지스트는 code segment를 바로 지정 할수가 있었습니다.
그러나 32bit로 넘어 오면서 cs 레지스트리의 값은 메모리상에 존제하는 segment 디스크립터의 index를 가지게 되었습니다.
그래서 gdtr(Global Descriptor Table Register)에서 지정하는 address 값에 (segment selecter의 index *8(size))을 더하여 메모리 상에 존제한 세그먼트 디스크립터를 구한후에 디스크립터에 있는 base address를 기준으로 세그멘테이션을 구현합니다.
그러나 base address가 0x0이고 limit가 0xffff(4G)이기 때문에 전체를 linear address를 하나의 segment로 보게 되는거지요.
세그먼트 셀렉트의 값이 디버깅시 0이였다면 분명 다른 문제가 있을겁니다.
index 0는 null entry로서 세그먼트 디스크립트의 모든 값이 0으로 설정되어 있어 실제로는 사용할수 없는 index입니다.
보통 세그먼트 셀렉터는 세그먼트 디스크립터에 대한 엑세스 속도를 높이기 위해 nonprogrammable register를 가지고 있는데 이것의 역활은 세그먼트 셀렉터의 값이 변경되었을때 위에 설명한 방식으로 세그먼트 디스크립트를 찾으면 세그먼트 디스크립터를 저장하게 되어 있습니다. (자동으로)
만약 중간에 세그먼트 셀렉터의 값이 0으로 변경되었다면 분명 nonprogrammable register의 값도 모든 bit가 0으로 변경되어 오류가 나게 되어있습니다.
그러므로 세그먼트 셀렉트의 값이 0이 될수는 없습니다.
ps. 답을 달고보니 질문 내용이 변경되어 버렸네요.
처음에 세그먼트 셀렉트가 0이 들어있었다는 내용에 대한 질문의 답으로 그대로 올립니다.
..
세그먼트 셀렉트( ex. cs, ds, ss...)를 완전히 사용하지 않는것은 아닙니다.
그리고 리눅스가 세그먼트 기법을 사용하지 않는것도 아닙니다.
세그먼트는 사용하되 세그먼트 셀렉트에 의해 세그먼트를 사용(?)합니다. ^^?
뭔말인고 하니 32bit address mode로 넘어 오면서 세그먼트 레지스트는 세그먼트를 직접 지정하는 레지스트가 아니라 세그먼트 디스크립터를 지정하는 레지스트로 바뀌었습니다. 그래서 이름도 세그먼트 레지스트가 아니라 세그먼트 셀렉트입니다.
16bit 시절만 하더라도 cs 레지스트는 code segment를 바로 지정 할수가 있었습니다.
그러나 32bit로 넘어 오면서 cs 레지스트리의 값은 메모리상에 존제하는 segment 디스크립터의 index를 가지게 되었습니다.
그래서 gdtr(Global Descriptor Table Register)에서 지정하는 address 값에 (segment selecter의 index *8(size))을 더하여 메모리 상에 존제한 세그먼트 디스크립터를 구한후에 디스크립터에 있는 base address를 기준으로 세그멘테이션을 구현합니다.
그러나 base address가 0x0이고 limit가 0xffff(4G)이기 때문에 전체를 linear address를 하나의 segment로 보게 되는거지요.
세그먼트 셀렉트의 값이 디버깅시 0이였다면 분명 다른 문제가 있을겁니다.
index 0는 null entry로서 세그먼트 디스크립트의 모든 값이 0으로 설정되어 있어 실제로는 사용할수 없는 index입니다.
보통 세그먼트 셀렉터는 세그먼트 디스크립터에 대한 엑세스 속도를 높이기 위해 nonprogrammable register를 가지고 있는데 이것의 역활은 세그먼트 셀렉터의 값이 변경되었을때 위에 설명한 방식으로 세그먼트 디스크립트를 찾으면 세그먼트 디스크립터를 저장하게 되어 있습니다. (자동으로)
만약 중간에 세그먼트 셀렉터의 값이 0으로 변경되었다면 분명 nonprogrammable register의 값도 모든 bit가 0으로 변경되어 오류가 나게 되어있습니다.
그러므로 세그먼트 셀렉트의 값이 0이 될수는 없습니다.
ps. 답을 달고보니 질문 내용이 변경되어 버렸네요.
처음에 세그먼트 셀렉트가 0이 들어있었다는 내용에 대한 질문의 답으로 그대로 올립니다.
댓글 달기