[yummyHitOS] 3 day (2017.07.04)

4 분 소요

컴퓨터 구조와 운영체제에 대해 자세히 공부하지 않은 상태에서 리버싱을 시작하고, 리버싱을 완벽하게 하지도 않은 상태로 거의 기초적인 두뇌로 OS개발을 시작하는 야미라고 부르고 yummyHit이라고 적는 필자는.. 점점 머리털이 파뿌리가 되는 것만 같다..

아! 갑자기 이렇게 기운 쭉쭉 빠지고 힘 빠지는 이야기를 한 이유는.. 책의 3장에서 다루던 메모리 구조를 넘어서서 이젠 세그먼트 디스크립터와.. GDT 테이블.. 보호모드.. 앍내가 이론을 아무리 못하지만 정말 컴퓨터는 너무 조흔데 머릿속에 이론이 암기가 안된단마리양!ㅑ!@ㅜㅑ!우ㅒㅑ@!ㅇ


후... 진정하고 하나 하나씩 공부해가면서 디스크립터와 GDT를 정의해보자.


GDT


위 그림을 보면 총 64bit를 32bit(4byte) 기준으로 세그먼트 디스크립터를 각 필드에 맞게 나눈 그림이다.


Base field

Base 필드(Base Address필드와 동일) : 실제 세그먼트를 통해 메모리에 접근할 때, 가산되어지는 값이며, 세그먼트의 시작 주소를 의미한다고 한다.

하위 비트부터 [ Base Address 15:00 -> Base 23:16 -> Base 31:24 ] 이므로 총 [ Base 31:00 ] 을 의미하고, 이는 32bit 크기이므로 4GB까지 설정할 수 있음을 의미한다!


Seg. Limit field

Seg. Limit 필드(Segment Limit필드와 동일) : 세그먼트가 허용하는 메모리 범위이며 세그먼트의 크기를 나타낸다고 한다. 하위 비트부터

[ Segment Limit 15:00 -> Seg. Limit 19:16 ] 이므로 총 [ Segment Limit 19:00 ] 을 의미하고, 이는 20bit 크기이므로 1MB까지 설정할 수 있음을 의미한다.

이 필드는 G필드와 관련지어 G필드 비트가 0으로 설정되어 있으면 Segment Limit는 1MB로 그대로이지만, G필드 비트가 1로 설정되어 있으면 4KB를 곱하게 되어 1MB * 4KB = 4GB !! 이 필드도 4GB까지 설정할 수 있다는 것이다 !! 이것이 32bit 운영체제가 4GB크기까지의 메모리만 사용할 수 있다는 이야기였나보다.. 오오 싱기방기 난 무슨 2^32가 4GB이기 때문에 메모리카드 4GB를 넘어봤자 필요가 없다고 막 인터넷과 친구들한테 들었던것 같은.. 기억왜곡? 꺌꺌


Type field

Type 필드 : 세그먼트 타입을 지정한다고 한다. 즉, 코드 세그먼트인지 데이터 세그먼트인지를 정하는 첫 번째 비트에 따라 나머지 3bit의 값이 달라진다!



11번 비트가 0이면 데이터 세그먼트, 1이면 코드 세그먼트이다. 그 외 3bit의 값이 0인지 1인지에 따라 각 디스크립션이 다른 것을 위 표로 확인할 수 있다!!


DPL field

DPL 필드 : 디스크립터 우선순위 레벨의 약자로, 해당 디스크립터를 사용할 수 있는 권한을 의미한다. 리눅스에서 nice, renice와 같은명령어를 아는 사람이라면 우선순위에 대해 잘 알고 있을 것이라 생각한다. 낮은 숫자일수록 우선순위가 높다는 것!!


이렇게 세그먼트 디스크립터를 알아보았다. 드디어 끝... 이 아니라니... 아직 GDT와 LDT가 남아있다 ㅜㅠㅜ 으ㅏ알아랑라너무하기실탕아니 싫은 것은 아니지만 지금 아쥬아쥬 열씸히 외우고 공부해도 나중에 또 아리까리해지고 기억잘안나고.. 이놈의 빠가사리!!!


이렇게 열심히 찾다보니 한 가지 좋은 꿀팁을 알아냈다!! 외람된 이야기지만, 모든 세그먼트 레지스터(CS, SS, DS, ES, FS, GS)는 80bit로 이루어져있는데, 이를 리버싱 중 Ollydbg와 같은 디버깅 툴에서는 16bit만 보인다는 것!!

이유는 소프트웨어가 직접 읽을 수 있는 범위가 16bit뿐이라고 한다. 나머지 64bit는 접근 불가능한.. 바로 우리가 방금 알아본 것과 같은 '디스크립터' 가 들어있는 곳이라고 한다!! 오우 이거 꿀팁 인또인또인~



위 세그먼트 디스크립터를 완벽히 이해했다면 GDT와 LDT는 쉬울 것 같다!(즉 난 아직도 완벽히 이해하지 못했다는 것...)

GDT는 Global Descriptor Table의 약자로, 코딩을 아주 잠깐 발에 있는 발가락 위 발톱 속 발톱 때의 분자를 분해한 원자만큼만 담궜어도 '전역 변수' 라는 것을 알 것이다!! 전역 변수는 Global Variable 이므로 GDT의 G 역시 글로벌!! 전역 디스크립터 테이블!!

이는 모든 프로그램이 참조할 수 있는 세그먼트 디스크립터를 모아놓은 테이블이라는 것!! 정말 중요한 것이라고 한다.


이 정말정말 내겐 없어서는 안 될 맥북과 같이 중요한 GDT라는 것은 책에서 더 자세히 설명해주고, 어셈블리어로 작성하는 것을 알려주니 오랜만에 PASS를 외치겠다. 패쓰!!!


그럼 이제 LDT는 딱~ 봐도 알 것 같지 않은가?! GDT의 G가 Global이었다면, LDT의 L은 Local이지 않을까!!

LDT는 각 태스크 단위로 정의할 수 있는 것이라고 한다.


흠... 그렇다면 GDT와 LDT 중 어떤 것을 사용해야 할지 어떻게 결정할까? 이것을 알기 전, GDTR과 LDTR이라는 특수한 레지스터가 있다는 것을 먼저 알고 넘어가자. 이 두 레지스터는 Entry 0부터 두 테이블의 최대 크기(계산법은 [GDT크기 필드] / [GDT디스크립터 수])인 8,192개까지 가리킨다.

이러한 GDTR과 LDTR이라는 레지스터를 사용하는 것은 세그먼트 레지스터가 결정한다!!(결국 모든 것은 세그먼트 레지스터가 결정한다 후후... 나를 이해하고 넘어가시지)



이 두 개의 사진으로 얼~추 설명이 가능할 것 같다. 저러한 Segment Register(왜 '세그먼트 레지스터' 라고 한글로 쓰다가 갑자기 또 어색하게 영어쓰시는지.. 참 알다가도 모를 사람일세 이 필자 참 답이 없구만)는 16bit로 이루어져 있다.

[ 15:03 ] 만큼의 13bit는 Selector부분이 차지하고 있는데, 13bit를 보면 무슨 생각이 나는가? 혹시 2^13을 생각하고 있진 않은가? 그렇다면 당신은 진정한 I☆T☆분☆야(설마.. 에이.. 정말 그것부터 생각나는 사람이 있을까...)

2^13은 8,192인데, 즉 GDTR이나 LDTR의 디스크립터 갯수와 똑같다! 모든 곳을 가리킬 수 있다는 것! 그래서 선택하는 Selector인가 보다 ㅎㅎ;;;;;;아이덥다;;;;;

그리고 [03:02] 만큼의 1bit는 GDT와 LDT 중 무엇을 선택할지 고르는 TI(Table Indicator, 디스크립터 테이블을 가리키는 녀석이로군 후훗.. 반갑네 친구)가 있고, [02:00] 만큼의 2bit는 RPL(Request Privilege Level, 디스크립터를 통한 요청시의 특권? 우선순위? 랍니다!)이 차지하고 있다.

RPL과 관련있는, 우선순위와 관련있는 DPL 외 2개가 더 있는데, 하나는 CPL(Current Privilege Level, 코드 세그먼트의 RPL)이고 다른 하나는 EPL(Effective Privilege Level, RPL값과 CPL값 중 큰 값)이다. 이 우선순위와 관련된 필드는 전부 2bit의 크기이고, 사실.. 이것들은 보호모드에서 설명해야 할 것 같은데 갑툭튀.. 하게 되었다. 또 설명하지 뭐~ ㅎㅎㅎㅎㅎ퍽퍽


이들은 세그먼트 레지스터를 위해 (CPL <= RPL) && (EPL <= DPL) 규칙을 만조쿠 해야한다!

레지스터는 파고 팔수록 뭔가 끝이 없는것 같아.. 나의 시공간 속으로.. 시.공.조.아☆



이제 CR0 컨트롤 레지스터와 보호모드로 전환하는 것은 책에서 아주 상세히 설명.. 이 아니라 정말 컨트롤 레지스터에 있는 필드와 그 의미들이 아~~주 자세히 적혀있다!! 이를 한땀 한땀 적어서 책으로 집필해주신 한승훈 선생님께 다시 한 번 감사의 말씀을 드립니다♥︎

위는 주요 컨트롤 레지스터가 갖는 필드 및 구조를 나타낸 것이고, 가장 하단의 CR0 컨트롤 레지스터가 우리가 원하는(원하시죠? 두유워닛? Do u wannit!) 컨트롤 레지스터이므로 좀 더 확대해서 봐야할 것 같다.



요로케 조로케 이루어져 있는 0x4000003B값을 통해 CR0 컨트롤 레지스터를 설정하여 보호모드로 전환!


드디어 보호모드로 전환하였다~ 짝짝짝~!!


이제 우린 C언어로 커널을 작성할 때가 된 듯 하다. 드디어 C언어라니... 어셈블리어도 좋았지만 난 역시 내 전문 C언어가 더욱 좋은 것 같다.


Check out the yummyhit’s website for more info on who am i. If you have questions, you can ask them on E-mail.

카테고리:

업데이트:

댓글남기기