해당 OS의 이미지
-부트 로더
-보호 모드 커널
-IA-32e 모드 커널
~>각 부분은 섹터 단위로 정렬해서 하나의 부팅 이미지 파일로 합침
~>따라서 디스크의 두 번째 섹터부터 읽어서 특정 메모리 어드레스에 순서대로 복사하면 이미지 로딩은 끝!
~>여기서 플로피 디스크 두번 째 부터 로딩하는 이유는 첫 번째 섹터는 부트로더로 BIOS가 메모리에 로딩하기 떄문
~>플로피 디스크의 섹터는 섹터->헤드->트랙 순으로 배열되어 있으므로 순서만 지킨다면 문제 없이 로딩할 수 있음
*BIOS 섹터 읽기 기능은 최대 128섹터까지 읽을 수 있으므로 한 트랙에 있는 섹터의 배수 단위(18 섹터)로 읽게 하면 코드를 간단히 할 수 있다.
스택 초기화& 함수 구현~> 스택에대한 내용을 분명어디다가 정리를 해둿는데 어따가 해놧는지 기억이안나네요 .,.나중에 따로 링크걸겟습니다
-x86 프로세서에서 함수를 사용하려면 스택(Stack)을 꼭 사용해야 한다.
-LIFO(Last In First Out)구조
-함수 호출을 위해 가장 먼저 해야 할일 ~> '스택 생성'
-SS(Stack Segment)
-스택 영역으로 사용할 세그먼트의 기준 주소 지정
-스택 세그먼트의 범위는 지정할 수 있지만, 실제 스택의 크기는 지정 불가
-SP(Stack Pointer)
-데이터를 삽입하고 제거하는 상위 지정
-실제 스택의 크기 지정
-BP(Base Pointer)
-스택의 기준 주소를 임시로 지정할 때 사용
-실제 스택의 크기 지정
~>각 레지스터&어셈블 명령어의 자세한 내용이 궁금하다면 ' system - 기초' 포스팅을 참조하기 바람
[스택 초기화 코드]
; 스택을 0x0000 :0000 ~ 0x0000:FFFF영역에 64KB 크기로 생성한다 가정
mov ax,0x0000
mov ss, ax
mov sp,0xFFFE
mov bp,0xFFFE
*스택에 삽입된 파라미터에 접근하려면 가변적인 SP 대신 스택에 고정된 값을 가리키는 레지스터를 사용하는 것이 편리하다. 이러한 역할을 하는 것이 BP이며, 호출된 함수는 BP+offset으로 파라미터에 접근하게 된다.
[보호 모드에서 사용되는 세가지 함수 호출 규약]
~>리얼 모드의 경우 스택의 기본 크기가 word(2byte)엿지만 보호모드의 경우 스택의 기본크기가 dword(4byte)임
호출 규약(Calling Convention)
-함수를 호출할 때 파라미터와 복귀 어드레스 등을 지정하는 규칙
-stdcall(Standard Call)
-파라미터를 스택에 저장
-호출된 쪽에서 스택을 정리
-함수의 반환 값을 'EAX'를 사용하여 스택에서 파라미터를 제거
-cdecl(C-Declare Call)
-파라미터를 스택에 저장
-함수를 호출할 쪽에서 스택을 정리
-즉, 호출한 함수가 대신 처리한다.
-fastcall
-각 컴파일러마다 구현하는 방식이 조금씩 다름
-일부 파라미터를 레지스터에 저장하는 것을 제외하면 stdcall방식과 같음
-MS사 컴파일러 경우, 처음 파라미터를 ECX와 EDX 레지스터에 삽입하는 것을 제외하고는 stdcall과 같음
[최종 부트로더 소스]~>왠일로 한큐에 잘 돌아가서 기분이 날아갈것 같습니다.. haha
'과거의 컴퓨터 공부 > 64bit OS 만들기' 카테고리의 다른 글
(11)엔트리 포인트(Entry Point) & 섹션(Section) (0) | 2014.04.04 |
---|---|
(10) 보호 모드용 커널 이미지 빌드 & 가상 OS 이미지 교체 (0) | 2014.04.04 |
(5)BIOS 서비스와 소프트웨어 인터럽트 (0) | 2014.03.29 |
(4)부팅과 부트로더-3.부트로더의 제작, 테스트 (0) | 2014.03.29 |
(4)부팅과 부트로더-2.디렉토리 구조 생성, makefile 생성 (0) | 2014.03.29 |