리눅스 하드웨어 인터페이스

리눅스 하드웨어 인터페이스

저는 GNU/Linux 운영 체제를 실행할 하드웨어 프로젝트를 만들고 있는데 질문이 있습니다. (편집: ARM 기반입니다)

Linux 커널은 CPU에 어떤 유형의 하드웨어가 연결되어 있는지 정확히 어떻게 알 수 있습니까? 즉, 이것이 RAM인지, 드라이브인지 등을 어떻게 알 수 있습니까?

특히 네트워크 인터페이스의 경우 시스템에 여러 개의 이더넷 네트워크 카드와 여러 개의 WiFi 트랜시버가 있는 경우 어느 것이 무엇인지, 하드웨어에서 어떻게 연결되어 있는지 어떻게 알 수 있습니까(아마도 MUX, I2C, SPI로 연결되어 있을 수 있음). ..등).

답변1

이 모든 매우 낮은 수준의 작업은 물론 다음 사항에 따라 달라집니다.건축학.

가장 일반적인 것(x86/IBM PC)의 경우 BIOS는 좋은 부팅에 많은 도움이 됩니다. 이 메시지를 받으면 부팅 로그를 확인하면 BIOS 쿼리가 시작됩니다.

BIOS에서 제공하는 물리적 RAM 매핑:

더 아래로 내려가면 다음과 같은 내용을 볼 수 있습니다.

BIOS-e820: [mem 0x00000000cff80000-0x00000000cff8dfff] ACPI 데이터

이는 운영 체제가 주변 장치에 대한 추가 정보를 얻기 위해 의존할 수 있는 BIOS에서 제공하는 테이블입니다... (이와 관련하여 BIOS에 다소 문제가 있는 것으로 알려져 있습니다)

반면에 ARM SoC가 있는 경우 각 공급업체는 자체 방식(일반적으로 비공개 소스)으로 주변 장치를 지원하며 물론 동등한 BIOS에 동의하지 않습니다. 이 상황은 Linus Torvald의 유명한 인용문으로 이어집니다.

SoC ARM 설계자가 극도로 고통스러운 사고로 죽기를 바랍니다. [...] 가아, 여러분, 이 ARM 문제는 존나 고통스럽습니다.

귀하의 프로젝트가 그런 종류의 하드웨어를 기반으로 한다면...글쎄...행운을 빕니다! 메모리 범위를 무차별 대입해야 할 수도 있습니다. (어떤 일이 일어날지 적어보고 생각해 보세요)


그러면 스키마 종속 정보 데이터가 줄어듭니다. 표준 버스의 장치에 대한 내용:

~을 위한ISA장치(요즘은 주로 직렬/병렬 포트)의 경우, 매우 제한된 수의 장치를 읽으려면 몇 가지 시행착오 방법을 사용해야 합니다.대개포트 주소를 살펴보세요.

연결된 장치의 경우PCI버스,PCI 구성 공간표준(아키텍처 독립적) 열거 및 초기화 방법을 구현하는 표준입니다.


어쨌든, 귀하의 하드웨어가 표준화된 프로빙 방법을 사용할 수 없는 경우 귀하는 스스로 질문에 답변하게 될 것입니다@통신회사제안:

ARM에서는 하드웨어 설계자(또는 경우에 따라 리버스 엔지니어링)가 이를 다음 형식으로 설명해야 한다는 표준이 있는 것 같습니다.장치 트리 데이터, 이는 커널 파일 및 initramfs 파일과 함께 하드웨어별 부트로더에 의해 로드됩니다. 따라서 하드웨어 프로젝트가 PCI 또는 PCIe와 같은 표준화되고 자동 감지 가능한 기본 버스를 포함하지 않는 아키텍처를 사용하는 경우 하드웨어 설계자인 귀하는 Linux 커널에 이 정보를 제공해야 합니다.

답변2

x86 아키텍처는 부팅 중에 Linux 커널이 열거하는 표준 PC 구성 요소를 설명합니다(인터페이스에는 PCI, PCI-E, RAM 등이 포함됨). 일부 버스에서는 USB 또는 SATA와 같은 장치의 동적 연결/분리를 허용합니다. 귀하의 질문은 Linux/Unix에만 국한되지 않습니다.

관련 정보