'제로 OS 자작입문'의 복수 파트3🍊
계속하다
제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··레드존 기능 무효
제작된 내핵을 돌릴 수 있게 하다
화남에 제작된 내부 파일을 읽을 수 있는 원본 코드가 있습니다. 참고하십시오.
※ 쓰기가 까다롭습니다.
만든 것 중에서 디버깅을 해 보세요.
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가 없는 환경↩︎
Reference
이 문제에 관하여('제로 OS 자작입문'의 복수 파트3🍊), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/omiso/articles/8adee2a3a902de텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)