본문 바로가기

운영체제 정리/64비트 OS 만들기 실습

[64비트 멀티코어 OS 원리와 구조] 5장 - 플로피 디스크에서 OS 이미지를 로딩하자

- BIOS 기능을 사용해서 플로피 디스크를 제어하자

- 가상 OS 이미지를 만들고 로딩한다

 

5.1 BIOS 서비스와 소프트웨어 인터럽트

- BIOS의 기능은 소프트웨어 인터럽트를 호출해서 사용한다.

- 인터럽트 벡터 테이블은 메모리 어드레스 0에 존재한다. 테이블의 각 항목은 인덱스에 해당하는 인터럽트가 발생했을 때 처리하는 함수 어드레스가 저장되어 있으며, 4바이트다.

- 인터럽트는 최대 256개까지 설정 가능하다. 그래서 리얼 모드의 인터럽트 벡터 크기는 최대 1024 바이트다.

 

- BIOS는 레지스터 방식으로 파라미터와 결과값을 주고받는다. AX, BX, CX, DX 레지스터와 ES 세그먼트 레지스터를 사용해서 파라미터를 넘겨주며 결과값도 레지스터를 통해 넘겨 받는다.

 

디스크 구조 (3.5인치, 2.88mb 기준)

- 헤드: 디스크의 표면. 보통 2개 (앞,뒤) (0~1)

- 트랙: 디스크를 여러개의 동심원으로 나누었을때 그 동심원 하나의 영역. 플로피 디스크의 경우 80개로 구분

- 섹터: 트랙을 다시 여러개로 자른 값. 플로피는 1개 트랙을 18개로 구분(1.44mb의 경우임. 2.88mb의 경우는 36개로 구분) 섹터 1개는 512바이트다. (1~36)

- 섹터 -> 헤드 -> 트랙의 순서로 증가시킨다.

 

5.2 OS 이미지 로딩 기능 구현

- MINT64 OS의 이미지는 크게 부트 로더, 보호 모드 커널, IA-32e 모드 커널로 구성됨. 각 부분은 섹터 단위로 정렬해서 하나의 부팅 이미지 파일로 합침.

- 디스크의 두번째 섹터부터 읽어서 특정 메모리 어드레스에 순서대로 복사하면 이미지 로딩은 끝. (첫번째 섹터는 부트 로더)

- OS 이미지를 0x10000(64kbyte)에 로딩해서 설정. 0x10000 하위 여역을 다른 용도로 사용하기에 남겨둠.

- 플로피 디스크의 첫번째 섹터는 부트 로더. BIOS가 메모리에 로딩한다. 따라서, 플로피 디스크의 두번째 섹터부터 OS 이미지 크기만큼 읽어서 메모리에 복사하면 된다. 플로피 디스크의 섹터는 섹터 -> 헤드 -> 트랙의 순서로 배열되어 있으므로 이 순서만 지키면 큰 문제 없이 로딩 가능.

 

스택 초기화와 함수 구현

x86 프로세서에서 함수를 사용하려면 스택이 필요함.

자세한 내용은 책이나 저자 깃허브 참고 필요

 

내가 궁금해서 찾은 내용들

1. 스택의 메모리 주소가 거꾸로 자라는 이유

더보기

스택(Stack)은 메모리 주소가 거꾸로 자라는 자료 구조입니다. 이러한 스택의 동작 방식을 "후입선출(LIFO, Last-In-First-Out)" 또는 "후처리선입선출(LILO, Last-In-Last-Out)"라고 합니다.

스택이 메모리 주소가 거꾸로 자라는 이유는 주로 하드웨어적인 이유와 프로세서가 스택을 쉽게 구현하기 위한 편의성 때문입니다. 몇 가지 이유를 설명하겠습니다:

1. 편의성: 스택은 함수 호출과 반환, 지역 변수 등을 처리하는 데 유용합니다. 함수 호출 시 스택에 매개변수와 복귀 주소를 저장하고, 함수의 실행이 끝날 때 스택에서 이 정보들을 꺼내와 복귀하게 됩니다. 이때 후입선출 방식으로 스택이 구성되면 함수가 반환되었을 때 필요한 정보들을 마지막으로 저장했던 것부터 차례로 꺼내서 사용할 수 있습니다.

2. 하드웨어 지원: 많은 프로세서 아키텍처에서 스택은 메모리 주소가 감소하는 방향으로 자라도록 설계되었습니다. 스택은 스택 포인터(SP) 레지스터로 관리되며, 프로세서가 PUSH와 POP 명령어를 사용하여 스택에 데이터를 쓰거나 읽을 때 SP 레지스터의 값을 증가 또는 감소시킵니다. SP 레지스터를 감소시키면 메모리 주소가 거꾸로 자라는 효과를 얻을 수 있습니다.

3. Cache 관리: 스택이 메모리 주소가 거꾸로 자라면, 스택의 데이터들이 상대적으로 가까운 주소에 위치하게 됩니다. 이렇게 되면 캐시(Cache) 메모리 등의 하드웨어 메모리 관리 기법에서 스택 데이터를 효율적으로 활용할 수 있게 됩니다.

이러한 이유들로 인해 스택은 주로 메모리 주소가 거꾸로 자라는 후입선출(LIFO) 구조를 가지게 되었습니다. 이는 프로그래밍에서 함수 호출과 관련된 작업을 편리하게 처리하는 데에 매우 유용합니다.

 

 

5.3 테스트를 위한 가상 OS 이미지 생성

이 부분은 간단함. 책에 나와있는 부분 그대로 따라하면 됨.

 

결과물

 

참고:

https://product.kyobobook.co.kr/detail/S000001223755

 

64비트 멀티코어 OS 원리와 구조 1 | 한승훈 - 교보문고

64비트 멀티코어 OS 원리와 구조 1 | 부트 로더에서 GUI까지, 운영체제의 모든 것을 직접 제작한다!OS 개발 60일 프로젝트『64비트 멀티코어 OS 원리와 구조』제1권. 이 책은 저자가 직접 OS를 개발하

product.kyobobook.co.kr

저자 깃허브:

https://github.com/kkamagui/mint64os-examples

 

GitHub - kkamagui/mint64os-examples: "64비트 멀티코어 OS 원리와 구조" 의 예제 소스 코드

"64비트 멀티코어 OS 원리와 구조" 의 예제 소스 코드. Contribute to kkamagui/mint64os-examples development by creating an account on GitHub.

github.com