2014-11-26 13 views
2

내 CPU가 리틀 엔디안이며 문서에서 FAT 사양의 바이트 순서를 준수한다고 말합니다. 그렇다면 왜 BS_jmpBoot에 대해 유효한 주소를 얻고 있습니까? 첫 번째 섹터의 바이트 0-3은 유효하지만 첫 번째 섹터의 바이트 11-12는 BPB_BytesPerSec에 유효한 번호가 아닙니다.FAT BPB 및 리틀 엔디안 반전

116   int fd = open (diskpath, O_RDONLY, S_IROTH); 
117 
118   read (fd, BS_jmpBoot, 3); 
119   printf("BS_jmpBoot = 0x%02x%02x%02x\n", BS_jmpBoot[0], S_jmpBoot[1], S_jmpBoot[2]); 
120 
121   read (fd, OEMName, 8); 
122   OEMName[8] = '\0'; 
123   printf("OEMName = %s\n", OEMName); 
124 
125   read (fd, BPB_BytesPerSec, 2); 
126   printf("BPB_BytesPerSec = 0x%02x%02x\n",BPB_BytesPerSec[0], BPB_BytesPerSec[1]); 

BS_jmpBoot = 0xeb5890     //valid address, while 0x9058eb would not be 
OEMName = MSDOS5.0 
BPB_BytesPerSec = 0x0002    //Should be 0x0200 

BS_jmpBoot 및 OEMName 인쇄 유효하지만 BPB_BytesPerSec하지 않는 이유는 그림을 싶습니다 산출한다. 누구든지 나를 계몽 할 수 있다면 크게 감사 할 것입니다.

감사

편집 : 그것은 모든 비스듬히 이동하고 있었다 나의 종류의 도움말 모두에게 감사했다. uesp가 (좀) 제안 내가, 서명되지 않은 짧은 바이트를 작성하여 일을 가지고,하지만 난 여전히이 작동하지 않은 이유를 알고 싶습니다

  unsigned char BPB_BytesPerSec[2]; 
... 
125   read (fd, BPB_BytesPerSec, 2); 
126   printf("BPB_BytesPerSec = 0x%04x\n", *BPB_BytesPerSec); 

는 BPB_BytesPerSec = 0000

를 산출

나는 모든 기계에서 쓰고있는 공간을 알고 싶어하기 때문에 공간을 할당하기 위해 char 배열을 사용하고 싶다. 또는하지 않아야합니까?

다시 한번 감사드립니다! 모든

+0

'read (fd, BS_jmpBoot, 3);'read (fd, BS_jmpBoot, 4);'BTW, ** 무엇이'BS_jmpBoot'입니까? – wildplasser

+0

@wildplasser - 예전의 플로피 디스크에서는 부트 섹터에 16 비트 8086 기계 코드의 DOS 용 실행 코드가 포함될 수 있습니다. 그 말 그대로 RAM에 부팅 섹터의 시작으로 점프로 실행되었습니다. 그러나 부트 섹터의 시작 부분에 디스크 포맷을 설명하는 예약 된 필드가 있습니다 - DOS 버전에 따라 512 바이트 중 약 64 바이트까지 - 그래서 처음 3 바이트는 실제 실행 코드에 대한 점프 명령을 위해 예약되었습니다. – Steve314

+0

나는 BS_jmpBoot에 대한 정의가 없다는 것을 언급하고 있었다. 그러나 (IMHO 올바른 방법은 한 번의 스윕에서 전체 512 바이트 섹터를 읽은 다음 정확한 조각을 선택하는 것이다. – wildplasser

답변

3

당신은 BPB_BytesPerSec을 잘못 읽고 있습니다. BPB 정보의 구조는 (here에서)입니다 : 자신의 엔디안 (내 생각) 무관하므로

BYTE BS_jmpBoot[3]; 
BYTE BS_OEMName[8]; 
WORD BPB_BytesPerSec; 
... 

처음 두 필드는 바이트입니다. BPB_BytesPerSec (2 바이트 가정) 단어입니다 그래서 당신이 좋아하는 읽기/정의해야합니다 :

WORD BPB_BytesPerSec;   //Assuming WORD is defined on your system 
read (fd, &BPB_BytesPerSec, 2); 
printf("BPB_BytesPerSec = 0x%04x\n", BPB_BytesPerSec); 

을하기 때문에 직접 바이트를 읽는 당신은 리틀 엔디안에서 0x020000 02을 얻을 때, 당신은 정확하게 같은 BPB_BytesPerSec을 읽어야 .

2

첫째,이 라인은 :

printf("BPB_BytesPerSec = 0x%02x%02x\n",BPB_BytesPerSec[0], BPB_BytesPerSec[1]); 

큰 엔디안 형식으로 값을 인쇄한다. 여기에 0x0002이 인쇄되면 실제 값은 리틀 엔디안에서 0x0200이됩니다.

this site에 따른 값으로서 BS_jmpBoot

:

제 3 바이트 EB 3C 90은 JMP SHORT 3C NOP로 분해. (3C 값은 다를 수 있습니다.)이 이유는 디스크 형식 정보 (BPB 및 EBPB)를 뛰어 넘기 때문입니다. 디스크의 첫 번째 섹터가 0x0000 : 0x7c00 위치의 RAM에로드되어이 점프없이 실행되면 프로세서는 코드가 아닌 데이터를 실행하려고 시도합니다.

즉, 처음 3 바이트는 하나의 작은 엔디안 값이 아니라 3 개의 별도 바이트 인 opcode입니다.

+0

BS_jmpBoot의 바이트가 정확합니다 - DOS의 경우 " E9 XX XX "(16 비트 점프의 경우) 또는"EB XX 90 "(짧은 점프의 경우), NOP 다음에 부트 코드로 점프합니다. 비록 uesp가 말하기를, bit x86 머신 코드) - endianness doe 적용되지 않습니다. 출력 앞에 '0x'를 붙이더라도 바이트 시퀀스가 ​​바이트 시퀀스가 ​​아닌 것을 의미하지는 않습니다. 섹터 당 바이트 수의 문제는 구성 요소 바이트를 단일 값으로 다시 변환하지 않는다는 것입니다. 즉 엔디안을 걱정할 때입니다. – Steve314

+0

나는 문제가 무엇인지 완벽하게 이해한다. 나는 그것을 단지 가장 간단한 방법으로 설명하려하고있다. 나는 아마 아주 좋은 일을 설명하지 않았다. – JS1

+0

나는 모순을 시도하지 않고 가능한 조정할 것을 제안합니다. – Steve314