※ 전에 정리해놓은 보호모드에 대한 내용 : http://cotkdrl1.blog.me/10152722953
그냥 읽는 걸로는 지루해서 못해먹겠다.
그래서
단순하게 책 내용을 정리하였다.
심심하니까 숫자놀이까지 해가며 ㅋㅋ
■ 세그먼트 디스크립터
- 세그먼테이션 기법(메모리 관리 기법)에서 세그먼트의 정보를 나타내는 자료구조
- 세그먼트란 메모리 공간을 임의의 크기로 나눈 영역을 의미
- 세그먼트를 복잡하게 구성할수록 세그먼트 디스크립터의 수도 증가
=> 코드 세그먼트 디스크립터와 데이터 세그먼트 디스크립터로 나뉨
① 코드 세그먼트 디스크립터
- 실행 가능한 코드가 포함된 세그먼트에 대한 정보를 나타냄
- CS 세그먼트 셀렉터에 사용 됌
② 데이터 세그먼트 디스크립터
- 데이터가 포함된 세그먼트에 대한 정보를 나타냄
- CS 세그먼트 셀렉터를 제외한 나머지 셀렉터에 사용할 수 있음.
- 스택 영역 또한 데이터를 읽고 쓰는 데이터 영역의 한 종류이므로 데이터 세그먼트 디스크립터를 사용
=> 여기서의 셀렉터란 리얼 모드에서 사용했던 세그먼트 레지스터를 의미함. 보호모드에서 이름이 바뀐거임.
세그먼트 디스크립터의 가로 길이는 16비트.
▶ 필드에 대한 설명
① Base Address (기준 주소)
- 세그먼트의 시작 어드레스를 말한다.
- 32비트 크기이므로, 0~4GB 까지 설정 가능하다.
② Segment Limit (세그먼트 크기)
- 세그먼트의 크기를 나타냄
- 20비트 크기임
- G비트가 0이면 0~1MB까지 설정 가능하다. 왜냐면 2의 20승은 1메가이므로
- G비트가 1로 설정되면 4KB를 여기에다 곱해준다. 곱해주면 0~4GB까지 설정 가능하다.
4KB * 1MB는 4GB 이므로.
③ Type
- 세그먼트의 타입을 지정. 코드 or 데이터 세그먼트겠지.
- 타입 필드는 4비트이다.
4개의 비트 중에 첫번째 비트는 데이터 세그먼트인지, 코드 세그먼트인지를 나타낸다.
나머지 세 개의 비트의 의미는 첫 비트가 뭐인지에 따라 (어떤 종류의 세그먼트인지에 따라) 다르다.
왼쪽을 첫 번째 비트로 봤을 때.
i) 첫 비트가 0 (데이터 세그먼트)일 경우 => 읽기는 기본적으로 됌.
두 번째 비트(E) : 역방향 확장
= > 역방향 확장 비트는.. 아래로(상위 어드레스에서 하위 어드레스로) 자라는 스택을
위한옵션이다. 역방향 확장 기능을 사용하면 세그먼트 크기(Segment Limit) 값이 기준
주소에서 아래 (0바이트) 방향으로 적용되며, 세그먼트의 범위는 (세그먼트 기준 주소 -
세그먼트 크기) ~ 세그먼트의 기준 주소 가 된다.
(원래로 한다면 세그먼트 기준 주소 ~ (세그먼트 기준 주소 + 세그먼트 크기) 가
되겠지.)
세 번째 비트(W) : 쓰기
네 번째 비트(A) : 접근됨.
= > 접근됨 비트는.. 접근 여부를 나타내는 비트다. 프로세서에서 설정하는 비트로, 프로세스는 해당 디스크립터가 참조될 때마다 이 비트를 1로 설정한다. 이를 이용하면
특정 세그먼트 디스크립터가 사용되었는지 여부를 확인할 수 있다.
ii) 첫 비트가 1 (코드 세그먼트)일 경우 => 실행은 기본적으로 됌.
두 번째 비트(C) : 접근 승인
=> 권한에 관계없이 해당 코드 세그먼트에 접근할 수 있음을 나타냄.
승인 기능을 사용하면 애플리케이션도 커널 코드를 직접 실행할 수 있으며, 커널과 애플리케이션 간에 코드 공유가 필요할 때도 요긴하게 쓸 수 있다.
세 번째 비트(R) : 읽기
네 번째 비트(A) : 접근됨.
④ S
- 디스크립터의 타입
- 1로 설정할 경우에는 세그먼트 디스크립터를 나타내고, 0으로 설정하면 시스템 디스크립터를 나타낸다.
0: 시스템 디스크립터
1: 세그먼트 디스크립터 ⊃ 데이터 세그먼트, 코드 세그먼트
⑤ DPL(Descriptor Privilege Level)
- 해당 디스크립터를 사용하기 위해 필요한 권한을 말한다.
- 0(Highest)~1(Lowest) 의 범위를 갖는다.
- CPL(Current)이나 RPL(Requested Privilege Level)과 조합되어 접근 권한을 제한하는 데 사용
⑥ P
- Present의 의미로 현재 디스크립터가 유효한 디스크립터인지 표시
- 1로 설정하면 유효한 디스크립터임을 나타내며, 0으로 설정하면 유효하지 않은 디스크립터임을 나타냄
⑦ AVL
- Available의 약자로 OS가 임의의 용도로 사용할 수 있는 영역이다.
⑧ L
- IA-32e 모드에서 사용하는 필드로 64비트 코드 세그먼트나 32 비트 코드 세그먼트를 의미한다.
- 1 : IA-32e 모드의 64 비트용 코드 세그먼트임을 나타낸다.
0 : IA-32e 모드의 32비트 호환모드용 코드 세그먼트임을 나타낸다.
⑨ D/B
- Default Operation Size를 의미
- 1로 설정하면 32비트용 세그먼트임을 나타내며, 0으로 설정하면 16비트용 세그먼트임을 나타낸다.
⑩ G (Granularity)
- 디스크립터의 세그먼트 크기 필드에 곱해질 가중치를 의미
- 1로 설정하면 세그먼트 크기에 64KB를 곱하며, 0으로 설정하면 가중치를 곱하지 않는다.
* 결론: 책 171쪽과 이 그림을 참조하면 됌.
* 정리한 책 (출처): 64비트 멀티코어 OS 원리와 구조
세그먼트 디스크립터 타입에 대한 더 자세한 설명은
=>★★ 인텔 메뉴얼 "VOLUME 3A: System Programming Guide Part 1"의 "3.4.5. System Descriptors" 참고
'무근본 IT 지식 공유 > 무근본 운영체제(OS)' 카테고리의 다른 글
[무근본운영체제] OS에서 시스템 API란 (0) | 2023.09.19 |
---|---|
[무근본 OS 만들기] CPU 세그먼트 레지스터에 대해 (0) | 2023.03.26 |
[무근본 OS 만들기] 보호모드에서의 세그먼테이션, 페이징(Intel 메뉴얼 해석) (0) | 2023.03.26 |
[무근본 OS 만들기] 현재까지의 과정(부트로더-> 커널 엔트리 포인트-> C언어. Kernel32) (0) | 2023.03.26 |
[무근본 운영체제(OS) 공부] 실행파일이 메모리에 올라갔을 때의 그림 (0) | 2023.03.26 |
댓글