[yummyHitOS] 6 day (2017.07.09)

4 분 소요

A20 게이트를 활성화해서 1MB이상 영역에 접근...네? 뭘 활성화해요? 내가 아는 게이트는 게이트웨이밖에 없는데.. =_=

도대체 A20 게이트가 뭘까요!? 이게 뭔데 감히 우리가 활성화 해주어야하고 1MB이상 영역에 접근할 수 있게 해준다는 건지..

그렇게.. 우리는 컴퓨터의 역사를 알아가려 합니다..(우리나라 역사도 제대로 알지 못하면서 뭔 컴퓨터 역사를 이렇게까지..히규히규..ㅠㅠ)


8086 processor

약 12년 전까지만 해도 "Modem"이라는(오늘날의 공유기 같은 것) 통신장치를 이용해서 인터넷을 사용했는데, 그 당시 CPU는 INTEL 80486 프로세서였어요!! 그보다 더 이전에는 INTEL 80386(많~이 보셨을 i386 이예여!!)프로세서였구요!! 갑자기 쓸데없는 역사가 마구 튀어나오니 재미없으시져? ㅜㅠㅜ죄송해여 제가 글을 참 못써서... 저렇게 더 과거로 돌아가다보면 INTEL 8086 프로세서에 도달합니다!!(대충 설명하고 과거로 돌아오기 성공!!)

그렇다면 한 번 살펴볼게여!! 그 어마어마한 과거의 8086 프로세서를!!



눈에 뙇 띄는 AD0, AD1, AD2... AD15, A16 ... A19 !! 갯수도 딱 20개네여? 어멋 이런 Lucky~☆(참, 지인들한테 읽어보라했더니 너무 파오후 쿰척쿰척하게 글쓴다고 마상을 주어써여.. 쿰척쿰척)



20개의 어드레스 주소는 즉 20비트 주소 체계를 의미하고, 2^20을 계산하면 1,024 * 1,024 니까 딱~봐도 1MB같죠?(너무하네.. 어딜봐서 1MB냐능.. 1,024byte = 1KB 이고, 1KB * 1,024 = 1,024KB = 1MB 간단하네영!! 곱셈만 할 줄 알면 계산 되는 거여써!)

허나... 8086 프로세서는 16비트 CPU예여 T^T 이놈의 16비트를 20비트로 만들기 위해 4비트만큼 시프트해버리면 되겠져!?

라고 생각한 제 머리를 물기짜듯 비틀고싶네여.. 여태 메모리 접근 방식으로 Segment:Offset 을 이용했는데(부트로더에서 jmp 0x1000:0000와 같은!!), 이를 이용해 0xFFFF:0010을 하면 21bit가 된단 말이예여 ㅜㅜ(0x0010은 10진수로 16이므로, 4비트가 되지여!!) 우리의 8086 프로세서는 딱 20비트까지만 인식하는 철벽 단호박이라서 우린 딱 맞춰줘야할 필요가 있어요!!

그런데 8086 프로세서 다음 버전인(실제로는 무수한 프로세서가 있더라구여.. 전 필요한 것만 쏙쏙 빼먹겠습니당!) 80286 프로세서는 24비트 크기의 메모리 버스.. 즉 방금의 시프트는 8086 프로세서는 철벽치고 80286 프로세서는 넘나 맛있게 받는다는 것이죠!!


A20 gate

이러한 문제점을 위해 등장한!! 우리가 이제 사용할!! A20 게이트가 짜잔 하고 나타납니다!!



왼쪽의 A20게이트가 0으로 설정되어 있는지, 1로 설정되어 있는지에 따라 CPU의 1이 AND 게이트를 통해 0이 될지 1이 될지 정해지겠죠!? 이것을 정해주는 작업은 3가지가 있다구 해요!!


1. 시스템 컨트롤 포트 A

2. 바이오스 콜

3. 키보드 컨트롤러


우리는 시스템 컨트롤 포트 A를 이용하려나 봐요!! 이 포트는 0x92번지에 있으니, 0x92번지에 A20 게이트를 Off 하는 0 / On 하는 1 중 1을 보내주면 되겠죠!?


; 시스템 컨트롤 포트 A를 통한 A20 게이트 설정
mov al, 2
out 0x92, al


나중에 사용할 바이오스 콜과 키보드 컨트롤러를 미리 설명드리자면.. 바이오스 콜을 이용해 A20 게이트에 접근하는 것은 0x15번 콜을 이용하면 된다고 합니다. 0x2400 값이 A20 Disable / 0x2401 값이 A20 Enable 이라고 하니 우리는 0x2401로 정해주면 되겠죠!?


; 바이오스 콜을 이용한 A20 게이트 설정

mov ax, 0x2401
int 0x15


그리고 마지막으로 키보드컨트롤러!! 포트 I/O(포트번호 0x64)를 통해서 0xDD값을 전달하면~ A20 Enable, 0xDF값을 전달하면~ A20 Disable 이라고 하네요!!(보기 싫은 극혐 사진이 있는데 저만 볼 수 없으니 투척해야겠어여 ㅎ헿헤헤헤헿)



나닛?! 이게 무시다야... 나중을 위해 알아야 할 값들이예여ㅜㅠ 키보드도, 마우스도 다 이런 방식으로 구현할 거니까여.. 미리 혐오하고 있다보면 나중엔 조금 정이 가지 않을까여?!(왜 오이는 30년이 가까이 오도록 혐오스러울까여.. 오이 넘나 싫은 것~~)


이렇게 A20 게이트를 통해 8086 프로세서의 21bit를 80286 그 이상의 80x86 모든 프로세서에서도 받아들여 똑같이 작동할 수 있게 되었어여!! 박수 쨕쨕~


그리고 바로 다음 페이지로 넘어가니.. 으음? 모래반지 빵야빵야~ IA-32e 모드는 무엇이져?



배부른데 또 먹는게 나오네영 파오후 쿰척쿰척

Intel Architecture 32bit라고 하네여.. e가 붙는 것은 64bit래여!! EM64T라구 해서 인텔64비트라고 하는데.. 그 역사는 알고 싶지 안쿤여!! 시작도 하기 전에 쫄았더니.. 생각보다 간단한 놈이었어요. 이 친구가 지원하는 메모리 모델로 '리얼모드' 와 '보호모드' 가 있다고 하는데, 이것은 위키백과느님께서 오지게 설명해주셨어요!


Memory model

실제 모드(real mode)

처음 부팅했을 때 기본으로 활성화되는 모드이다. 옛 도스의 경우 이 모드를 사용했지만, 마이크로소프트 윈도와 리눅스를 비롯한 최근의 운영 체제들은 거의 대부분 보호 모드를 사용하기 때문에 부팅될 때 보호 모드로 전환하는 명령을 사용한다.


보호 모드(protected mode)

1MB 이상의 메모리를 지원할 뿐만 아니라 다양한 장점을 가지고 있다. 보호 모드의 가장 큰 장점은 멀티태스킹을 지원하고 이를 위해 가상 메모리와 메모리 접근 권한을 지원한다는 것이며, 따라서 최근의 거의 모든 운영 체제는 보호 모드를 사용한다. 주소가 32비트이기 때문에 보호 모드에서 사용할 수 있는 메모리는 보통 4GB로 제한되어 있지만, 64비트 아키텍처로 전환하지 않고도 4GB 이상의 메모리를 접근할 수 있는 방법이 몇 가지 있다. 그중 하나로 가상 메모리의 페이지 테이블을 확장하여 64GB까지를 사용할 수 있는 물리 주소 확장(Physical Address Extension)이 있다. 보호 모드는 가상 8086 모드(virtual 8086 mode)라 하여, 옛 도스 프로그램과 운영 체제를 보호 모드의 운영 체제의 통제 아래서 실행할 수 있는 특수한 모드를 제공한다. 이 모드는 IA-16의 보호 모드에서는 지원하지 않던 것으로 IA-32에서 추가된 것이다.


우리가 고작 1MB 크기에 만조쿠할 사람들입니까!?!!?!?? 우린 나중에 보호모드로 접근을 하게될거예요!!

그러기 위해 우선 커널을 초기화하는 작업들이 열심히 적혀있네요.. 오늘도 책의 저자 한승훈느님께 감사 인사를 드리며.. 책의 8.3장에도 A20 게이트가 열심히 설명되어 있지만.. 저의 이 얄팍하고 멍청한 두뇌로는 이해가 잘 안되더라구요ㅜㅜ


이제 나머지 책의 8장을 쭈욱 따라가시면 잘 실행 되실거예요!! 아직까지 문제가 될 부분은 없지요 핳하핳하핳...

혹시 제가 설명을 잘 못하였거나 ㅜㅠ A20 게이트가 아직도 뭔지 모르겠다!! 하시는 분께서는 구글신님께 부탁을 드리시는게 현명할 것 같아여!! 저도 여러 페이지를 참고해서 겨우겨우 이해를 시킨 것이기에.. 틀릴 수도 있거든용 ㅜㅠㅜ


참 그리구.. 제가 4일만에 돌아오게 된 이유는 ㅜㅠㅜㅠ나중에 설명드릴게여 4일을 밤샜는데 해결하지 못한 문제가 너무 단순한 거여서 초큼 화가나네여.. 쒸익,, 쒸익,, ㅡ_ -^ 그럼 이제 다음 장에서 페이지 기능에 대해 알아보아여!!


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

카테고리:

업데이트:

댓글남기기