본문 바로가기
OS

[32bit] 커널 프로그램 만들기

by 올리고당 2021. 7. 27.

목차

 


커널이 뭔가요?

사전적 정의를 먼저 살펴보겠습니다.

씨앗의 안쪽 부분.
생각이나 주제에 대한 중심의, 중요한 부분. - oxford 영어사전

 

컴퓨터에서의 커널이란, 다음 그림과 같습니다.

 

 

사진에 나와 있는 내용을 전부 다루지는 않습니다. 책에서 주로 다루는 내용은 프로세스 관리( Process Management )메모리 관리( Memory Management )입니다. 두 부분을 좀 더 중점적으로 공부할 수 있을 것으로 예상합니다.

 


커널 프로그램

아직 커널이라고 하기에는 많이 부족한 프로그램이지만, 커널을 만들어봅시다. kernel.asm 파일로 작성해주세요.

 

kernel.asm

 


코드 설명

( line 7 )

xor ax, ax :  xor 연산은 자리 수마다 같으면 0, 다르면 1의 결괏값을 산출하여 오퍼랜드 1에 대입합니다.  같은 수에 대해 xor 연산을 수행하고 있으므로, ax에 0을 대입하는 연산입니다. 프로그램의 총 용량를 줄이기 위해 이런 테크닉을 사용하기도 합니다.

 

( line 10 )

lea 오퍼랜드1 오퍼랜드2 : 오퍼랜드 2의 effective address를 오퍼랜드 1에 로드해라. ( load effective address )

 

( line 14, 34 )

call 오퍼랜드 : 현재 ip를 스택에 넣은 다음, 오퍼랜드로 이동해라.( ip값 오퍼랜드로 바꿔라. )

ret : 스택에서 ip를 꺼내 호출한 곳으로 돌아가라. ( return )

 

call, ret 명령어 실행 시, 스택 변화

 

esp :  스택포인터입니다. 스택에서 가장 최근에 들어온 값을 가리킵니다. ( extended stack pointer )

 

call 명령어는 동작만 보면, jmp 명령어와 유사합니만, jmp 명령어는 점프했던 곳으로 다시 돌아갈 수 없습니다. 프로그램의 전체 흐름을 한번 살펴보면, ( 1 ~ 14 ) -> ( 18 ~ 21 ) -> ( 21 ~ 30 반복 ) -> ( 31 ~ 34 ) -> ( 15 ~ 16 ) 순으로 실행됩니다.

 

( line 19, 33 ) 

push 오퍼랜드 : 스택에 오퍼랜드를 넣어라.

pop 오퍼랜드 : 스택에서 뺀 값을 오퍼랜드에 넣어라.

 

printf_loop에서 eax 레지스터의 일부인 al 레지스터를 사용하므로, 원래의 값을 보존하기 위해서 서브 루틴( subroutine )이 시작할 때 잠시 스택에 넣었다가 끝날 때 다시 빼는 코드입니다.

 

 


vmware 시뮬레이션

컴파일해주세요.

 

copy 명령어를 이용해 두 파일을 합쳐 하나의 .img 파일을 만들겠습니다. 이상하게도, vs code의 파워 쉘( power shell )에서 명령어가 제대로 작동하지 않는 문제가 있습니다. windows의 cmd창을 열어서 copy 명령어를 다음과 같이 사용해주세요.

 

 

이렇게 생성된 kernel.img 파일을 이전 글과 같이 vmware에서 시뮬레이션해봅시다!

 

 


커널 사진 출처

https://www.cl.cam.ac.uk/teaching/1011/OpSystems/os1a-slides.pdf

 


이번 글에서는 커널 프로그램을 작성하고, 부트 로더와 함께 vmware로 시뮬레이션해보았습니다.

다음 글에서는 보호 모드와 디스크립터, GDT, 그리고 세그먼트 셀렉터에 대해 공부하겠습니다.

 

감사합니다.