| 27 | ((p 27) 마지막 줄. 실행 예) nasm [생략] ndisasm [생략] ==> nasmw [생략] ndisasmw [생략]
* p 27, 28, 29 | 2006-10-25 | 1 |
| 27 | ((p. 27) 아래에서 첫번째) ndisasm -b16 boot.bin ==> ndisasmw -b16 boot.bin | 2006-10-25 | 1 |
| 28 | ((p. 28) 네번째 줄) ndisasm -b16 boot.bin > disasm.txt ==> ndisasmw -b16 boot.bin > disasm.txt | 2006-10-25 | 1 |
| 29 | ((p. 29) 아래에서 두 번째) C:CHAP1>ndisam -b16 boot.bin > disasm.txt ==> C:CHAP1>ndisasmw -b16 boot.bin > disasm.txt | 2006-10-25 | 1 |
| 29 | ((p. 29) 아래에서 네번째) C:CHAP1>ndisasm -b16 boot.bin > disasm.txt ==> C:CHAP1>ndisasmw -b16 boot.bin > disasm.txt | 2006-10-25 | 1 |
| 37 | ((p37 그림 1-5)) 7654 3210 글자색 배경색 ==> 0000 0110 글자색 배경색 | 2006-10-25 | 1 |
| 38 | ((p 38) 다섯번째 문단) 그리고 0x06을 넣어 "A"자를 갈색 바탕에 검은 글씨로 나타냅니다. ==> 그리고 0x06을 넣어 "A"자를 검은 바탕에 갈색 글씨로 나타냅니다. | 2006-10-25 | 1 |
| 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-25 | 1 |
| 43 | ((p. 43) 18줄) dw 0aa55h ==> dw 0xaa55h | 2006-10-25 | 1 |
| 54 | ((p.54) 아래에서 여섯 번째) [org0] ==> [org 0] | 2006-10-25 | 1 |
| 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-25 | 1 |
3 | 70 | (두 번째 항목) 0x1234*0xFFFF=0x1234FFF => 0x1234*0xFFF=0x1234FFF | 2009-09-12 | 2 |
| 70 | (70p 중간에 ..) Limit의 20비트를 모두 채워서 0xFFFFF를 기재해.... G 비트가 0이면 세그먼트의 크기는 1바이트가 될 것입니다.
1메가바이트이어야 할것같습니다. ==> 확인중 | 2006-10-25 | 1 |
3 | 73 | (소스 코드) db 0x00 ; base 24~32bit => db 0x00 ; base 24~31bit
| 2009-09-12 | 2 |
| 76 | ((p 76) 두번째 문단 둘째줄) 그래서 이 세그먼트는 물리 주소 0xB8000 ~ 0xFFFF 값 사이의 메모리 영역을 지칭한다는 사실을 알 수 있습니다.
.................................
그래서 이 세그먼트는 물리 주소 0xB8000 ~ 0xC7FFF (0xB8000 + 0xFFFF) 값 사이의 메모리 영역을 지칭한다는 사실을 알 수 있습니다.
물리주소이므로 0xFFFF를 더해야 합니다. ==> 확인중 | 2006-10-25 | 1 |
| 77 | ((p77) 첫번째줄) 원문) CPU에는 GDTR이라는 레지스터가 있습니다. 이 레지스터는 48바이트의
수정) 48바이트의 -> 48비트의 ==> 확인중 | 2006-10-25 | 1 |
2 | 89 | (p 89 첫 두줄) <p.88 끝부분 코드> jmp $+2 nop nop
<p.89 앞 부분 설명> "이 점프 명령어는 두개의 명령(2개의 nop)을 점프하여 그 다음 명령으로 가는데..."
이렇게 되어있지만, jmp $+2에서 $는 이 기계어가 있는 메모리 오프셋을 가리키므로, $+2는 두번째 nop를 가리키게 됩니다. 따라서, jmp $+2가 실행되면, 첫번째 nop를 건너뛰어 두번째 nop를 실행합니다.
아직 실행해보진 않았지만, 실제 실행에는 문제가 없을것 같습니다.
<확인중>
저자분이 별도 수정은 필요 없을 것 같다고 합니다. 감사합니다. | 2007-02-01 | 1 |
| 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-25 | 1 |
| 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-25 | 1 |
| 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-25 | 1 |
| 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-25 | 1 |
| 114 | ((p 114) 두번째줄) 원문) IDT도 등록을 위해 48바이트의 변수가 필요한데,
수정) 48바이트의 -> 48비트의
로 되어야 하지 않나요? ==> 확인중 | 2006-10-25 | 1 |
| 144 | (4장 6의 예외 부분) devide ==> divide | 2006-10-25 | 1 |
| 169 | ((p 169) 위에서 세번째 줄) 해당 줄에서 "... 이 영역을 TSS(Task Statement Segment)라고 합니다.."
이렇게 적어놓으셨는데, TSS의 풀이말이 좀 틀린 것 같습니다. Statement가 아니라 State아닌가요?
인텔 메뉴얼을 찾아보니 State라고 되어 있더군요. 의미상으로도 Statement가 아니라 State가 되어야 할 것 같습니다. ==> 확인중 | 2006-10-25 | 1 |
| 170 | (170p 아래에서 5째줄) GDTR,IDTR,CR0~CR0 를 GDTR,IDTR,CR0~CR2 로.. ==> 확인중 | 2006-10-25 | 1 |
| 197 | (p 197 세번째 단락에서) 1. "만약 오프셋에 0xFFFC를 지정하고, 이곳에 더블워드의 ..... 안 됩니다."
2. "그리고 오프셋에 0xFFFD를 지정하고, 워드 값으로..." ==> 1. "만약 오프셋에 0xFFFD를 지정하고, 이곳에 더블워드의 ..... 안 됩니다."
* 이유 : 0xFFFC까지되고, 0xFFFD부터 안됩니다.
2. "그리고 오프셋에 0xFFFF를 지정하고, 워드 값으로..."
* 이유 : 0xFFFD, 0xFFFE까지되고 0xFFFF부터 안됩니다. | 2006-10-25 | 1 |
| 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-25 | 1 |
| 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-25 | 1 |
7 | 225 | (225) 지적해주신 부분이 맞습니다. 반영하였습니다. | 2008-04-30 | 3 |
| 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-25 | 1 |
| 244 | (244p 그림 7-5.) ret_from_int 함수 호출시!! 라고 했으므로.. ESP 가 가리키는 곳은 EDI 아래가 아닌 EDI 이어야 합니다. 만일 architecture 의스택구조가 감소후 저장이 아닌 저장후 감소하는 형이라면 [esp+52] 가 아닌 [esp+56] 이 되어야 합니다. ==> 확인중 | 2006-10-25 | 1 |
7 | 246 | (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-30 | 1 |
| 254 | (p 254 그림 7-7) 화살표 방향이 반대라고 생각됨 ==> 확인중 | 2006-10-25 | 1 |
| 346 | (p 346 4번째 문단) 0x1234 ==> 0x3412 | 2006-10-25 | 1 |
| 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-25 | 1 |
| 367 | ((p 367) init.h소스 맨 아래.) #define NUM_MAX_TASK를 숫자로 정의하지 않았습니다. 그래서 process.c파일을 컴파일할 때, 전혀 이상한 컴파일 문법에러가 났습니다.
#define NUM_MAX_TASK를 ==> #define NUM_MAX_TASK 4로 고쳐야 합니다. | 2006-10-25 | 1 |
| 402 | (ReadSector 함수 마지막 행) return 1; } ==> } | 2006-10-25 | 1 |
| 403 | (FloppySeek 함수 변수 선언부) int i, j; char result[7] ==> int i; char result[7] | 2006-10-25 | 1 |
|