만들면서 배우는 OS 커널의 구조와 원리 라는 책에서..

aimable의 이미지

챕터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 부분에서 오류가 있는것 같은데 그 이유를 모르겠습니다.
잘 배우려 하지 않는 것이라 주변에 물어볼 곳이 마땅하지 않네요.. 부탁드립니다!!

Fe.head의 이미지

혹시 bx 대신에 ax 써보셨나요?

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

hang의 이미지

데이터셀렉터와 비디오 셀렉터의 세번째는 db입니다.

aimable의 이미지

앗 고맙습니다!!
이것때문에 주말 내내 고민했거든요..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.