반응형

해당 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






반응형
,