간단한 부트 로더 작동 방식을 이해하는 데 어려움이 있습니다. 제가 이야기하고있는 부트 로더는 MITs 코스 "Operating Systems Engineering"에서 나온 것입니다.부트 로더 - 프로세서를 보호 모드로 전환
첫째, 내가 당신에게 BIOS가 실행 어셈블리 코드의 조각을 보여주지 : 그것의 모습에서
[f000:fec3] 0xffec3: lidtw %cs:0x7908
[f000:fec9] 0xffec9: lgdtw %cs:0x7948
[f000:fecf] 0xffecf: mov %cr0,%eax
[f000:fed2] 0xffed2: or $0x1,%eax
[f000:fed6] 0xffed6: mov %eax,%cr0
[f000:fed9] 0xffed9: ljmpl $0x8,$0xffee1
을,이 코드는 인터럽트 테이블과 디스크립터 테이블을 설정하고 보호 모드를 켭니다 .
- 왜 BIOS에서 보호 모드 으로 들어가나요? 리얼 모드에서하지 부트 로더 실행해야 (BTW - 은 왜 실제 모드에서 실행해야합니까?)
- 를 내가 검색하지만 어디 를 찾을 수 없습니다 정확히 어떻게 ljmpl 명령이 작품과 차이점은 it와 ljmp 사이에서 그리고 정규 jmp-I 은 누군가가 을 올바른 방향으로 가리키면 감사하게 생각합니다.
- 왜 우리는 점프를 수행합니까? 이 지침의 목적은 입니까? ... 하지만 우리는 보호 모드로 그 BIOS 스위치를 보았다 - 그것은 프로세서가 리얼 모드에 있음을 말한다
# Switch from real to protected mode, using a bootstrap GDT # and segment translation that makes virtual addresses # identical to their physical addresses, so that the # effective memory map does not change during the switch. lgdt gdtdesc movl %cr0, %eax orl $CR0_PE_ON, %eax movl %eax, %cr0 # Jump to next instruction, but in 32-bit code segment. # Switches processor into 32-bit mode. ljmp $PROT_MODE_CSEG, $protcseg
- -
부트 로더 코드로 이동 혼란 스럽네요.이게 어떻게 가능합니까? ?
- 어떻게 32 비트 모드로 전환합니까? 무엇 lgmp 명령 때문에 3235 모드로 마침내 가서 프로세서가 발생합니까?
내가 이해하지 못하는 또 다른 한가지 - 내가 gdb를 부트 로더의 실행을 추적 할 때 다음과 같은 명령이 (즉, 부트 로더 코드에서 LJMP 명령의) 실행되는 것을 볼 :
ljmp $0x8,$0x7c32
나는 .ASM 파일에서 보았을 때
는하지만 본 다음
ljmp $0xb866,$0x87c32
완전히 여기 손실 - 명령어가 .ASM 파일 작성 및 실행 명령이 다른 와서 어떻게? 나는 이것이 보호 모드와 관련이 있고 그것이 주소를 어떻게 변환하는지에 대한 직감을 가지고 있지만 실제로 얻지는 못한다.
나는 어떤 도움을 주셔서 감사합니다!
너무 광범위하게 투표하려면 투표가 너무 많습니다. –