ncloader  0.1
 모두 데이타 구조 파일들 함수 변수 타입정의 열거형 타입 열거형 멤버 매크로 그룹들 페이지들
Memory initializing for Protected Mode

보호모드 메모리 초기화 더 자세히 ...

+ Memory initializing for Protected Mode에 대한 협력 다이어그램:

모듈

 Memory Range Descriptors
 실제 코드로 구현 하면 아래와 같다.
 
 Global Descriptor Table
 

상세한 설명

보호모드 메모리 초기화

앞서 stage 1 에서는 Real mode 에서으 memory map 에 대해서 이야기 했었다. 이번 장에서는 Protected mode 로 진입하기 위한 Memory 설정 방법에 대해서 알아본다.

arhictecture 를 초기화하는 arch_init 구현체에서는 CPU 를 초기화 하면서 인터럽트 관련 기능들도 초기화한다.

Stage 1 에서 Stage 2를 Loading 할 때, Stage 1 이 사용하는 Memory layout 도 중요하다. Stage 1 이 Stage 2 를 Loading 하면서 Stage 1 의 Code 또는 Stack 영역 을 덮어 쓰지 않도록 조심하자. 처음 Stage 1 은 0x4BFF 에 Stack Pointer 를 설정해서 사용하고 있었는데, Stage 2의 size 가 커지면서 0x4BFF 를 덮어 써버리면서 문제가 생겼었다.

날짜
2011-8-17

Stage 1 의 코드 자체를 Overwrite 해버리는 경우가 밸생했다. 이를 해결하기 위해서 stage1 을 0x500 으로 복사했다. 이는 0x7c00에 로딩되고 나서 자기 자신을 0x500으로 복사한 후, 0x500 으로 점프하여 실행을 계속 하도록 했다. 이를 위해서 모든 변수는 relative 하게 처리되도록 했다. 다음은 Relative 처리를 한 코드의 일부이다.

; Jump to the move'd "after" label
mov si, after
sub si, BOOT
add si, MOVE
jmp si
after: