2013-08-27 7 views
0

6.3.3.1 절에 나와 있습니다. ROM 헤더 확장 (PCI Local Bus Specification v2.3), 오프셋 0x3h는 "INIT 함수의 진입 점이며 POST는이 위치에 FAR CALL을 수행합니다.",이 필드의 길이는 3 바이트입니다.PCI 확장 ROM 헤더 INIT 기능의 진입 점

길이가 40448 바이트이고 항목 포인트 바이트는 0xe9_cf_06 (주소 0x3h의 0xe9, 주소 0x4h의 0xcf 및 주소 0x5h의 0x06) 인 PCI 롬 이미지가 있습니다. 이 오프셋은 ROM 이미지 길이를 초과합니다. 누구든지이 필드의 의미를 설명하고 ROM에서 이미지의 진입 점을 파악하는 데이 필드를 사용하는 방법을 알려주십시오.

모든 의견을 환영합니다. 감사!

답변

1

03h이 엔트리 포인트가 아닌 주소 엔트리 포인트의입니다 오프셋. 즉, BIOS가 실제로 오프셋 03h으로 점프하고 코드 실행을 시작한다는 의미입니다. 즉, (당신이해야 할 말은하지 않습니다) 정수로 여러 바이트를 해석, 그리고 -

aa 55 xx e9 cf 06 ... 

당신은 0x_e9_cf_06으로 그 바이트를 표기하기 안 :

주, 당신의 ROM 뭔가처럼 보인다 이것이 인텔 인 것처럼 잘못된 순서입니다 (인텔은 little endian입니다).

이 ROM을 디 컴파일러에 넣으면 더 많은 것을 이해할 수 있습니다. 당신이 발견으로

E9 CF 06는 (점프 0x6CF가 다음 명령에서 바이트)을 의미합니다 이는 JMP 0x06CF이다. 항상 Intel Instruction Set Reference (Vol. 2) 번에 문의하십시오.

+0

안녕하세요 @ 조나단, 답장을 보내 주셔서 감사합니다. 확장 ROM에서 x86 실행 코드 이미지를 추출하는 데 사용할 수있는 Linux 도구를 알고 계십니까? –

+0

"추출"할 필요가 없습니다. 'ndisasm'은 16, 32 또는 64 비트 x86 바이너리를 분해 할 수 있습니다. –

+0

안녕하세요 @ 조나단, 우리는 리눅스 에서이 명령을 사용하여 'objdump -m i8086 -b 바이너리 --adjust-vma = 0x000c0000 -D rom_file> diassembled.asm' 파일을 디스 어셈블 할 수 있습니다. –

0

마침내 나는이 분야의 의미를 알아 냈습니다. 실제로는 x86 명령이 ROM 헤더에 내장되어 있습니다. 첫 번째 바이트 "0xe9"는 점프 명령입니다. 자세한 내용에 대한 FCode로서 제품군의 소스 코드를 확인하실 수 있습니다에 관심이 누구나

 switch (data->reserved[1]) { 
     case 0xeb: /* short jump */ 
       entry = data->reserved[2] + 2; 
       /* a short jump instruction is 2 bytes, 
       * we have to add those to the offset 
       */ 
       break; 
     case 0xe9: /* jump */ 
       entry = ((data->reserved[3]<<8)|data->reserved[2]) + 3; 
       /* jump is 3 bytes, so add them */ 
       break; 
     default: 
       entry=0; 
       break; 
     } 

     if (entry) { 
       /* 0x55aa rom signature plus 1 byte len */ 
       entry += 3; 
       printf(" Entry point for INIT function:" 
         " 0x%x\n\n",entry); 
     } else 
       printf(" Unable to determine entry point for INIT" 
         " function. Please report.\n\n"); 

     break;