조각들실제로는장치 트리가 필요합니다.

조각들실제로는장치 트리가 필요합니다.

임베디드 장치에서 커널을 시작할 때 Linux 커널에 장치 트리를 제공해야 하지만 일반 x86 PC에서 커널을 부팅하는 데는 장치 트리가 필요하지 않습니다. 이유는 무엇입니까?

내가 이해한 바에 따르면 x86 PC에서 커널은 하드웨어를 "탐색"하는데(틀렸다면 정정하십시오) 그렇다면 왜 커널이 임베디드 시스템의 하드웨어를 탐색할 수 없습니까?

답변1

주변 장치는 메인 프로세서에 연결됩니다.버스. 일부 버스 프로토콜은 호스트 프로세서가 "이 버스에 어떤 장치가 연결되어 있습니까?"라고 물을 수 있는 열거(검색이라고도 함)를 지원합니다. 장치는 해당 유형, 제조업체, 모델 및 구성에 대한 일부 정보를 표준화된 형식으로 응답합니다. 이 정보를 통해 운영 체제는 사용 가능한 장치 목록을 보고하고 각 장치에 사용할 장치 드라이버를 결정할 수 있습니다. 일부 버스 프로토콜은 열거를 지원하지 않으므로 호스트 프로세서는 추측 외에는 어떤 장치가 연결되어 있는지 알아낼 방법이 없습니다.

모든 최신 PC 버스는 특히 열거형을 지원합니다.PCI(AGP 및 PCIe와 같은 원본 및 확장 및 후속 제품), 대부분의 내부 주변 장치가 연결됩니다.USB(모든 버전) 대부분의 주변 장치가 연결되며,라이브 라인,소형 컴퓨터 시스템 인터페이스, 모든 최신 버전ATA/SATA기다리다. 최신 모니터 연결은 연결된 모니터 검색도 지원합니다(HDMI,디스플레이 포트,DVI 인터페이스,VGA그리고EDID). 따라서 PC에서 운영 체제는 PCI 버스를 열거하여 연결된 주변 장치를 검색할 수 있으며, PCI 버스에서 USB 컨트롤러를 찾으면 USB 버스 등을 열거합니다. 운영 체제는 PCI 버스의 존재와 이를 감지하는 방법을 가정해야 합니다. 이는 PC 아키텍처의 표준화입니다("PC 아키텍처"는 단순한 x86 프로세서 이상을 의미합니다. (현대) PC가 되려면 컴퓨터가 PCI 버스도 있으므로 어떻게든 시작해야 합니다).

많은 임베디드 시스템은 열거를 지원하지 않는 덜 화려한 버스를 사용합니다. 이는 PCI가 교체된 1990년대 중반까지 PC의 경우였습니다.ISA. 특히 대부분의 ARM 시스템 버스는 열거형을 지원하지 않습니다. PC 아키텍처를 따르지 않는 일부 임베디드 x86 시스템에서도 마찬가지입니다. 열거가 없으면 운영 체제는 어떤 장치가 존재하고 해당 장치에 액세스하는 방법을 알아야 합니다. 이것장치 트리이 정보를 표현하기 위한 표준 형식입니다.

PC 버스가 검색을 지원하는 주된 이유는 PC에 확장 카드를 추가하거나 외부 포트에 케이블을 연결하는 등 장치를 추가하고 제거할 수 있는 모듈식 아키텍처를 허용하도록 설계되었기 때문입니다. 임베디드 시스템에는 일반적으로 고정된 장치 세트1와 제조업체가 미리 로드하고 교체하지 않는 운영 체제가 있으므로 열거할 필요가 없습니다.

1USB와 같은 외부 버스가 있는 경우 USB 주변 장치가 자동으로 검색되며 장치 트리에 언급되지 않습니다 .

답변2

조각들실제로는장치 트리가 필요합니다.

그들은 단지 그것을 다른 것으로 부릅니다.

PC/AT 호환 하위 운영체제라고 말하는 것은 옳지 않습니다.생각하다PCI 버스와 같은 것들이 존재합니다. 그들은하지 않습니다.

그들은 묻지도 않습니다. 1990년대 중반 이후에는 하드웨어를 검색하고 일부 I/O 또는 메모리 주소를 검색하여 작동하는지 확인하는 작업이 더 이상 필요하지 않습니다.

대신에 그들은 다음을 인용했다.루트 버스.

다른 열거 가능 버스와 달리 이 버스는 버스 컨트롤러 장치 하드웨어와 통신하여 열거할 수 없습니다. 이 버스는 시스템 펌웨어 및 운영 체제를 위한 구성으로만 존재합니다. 시스템 펌웨어를 쿼리하여 열거하고 마더보드 제조업체는 마더보드에 있는 내용과 일치하도록 시스템 펌웨어에 현재 내용을 포함시킵니다.

이것과 장치 트리 사이에는 개념적 차이가 거의 없습니다. 디바이스 트리와 마찬가지로 실제 보드와 일치하도록 생성되어야 합니다. 장치 트리와 마찬가지로 목록입니다.장치 노드자원 정보(무엇보다도)가 함께 제공됩니다. 장치 트리와 마찬가지로 이는 운영 체제 외부에 있으며 운영 체제 자체 코드에 내장된 항목 목록을 조사하기 위한 것이 아닙니다.

이것플러그 앤 플레이 BIOS 사양펌웨어가 메모리에 간단한 장치 트리를 운영 체제에 표시하도록 합니다. 여기서 한 노드는 (예를 들어) PNP0A03PCI 버스를 지정하는 노드가 되어 할당된 I/O 및 메모리 리소스를 제공하고 위치를 결정합니다. 발견 .

ACPI가 이를 대체했지만 아이디어는 동일하게 유지되었습니다. ACPI에는 다음과 같은 테이블이 있습니다.차별화된 시스템 설명표, 하나 추가했습니다보조 시스템 설명자 테이블, (다른 ACPI 테이블의 정보 포함) 거의 동일한 내용을 제공합니다.

(펌웨어 개발자의 관점에서 이를 보려면 Coreboot의 예를 살펴보십시오. 여기에는 ACPI 소스 언어 파일이 많이 있으며 그 중 일부는 바이트코드 바이너리 이미지로 컴파일되어 펌웨어에 병합됩니다. 구성 도구 컨트롤에 의해 만들어지면 도구는 대상 특정 마더보드를 선택하라는 메시지를 표시합니다.

FreeBSD를 예로 들면,플러그 앤 플레이 BIOS 사양정보는 커널 pnpbios(현재는 제거됨)의 버스 드라이버에 의해 열거되고, (현재) ACPI 정보 acpi는 버스 드라이버에 의해 열거됩니다. Linux에는 drivers/pnp/pnpbios플러그 앤 플레이 BIOS 테이블을 읽는 버스 드라이버가 (여전히) 있고 , ACPI 테이블은 arch/arm64/kernel/분산된 코드로 읽혀집니다 arch/x86/kernel/.

열거 가능한 루트 버스는 루트 버스의 장치인 버스의 열거 가능한 항목과 겹칠 수 있지만 일반적으로 (ACPI를 통한 일부 침해 포함) 겹치지 않습니다. 예를 들어, PNPxxxxATA 버스에 ID가 있더라도 시스템 펌웨어는 이를 사용하는 루트 버스의 PCI-ATA 브리지 장치를 나열하지 않습니다. 이러한 장치는 루트 버스를 열거할 때 PCI 버스를 찾은 다음 PCI 버스를 열거할 때 PCI-ATA 브리지를 찾아서 찾습니다.

간단한 사실은 개념적 이름이 다른 완전히 다른 플랫폼에서 작동의 기본 원칙이 동일하다는 것입니다. 시스템에는 열거할 수 없는 다른 장치와 일치하는 내장된 장치 목록이 있으며, 펌웨어 또는 사용 중인 부트로더는 운영 체제가 해당 목록을 읽고 장치를 구성할 수 있는 메커니즘을 제공하여 열거할 수 있도록 합니다. 운영체제그것들장비를 번갈아가며 사용하세요.

추가 읽기

관련 정보