본문 바로가기

분류 전체보기19

[32bit] 코드 간소화하기 목차 인클루드( include ) 파일 작성하기 리틀 엔디안과 빅 엔디안 디스크립터 작성법 바꾸기 vmware 시뮬레이션 인클루드( include ) 파일 작성하기 인클루드 파일을 작성하여 소스를 간단히 해봅시다. 먼저, init.inc 파일을 만들고 각 파일의 상수 선언 부분을 인클루드 파일로 옮기겠습니다. 다음으로 각 파일의 맨 위에 아래 사진과 같이 코드를 추가해주세요. 인클루드 파일은 컴파일 시, 어셈블러에 의해 복사되어 소스의 해당 위치 부분에 추가됩니다. 리틀 엔디안과 빅 엔디안 뜬금없는 주제인 것 같지만, 디스크립터를 간결하게 작성하기 위해서 꼭 알아야 할 개념입니다. 메모리에 특정 값을 저장하는 지시어인 db, dw, dd 등을 별생각 없이 사용해왔습니다만, 값을 메모리에 저장하는 서로 다.. 2021. 7. 27.
[32bit] 보호 모드로 진입하기 목차 보호 모드로 진입하기 boot.asm 코드 설명 보호 모드에서 동작하는 커널 보호 모드로 진입하기 에러 없이 보호 모드로 진입하기 위해선, 다음과 같은 작업이 필요합니다. 제어를 통해 막을 수 있는 인터럽트는 모두 막는다. GDTR에 GDT 정보를 로드한다. CR0의 최하위 비트인 PE flag를 1로 만들어 CPU를 보호 모드로 바꾼다. CR0를 바꾼 후, far jump를 반드시 실행한다. 세그먼트 레지스터가 리얼 모드에서 썼던 값을 가지고 있기 때문에, far jump로 바뀐 CS를 제외한 나머지 세그먼트 레지스터의 값을 보호 모드에 맞게 바꾼다. 1 ~ 4번 과정을 부트로더에서, 5번 과정을 커널에서 처리하도록 하겠습니다. boot.asm 파일을 다음과 같이 수정해주세요. ( line 1~ .. 2021. 7. 27.
[32bit] 디스크립터( descriptor )와 GDT ( Global Descriptor Table ) 목차 리얼 모드( Real Mode )와 보호 모드( Protected Mode ) 디스크립터( descriptor ) GDT( Global Descriptor Table )와 세그먼트 셀렉터( segment selector ) 디스크립터로 메모리 물리 주소 찾기 리얼 모드( Real Mode )와 보호 모드( Protected Mode ) CPU가 처음 시작할 때 동작하는 방식을 리얼 모드(16bit 동작)라고 합니다. 여태까지 우리는 리얼 모드로 동작하는 CPU를 사용했습니다. 보호 모드(32 bit 동작)는 리얼 모드의 단점들을 보완하는 방식으로 동작합니다. 먼저 리얼 모드의 단점에 대해 알아보겠습니다. 오프셋의 크기가 65536( 2의 16 제곱 )이 최대이므로, 한 세그먼트가 관리할 수 있는 영.. 2021. 7. 27.
[32bit] 커널 프로그램 만들기 목차 커널이 뭔가요? 커널 프로그램 코드 설명 vmware 시뮬레이션 커널이 뭔가요? 사전적 정의를 먼저 살펴보겠습니다. 씨앗의 안쪽 부분. 생각이나 주제에 대한 중심의, 중요한 부분. - oxford 영어사전 컴퓨터에서의 커널이란, 다음 그림과 같습니다. 사진에 나와 있는 내용을 전부 다루지는 않습니다. 책에서 주로 다루는 내용은 프로세스 관리( Process Management )와 메모리 관리( Memory Management )입니다. 두 부분을 좀 더 중점적으로 공부할 수 있을 것으로 예상합니다. 커널 프로그램 아직 커널이라고 하기에는 많이 부족한 프로그램이지만, 커널을 만들어봅시다. kernel.asm 파일로 작성해주세요. 코드 설명 ( line 7 ) xor ax, ax : xor 연산은 자.. 2021. 7. 27.
[32bit] 부트로더 작성하기 목차 전체 코드 BIOS 인터럽트 코드 설명 실제 동작 전체 코드 이전 코드에서 삭제된 부분은 line 20 ~ 41입니다. 추가된 부분은 아래 사진에서 // 로 표시된 line 22 ~ 37 부분입니다. 추가된 코드의 모든 부분이 int 13h 명령어( line 33 )에 대해 준비하고, 그 결과에 대한 처리를 하는 과정입니다. BIOS 인터럽트 int 13h 명령어는 BIOS에서 제공하는 인터럽트 중 하나입니다. 인터럽트란, 특정 외부 입력이 들어오면 진행 중이던 절차( main program )를 잠시 멈추고, 외부 입력에 대응하는 절차( ISR : Interrupt Service Routine )를 수행한 후, 멈춘 부분( main program )으로 다시 돌아와서 진행하는 것입니다. 먼 옛날에.. 2021. 7. 27.
[32bit] 부트섹터에서 프로그램 꺼내기(2) 목차 곧 부트로더가 될 프로그램 코드 설명 vmware를 이용한 시뮬레이션 기계어를 어셈블리어로 : 디스어셈블 곧 부트로더가 될 프로그램 일단 해봅시다! boot1.asm 파일을 다음과 같이 작성해주세요. 코드 설명 Q1. mov ds, cs는 불가능 한가? : CPU 내부 구조적인 문제로, 세그먼트 레지스터의 값을 바꾸려면, 범용 레지스터를 거쳐야 합니다. - 인텔 매뉴얼 vol.1 6-16page 6.3.1.1 절 참고. Q2. 비디오 메모리 세그먼트 16비트 세그먼트:오프셋 방식으로 표현할 수 있는 주소는 0000:0000 ~ FFFF:FFFF입니다. 이 중 모두를 RAM이 사용하는 것이 아니라, 다른 주변장치에도 주소가 할당되어 있습니다. 어느 기기에 어느 주소가 할당되었는지에 대한 분포를 나타낸.. 2021. 7. 27.