'제로 OS 자작입문'의 복수 파트3🍊

2727 단어 자제osidea
https://zenn.dev/omiso/articles/9b33c7b6b997ee
계속하다

제3장 화면에 나타난 연습과 마운트 부팅


QEMU 모니터 디버깅 방법


run_qemu.sh 실행 중, 확인 가능

레지스터의 현재 값 확인


CPU 레지스터의 현재 값 확인
(qemu) info registers

메모리 덤프


서식
(qemu) x /fmt addr

RIP 레지스터의 메모리 덤프 보기 (예)


(qemu) x /4xb 0x03e665416
000000003e665416: 0xeb 0xfe 0x55 0x41
(qemu) x /4xb 0x003e665416
000000003e665416: 0xeb 0xfe 0x55 0x41
역방향 어셈블리로 표시
(qemu) x /2i 0x003e665416
0x000000003e665416:  jmp    0x3e665416
0x000000003e665418:  push   %rbp
jmp 명령은 jmp에서 0x3e 665416까지의 명령이지만 이 상태에서 jmp가 같은 명령에 이르기 때문에while(1)을 진행하는 곳이다

커널을 만들자


커널 소스 코드
// extern C は c言語定義することを意味している
extern "C" void KernelMain() {
	while(1) __asm__("hlt");
}
// __asm__はインラインアセンブラ
// hlt は CPU を停止させる命令
내부 핵의 구축
clang++ -O2 -Wall -g --target=x86_64-elf -ffreestanding -mno-red-zone -fno-exceptions -fno-rtti -std=c++17 -c main.cpp
ld.lld --entry KernelMain -z norelro --image-base 0x100000 --static -o kernel.elf main.o
-ffreestanding··무료 대기 환경[1]에 대한 컴파일
-mno-red-zone··레드존 기능 무효

제작된 내핵을 돌릴 수 있게 하다


https://github.com/uchan-nos/mikanos/releases/tag/osbook_day03a
화남에 제작된 내부 파일을 읽을 수 있는 원본 코드가 있습니다. 참고하십시오.
※ 쓰기가 까다롭습니다.

만든 것 중에서 디버깅을 해 보세요.


CPU 레지스터 내용 봐봐.


(qemu) info registers
RAX=0000000000000032 RBX=0000000000000064 RCX=000000003fea8828 RDX=00000000eadeadc4
RSI=0000000000000041 RDI=0000000000004000 RBP=000000003fea8850 RSP=000000003fea8810
R8 =000000003fea8828 R9 =000000003fb7b48f R10=000000003fbcd018 R11=fffffffffffffffc
R12=000000003effee20 R13=000000003feac8d0 R14=000000003fea8818 R15=00000000000000c8
★RIP=0000000000101311 RFL=00000006 [-----P-] CPL=0 II=0 A20=1 SMM=0 HLT=1

(qemu) x /2i 0x101311
0x0000000000101311:  jmp    0x101310
0x0000000000101313:  int3   
(qemu) x /2i 0x101310
0x0000000000101310:  hlt    
0x0000000000101311:  jmp    0x101310
RIP는 CPU가 다음 명령을 실행하는 것을 의미합니다.
각주
무료 대기란 OS가 없는 환경↩︎

좋은 웹페이지 즐겨찾기