구)홈페이지 오탈자 보기
만들면서 배우는 OS 커널의 구조와 원리

 

페이지오탈자 내용등록일
27

((p 27) 마지막 줄. 실행 예)

nasm [생략]
ndisasm [생략]
==>
nasmw [생략]
ndisasmw [생략]

* p 27, 28, 29

2006-10-251
27

((p. 27) 아래에서 첫번째)

ndisasm -b16 boot.bin
==>
ndisasmw -b16 boot.bin

2006-10-251
28

((p. 28) 네번째 줄)

ndisasm -b16 boot.bin > disasm.txt
==>
ndisasmw -b16 boot.bin > disasm.txt

2006-10-251
29

((p. 29) 아래에서 두 번째)

C:CHAP1>ndisam -b16 boot.bin > disasm.txt
==>
C:CHAP1>ndisasmw -b16 boot.bin > disasm.txt

2006-10-251
29

((p. 29) 아래에서 네번째)

C:CHAP1>ndisasm -b16 boot.bin > disasm.txt
==>
C:CHAP1>ndisasmw -b16 boot.bin > disasm.txt

2006-10-251
37

((p37 그림 1-5))

7654      3210
글자색   배경색
==>
0000      0110
글자색   배경색

2006-10-251
38

((p 38) 다섯번째 문단)

그리고 0x06을 넣어 "A"자를 갈색 바탕에 검은 글씨로 나타냅니다.
==>
그리고 0x06을 넣어 "A"자를 검은 바탕에 갈색 글씨로 나타냅니다.

2006-10-251
39

(p.39 위에서 7번째줄, 9,10번째줄)

**현재 등록되어 있는 내용이 틀렸습니다

본문내용
times 510-($-$$) db 0 명령은 이 번지에서부터 510번지까지 0으로 채우
라는 뜻입니다.

그 아랫줄에 dw 0xAA55라는 구문이 있는데, 위에서 510번지까지 0으로
채웠으므로 511번지에는 0xAA가, 512번지에는 0x55가 들어가게 됩니다. 

수정
times 510-($-$$) db 0 명령은 이 번지에서부터 509번지까지 0으로 채우
라는 뜻입니다.

그 아랫줄에 dw 0xAA55라는 구문이 있는데, 위에서 509번지까지 0으로
채웠으므로 510번지에는 0x55가, 511번지에는 0xAA가 들어가게 됩니다. 

수정근거:
00000000  EA0500C007        jmp 0x7c0:0x5
00000005  8CC8              mov ax,cs
~~~~
000001FA  0000              add [bx+si],al
000001FC  0000              add [bx+si],al
000001FE  55                push bp
000001FF  AA                stosb

디스어셈블한 파일을 보면 위와 같다.  
000001FE는 10진수로 변환하면 510
000001FF는 10진수로 변환하면 511    이라는 것을 확인할수 있다

그리고 MBR영역은 512바이트인데
주소로 보면  00000000~000001FF 까지 임을 알수있다
==>
**현재 등록되어 있는 내용이 틀렸습니다

본문내용
times 510-($-$$) db 0 명령은 이 번지에서부터 510번지까지 0으로 채우
라는 뜻입니다.

그 아랫줄에 dw 0xAA55라는 구문이 있는데, 위에서 510번지까지 0으로
채웠으므로 511번지에는 0xAA가, 512번지에는 0x55가 들어가게 됩니다. 

수정
times 510-($-$$) db 0 명령은 이 번지에서부터 509번지까지 0으로 채우
라는 뜻입니다.

그 아랫줄에 dw 0xAA55라는 구문이 있는데, 위에서 509번지까지 0으로
채웠으므로 510번지에는 0x55가, 511번지에는 0xAA가 들어가게 됩니다. 

수정근거:
00000000  EA0500C007        jmp 0x7c0:0x5
00000005  8CC8              mov ax,cs
~~~~
000001FA  0000              add [bx+si],al
000001FC  0000              add [bx+si],al
000001FE  55                push bp
000001FF  AA                stosb

디스어셈블한 파일을 보면 위와 같다.  
000001FE는 10진수로 변환하면 510
000001FF는 10진수로 변환하면 511    이라는 것을 확인할수 있다

그리고 MBR영역은 512바이트인데
주소로 보면  00000000~000001FF 까지 임을 알수있다

2006-10-251
43

((p. 43) 18줄)

dw 0aa55h
==>
dw 0xaa55h

2006-10-251
54

((p.54) 아래에서 여섯 번째)

[org0]
==>
[org 0]

2006-10-251
68

(68page 아래서 2번째줄)

db 0xCF ; G:1, D:1 , limit 16~19 bit: 0xF


위 내용은 57페이지의 실제 소스 내용과 다릅니다.

db 0x40 ; G:0, D:1 , limit 16~19 bit: 0x0

이 되어야 합니다.
==>
확인중

2006-10-251
70

(70p 중간에 ..)

Limit의 20비트를 모두 채워서 0xFFFFF를 기재해....
G 비트가 0이면  세그먼트의 크기는 1바이트가 될 것입니다.

1메가바이트이어야 할것같습니다.
==>
확인중

2006-10-251
370

(두 번째 항목)

0x1234*0xFFFF=0x1234FFF
=> 
0x1234*0xFFF=0x1234FFF 

2009-09-122
373

(소스 코드)

db 0x00      ; base 24~32bit 
=> 
db 0x00      ; base 24~31bit 

2009-09-122
76

((p 76) 두번째 문단 둘째줄)

그래서 이 세그먼트는 물리 주소 0xB8000 ~ 0xFFFF 값 사이의 메모리 영역을 지칭한다는 사실을 알 수 있습니다.

.................................

그래서 이 세그먼트는 물리 주소 0xB8000 ~ 0xC7FFF (0xB8000 + 0xFFFF) 값 사이의 메모리 영역을 지칭한다는 사실을 알 수 있습니다.

물리주소이므로 0xFFFF를 더해야 합니다.
==>
확인중

2006-10-251
77

((p77) 첫번째줄)

원문) CPU에는 GDTR이라는 레지스터가 있습니다. 이 레지스터는 48바이트의

수정) 48바이트의 -> 48비트의
==>
확인중

2006-10-251
289

(p 89 첫 두줄)

<p.88 끝부분 코드>
jmp $+2
nop
nop

<p.89 앞 부분 설명>
"이 점프 명령어는 두개의 명령(2개의 nop)을 점프하여 그 다음 명령으로 가는데..."

이렇게 되어있지만, jmp $+2에서 $는 이 기계어가 있는 메모리 오프셋을 가리키므로, 
$+2는 두번째 nop를 가리키게 됩니다.
따라서, jmp $+2가 실행되면, 첫번째 nop를 건너뛰어 두번째 nop를 실행합니다.

아직 실행해보진 않았지만, 실제 실행에는 문제가 없을것 같습니다.

<확인중>

저자분이 별도 수정은 필요 없을 것 같다고 합니다.
감사합니다.

2007-02-011
95

((p 95) 세번째 문단)

80*2*20+2*10은 10번째 열의 10번째 칸에서...

...

한 열의 칸 수 * 2 * 써야할 열 번호 + 2 * 써야할 칸 번호
==>
80*2*20+2*10은 11번째 열의 11번째 칸에서...

...

한 열의 칸 수 * 2 * 써야할 열 번호 - 1 + 2 * 써야할 칸 번호 - 1

2006-10-251
97

((p 97) 12번~17번줄 코드)

mov bx, SysDataSelector
mov ds, bx
mov es, bx
mov fs, bx
mov gs, bx
mov ss, bx

p 97의 12번째~17번째 코드는 필요 없는 것 같습니다.
==>
확인 중

2006-10-251
104

(p104 14번째 줄부터 19번째 줄까지 (빈줄은 세지 않았음))

mov bx, SysDataSelector
mov ds, bx
mov es, bx
mov fs, bx
mov gs, bx
mov ss, bx

이 코드가 불필요 한 것 같습니다.

p105 의 kernel.asm 에서 중복되기도 하거니와

이 시점에서 아직 32bit 로 jmp 되지 않았기 때문에 

의미도 없어보입니다...
==>
확인중

2006-10-251
107

(p107 idtr: 부분)

idtr:
dw 256 * 8 - 1

부분에서 idt 의 크기를 나타내는데 왜 -1 을 해야하는지 모르겠습니다.

idt 의 마지막 주소라면 모르지만 크기라면

256 * 8 이 맞지 않나요?

이 경우의 코드라면 boot.asm 의 gdt 설정부분과 일관성을 유지하여

idtr:
         dw 256 * (idt_end - idt - 1)
         dd 0
idt:
         dw isr_ignore
         dw SysCodeSelector
         dw 0x8e00
         dw 0x0001

idt_end:

가 더 적절하지 않을까요?
==>
확인 중

2006-10-251
114

((p 114) 두번째줄)

원문) IDT도 등록을 위해 48바이트의 변수가 필요한데,

수정) 48바이트의 -> 48비트의 

로 되어야 하지 않나요?
==>
확인중

2006-10-251
144

(4장 6의 예외 부분)

devide
==>
divide

2006-10-251
169

((p 169) 위에서 세번째 줄)

해당 줄에서 
"... 이 영역을 TSS(Task Statement Segment)라고 합니다.."

이렇게 적어놓으셨는데, TSS의 풀이말이 좀 틀린 것 같습니다.
Statement가 아니라 State아닌가요?

인텔 메뉴얼을 찾아보니 State라고 되어 있더군요. 의미상으로도
Statement가 아니라 State가 되어야 할 것 같습니다.
==>
확인중

2006-10-251
170

(170p 아래에서 5째줄)

GDTR,IDTR,CR0~CR0 

GDTR,IDTR,CR0~CR2 
로..
==>
확인중

2006-10-251
197

(p 197 세번째 단락에서)

1. "만약 오프셋에 0xFFFC를 지정하고, 이곳에 더블워드의 ..... 안 됩니다."

2. "그리고 오프셋에 0xFFFD를 지정하고, 워드 값으로..."
==>
1. "만약 오프셋에 0xFFFD를 지정하고, 이곳에 더블워드의 ..... 안 됩니다."

* 이유 : 0xFFFC까지되고, 0xFFFD부터 안됩니다.

2. "그리고 오프셋에 0xFFFF를 지정하고, 워드 값으로..."

* 이유 : 0xFFFD, 0xFFFE까지되고 0xFFFF부터 안됩니다.

2006-10-251
206

(206쪽, 244쪽, 243쪽)

206쪽 그림 6-6의 오른쪽 그림에서

EIP


243쪽 마지막 단락에서

첫번째, 세번째줄의 "그림 7-3" => "그림 7-5"

다섯번째줄의 "그림 6-6" => "그림 6-7"







244쪽 그림 7-5에서

EIP, CS의 위치가 서로 바뀌었고, ESP화살표는 EDI를 가리켜야함
==>
206쪽 그림 6-6의 오른쪽 그림에서

ESP

첫번째, 세번째줄의 "그림 7-5"

다섯번째줄의  "그림 6-7"

2006-10-251
215

(소스코드 가운데 부분)

lea esp, [PM_Start - 256]

push dword UserDataSelector
push esp
push dword 0x200
...
==>
lea eax, [PM_Start - 256]

push dword UserDataSelector
push eax
push dword 0x200
...

* 이유
p224의 맨 아래단락에서 스택영역을 PM_Start - 256 이라고 하는데, 엄밀하게 스택영역은 PM_Start - 256 - 4임. 

(위의 코드에서 esp값을 lea로 가져온후, 첫번째 push에서 값이 변경되기 때문에)

PM_Start - 256이라고 하려면, 위의 코드에서 lea esp, [PM_start - 256]과 push esp를 lea eax, [PM....], push eax로 변경해야함

2006-10-251
7225

(225)

지적해주신 부분이 맞습니다.
반영하였습니다.

2008-04-303
236

(p236 , p237 총 5곳)

User1regs:
dd 0, 0, 0, 0, 0, 0, 0, 0 : EDI, ESI, EBP, EBX, EDX, ECX, EBX, EAX

를...

User1regs:
dd 0, 0, 0, 0, 0, 0, 0, 0 : EDI, ESI, EBP, ESP, EBX, EDX, ECX, EAX

로 고쳐야 합니다.

User2regs:
User3regs:
User4regs:
User5regs:
도 마찬가지 입니다...
==>
확인중

2006-10-251
244

(244p 그림 7-5.)

ret_from_int 함수 호출시!! 라고 했으므로..
ESP 가 가리키는 곳은 EDI 아래가 아닌 EDI 이어야 합니다.
만일 architecture 의스택구조가 감소후 저장이 아닌 저장후 감소하는 형이라면
[esp+52] 가 아닌 [esp+56] 이 되어야 합니다.
==>
확인중

2006-10-251
7246

(246 페이지 상단)

dd 0,0,0,0,0,0,0,0 ; EDI,ESI,EBP,EBX,EDX,ECX,EBX,EAX
=>
dd 0,0,0,0,0,0,0,0 ; EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI  

2008-04-301
254

(p 254 그림 7-7)

화살표 방향이 반대라고 생각됨
==>
확인중

2006-10-251
346

(p 346 4번째 문단)

0x1234
==>
0x3412

2006-10-251
363

(p 363 페이지 디렉토리 설정하는곳)

mov edi, PAGE_DIR
    mov eax, 0x103000    ; 상수로 바꿀수 있음.
    or  eax, 0x01
    mov [es:edi], eax

    mov edi, PAGE_DIR+0x200*4
    mov eax, 0x102000    ; 상수로 바꿀수 있음. user 영역 페이지 테이블 설정
    or  eax, 0x07
    mov [es:edi], eax

    mov edi, PAGE_DIR+0x300*4
    mov eax, px101000    ; 상수로 바꿀수 있음.
    or  eax, 0x01
    mov [es:edi], eax



에러는 아니고 상수가 정의 되어 있는데 굳이 숫자로 쓸 필요가 없다고 생각 되어서 아래처럼 고쳤으면 합니다.

    mov edi, PAGE_DIR
    mov eax, PAGE_TAB_LOW       ; 1M 이하 영역 페이지 테이블 설정
    or  eax, 0x01
    mov [es:edi], eax

    mov edi, PAGE_DIR+0x200*4
    mov eax, PAGE_TAB_USER      ; user 영역 페이지 테이블 설정
    or  eax, 0x07
    mov [es:edi], eax

    mov edi, PAGE_DIR+0x300*4
    mov eax, PAGE_TAB_KERNEL    ; kernel 영역 페이지 테이블 설정
    or  eax, 0x01
    mov [es:edi], eax
==>
확인중

2006-10-251
367

((p 367) init.h소스 맨 아래.)

#define NUM_MAX_TASK를 숫자로 정의하지 않았습니다.
그래서 process.c파일을 컴파일할 때, 전혀 이상한 컴파일 문법에러가 났습니다.

#define NUM_MAX_TASK를
==>
#define NUM_MAX_TASK 4로 고쳐야 합니다.

2006-10-251
402

(ReadSector 함수 마지막 행)

return 1;
}
==>
}

2006-10-251
403

(FloppySeek 함수 변수 선언부)

int i, j;
char result[7]
==>
int i;
char result[7]

2006-10-251