BIOS는 첫 번째 섹터를 정확히 어떻게 읽습니까?

BIOS는 첫 번째 섹터를 정확히 어떻게 읽습니까?

ATA 명령 읽기 섹터가 아직 사용 중인지 알아야 합니다. SATA Storage Technology 책에서 이 명령과 일반적으로 PIO 읽기 명령은 부팅 프로세스에서만 사용된다는 것을 읽었습니다. 그래서 부팅 과정을 살펴보기 시작했는데 이에 대해 약간의 혼란이 있었습니다.

BIOS가 부팅 프로세스의 일부로 첫 번째 섹터 또는 MBR을 읽는다는 것을 알고 있습니다. 나는 또한 BIOS가 INT 13을 사용하여 이를 수행한다는 것을 읽었습니다.

SATA 장치는 HBA를 통해 통신합니다. 따라서 첫 번째 섹터를 읽는 것은 SATA와 HBA 간의 ​​초기화 프로세스가 완료된 후에 이루어져야 합니다.

BIOS는 첫 번째 섹터를 어떻게 읽나요?

HBA는 INT 13을 ATA 명령으로 변환합니까?경우 예,
AHCI 드라이버가 필요하지 않습니까?
드라이버는 언제 로드되나요?

또는

BIOS가 하드 드라이브와 직접 통신합니까?나는 이것이 불가능하다고 생각한다.

답변1

장치의 경우; 플로피, SCSI, ATA, ATAPI, USB 대용량 저장 장치, SATA, NVME 등이 있습니다. 대부분 컨트롤러가 있습니다(CPU는 컨트롤러와만 통신할 수 있고 컨트롤러는 컨트롤러에 연결된 장치와 통신합니다). 컨트롤러가 제공하는 인터페이스가 상대적으로 표준화된 경우도 있고(예: AHCI) 그렇지 않은 경우도 있습니다(SCSI, 하드웨어 RAID 컨트롤러). 컨트롤러가 여러 인터페이스를 제공하는 경우도 있습니다(예: SATA 컨트롤러는 AHCI, 레거시(P)ATA 에뮬레이션, 비표준 RAID 인터페이스를 지원할 수 있으며 BIOS 설정에서 선택할 수 있는 옵션이 있음).

모든 경우에; BIOS에는 (최소) 드라이버 코드가 내장되어 있습니다("상대적으로 표준화된" 컨트롤러/장치 및 마더보드에 내장된 컨트롤러의 경우). 또는 컨트롤러에는 "int 0x13"을 후크/가로채는 "장치 ROM"이 내장되어 있습니다(예: 동일한 PCI 카드에 있음).

어쨌든; "int 0x13"은 "장치 번호" 매개변수를 사용하여 장치가 무엇인지 파악하고 해당 장치에 대한 장치 드라이버 코드로 분기합니다.

HBA는 INT 13을 ATA 명령으로 변환합니까?

SATA 컨트롤러가 AHCI를 인터페이스로 사용하는 경우 그런 다음 드라이버는 "int 0x13" 요청을 HBA용 SATA/AHCI 명령으로 변환합니다. SATA 컨트롤러가 레거시 (P)ATA 에뮬레이션을 사용하는 경우 드라이버는 "int 0x13" 요청을 레거시 (P)ATA 명령으로 변환하고 HBA는 ATA 명령을 SATA 명령 세트로 변환합니다.

AHCI 드라이버가 필요하지 않습니까?

예. "시작 명령을 사용하고 CPU 시간을 낭비하면서 병렬성을 방지하고 성능을 저하시키는 최소 드라이버("핫 플러그 ​​SATA", 기본 명령 대기열, 보안 삭제, 꺼내기, 트림 등을 지원하지 않음)입니다. 단순화를 위해 명령이 완료된 다음 상태를 반환합니다." 접근 방식을 사용합니다. 이는 OS가 사용하려는 장치 드라이버와 전혀 다르다는 것을 의미합니다.

드라이버는 언제 로드되나요?

드라이버 코드는 항상 ROM 어딘가에 존재합니다(특정 시점에 디스크에서 로드되지 않음). 드라이버 코드는 펌웨어가 "장치 ROM"을 찾기 전이나 펌웨어가 "장치 ROM"을 초기화할 때 초기화됩니다.

모든 것이 초기화된 후; (BIOS가 일반 디스크에서 부팅한다고 가정 - 예를 들어 네트워크에서 부팅하지 않음) BIOS는 'int 0x13'을 사용하여 "장치 ROM이 초기화된 후 최종적으로 사용된 장치"에서 첫 번째 섹터를 로드할 수 있습니다.

답변2

SATA 분석기로 테스트한 결과 BIOS 또는 UEFI가 다음과 같은 느린 ATA 명령을 사용하지 않을 만큼 똑똑하다는 사실이 밝혀졌습니다.섹터 읽기부팅 과정에서. 대신 ATA 명령을 사용합니다.DMA EXT 읽기.

완전성을 위해 순서는 다음과 같습니다.

드라이브가 서명을 보낸 후 HBA는 ATA 명령을 보냅니다.장치 식별, 그런 다음 전송DMA EXT 읽기LBA = 0입니다.

OS가 사용하는지는 확실하지 않습니다.섹터 읽기또는쓰기 섹터어떤 경우에도 정상적인 작업 중에. FPGA에서 PIO IN/OUT 프로토콜을 구현하는 것은 즐거운 작업이 아니기 때문에 원하지 않습니다.

관련 정보