만들면서 배우는 OS 커널의 구조와 원리 라는 책에서..
글쓴이: aimable / 작성시간: 토, 2012/05/19 - 9:35오후
챕터3의 'Procted Mode로 변환'에서 소스 작성 후
Bochs를 사용해 부팅하니
load_seg_reg(DS, 0x0010): invalid segment
라는 에러가 나오면서 종료되네요..
아래는 커널 코드 전문입니다.
[ORG 0] [BITS 16] start: MOV AX, CS ; AX = CS (= 0x1000) MOV DS, AX XOR AX, AX MOV SS, AX CLI ; FLAG CLEAR LGDT[gdtr] MOV EAX, CR0 OR EAX, 0x00000001 MOV CR0, EAX JMP $+2 NOP NOP DB 0x66 DB 0x67 DB 0xEA DD PM_Start DW SysCodeSelector ;--------------------------------------------------------; ;*************** 여기부터 Protected Mode ****************; ;--------------------------------------------------------; [BITS 32] PM_Start: MOV BX, SysDataSelector MOV DS, BX ;ERROR MOV ES, BX MOV FS, BX MOV GS, BX MOV SS, BX XOR EAX, EAX MOV AX, VideoSelector MOV ES, AX MOV EDI, 80*2*10+2*10 LEA ESI, [DS:msgPMode] CALL printf JMP $ ;--------------------------------------------------------; ;******************** Sub Routines **********************; ;--------------------------------------------------------; printf: PUSH EAX printf_loop: OR AL, AL JZ printf_end MOV AL, BYTE [ESI] MOV BYTE [ES:EDI], AL INC EDI MOV BYTE [ES:EDI], 0x06 INC ESI INC EDI JMP printf_loop printf_end: POP EAX RET msgPMode DB "We are in Protected Mode", 0 ;--------------------------------------------------------; ;********************** GDT Table ***********************; ;--------------------------------------------------------; gdtr: DW gdt_end - gdt - 1 ; GDT의 limit DD gdt + 0x10000 ; GDT의 베이스 어드레스 gdt: DW 0 ; limit 0~15비트 DW 0 ; 베이스 어드레스의 하위 2바이트 DB 0 ; 베이스 어드레스 16~23비트 DB 0 ; 타입 DB 0 ; limit 16~19비트, 플래그 DB 0 ; 베이스 어드레스 31~24비트 ; 코드 세그먼트 디스크립터 SysCodeSelector EQU 0x08 DW 0xFFFF ; limit:0xFFFF DW 0x0000 ; base 0~15 bit DB 0x01 ; base 16~23 bit DB 0x9A ; P:1, DPL:0, Code, non-conforming, readable DB 0xCF ; G:1, D:1, limit 16~19 bit:0xF DB 0x00 ; base 24~32 bit ; 데이터 세그먼트 디스크립터 SysDataSelector EQU 0x10 DW 0xFFFF ; limit 0xFFFFF DW 0x0000 ; base 0~15 bit DW 0x01 ; base 16~23 bit DB 0x92 ; P:1, DPL:0, data, expand-up, writable DB 0xCF ; G:1, D:1, limit 16~19 bit:0xF DB 0x00 ; base 24~32 bit ; 비디오 세그먼트 디스크립터 VideoSelector EQU 0x18 DW 0xFFFF ; limit 0xFFFFF DW 0x8000 ; base 0~15 bit DW 0x0B ; base 16~23 bit DB 0x92 ; P:1, DPL:0, data, expand-up, writable DB 0x40 ; G:1, D:1, limit 16~19 bit:0 DB 0x00 ; base 24~32 bit gdt_end:
;ERROR 부분에서 오류가 있는것 같은데 그 이유를 모르겠습니다.
잘 배우려 하지 않는 것이라 주변에 물어볼 곳이 마땅하지 않네요.. 부탁드립니다!!
Forums:
혹시 bx 대신에 ax 써보셨나요?
혹시 bx 대신에 ax 써보셨나요?
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
단순한 오타네요.
데이터셀렉터와 비디오 셀렉터의 세번째는 db입니다.
앗 고맙습니다!! 이것때문에 주말 내내
앗 고맙습니다!!
이것때문에 주말 내내 고민했거든요..
댓글 달기