실행 중인 커널의 /sys를 사용하여 장치 트리에 대한 정보를 얻을 수 있습니까?

실행 중인 커널의 /sys를 사용하여 장치 트리에 대한 정보를 얻을 수 있습니까?

일반적으로 무기 시스템의 경우장치 트리커널(Linux)에 하드웨어 정보를 제공합니다. 이러한 장치 트리는 컴파일되어 커널에 로드되는 dts(장치 트리 소스) 파일 형식으로 존재합니다. 문제는 내가 그런 dts파일 에 접근할 수 없다는 점이다 dtb. 심지어 파일에도 접근할 수 없다.

/sys접근 권한 이 있고 /proc컴퓨터에 있습니다. 이것이 dts에서 사용할 "올바른 값을 추측"할 수 있는지 묻고 싶습니다.

이 질문에 대한 대답이 더 해킹적인 것보다는 장치 트리 인터페이스가 처음에 사용되는지(즉, dtb생성되어 커널에 제공되는지)에 따라 달라지는 경우 "우리는 장치 정보 문제를 해결하기 위해 방금 바닐라에서 이동하여 커널을 패치했습니다. 그것은 우리 커널에만 적용됩니다." - 해결책은 무엇입니까?

답변1

/proc/device-tree또는/sys/firmware/devicetree/base

/proc/device-tree/sys/firmware/devicetree/base는 및에 대한 심볼릭 링크입니다.커널 문서에 따르면사용자 모드는 다음을 주장해야 합니다 /proc/device-tree.

사용자 공간은 /sys/firmware/devicetree/base 경로를 직접 사용해서는 안 되며, /proc/device-tree 심볼릭 링크를 따라야 합니다. 절대 경로는 향후 변경될 수 있지만 기호 링크는 안정적인 ABI입니다.

그런 다음 파일에서 dts 속성에 액세스할 수 있습니다.

 hexdump /sys/firmware/devicetree/base/apb-pclk/clock-frequency

정수의 출력 형식은 이진수이므로 hexdump필수입니다.

dtc -I fs

파일 시스템에서 전체 장치 트리를 가져옵니다.

sudo apt-get install device-tree-compiler
dtc -I fs -O dts /sys/firmware/devicetree/base

dts를 stdout으로 출력합니다.

또한보십시오:커널 장치 트리를 나열하는 방법 | Unix 및 Linux 스택 교환

dtc빌드 루트 디렉터리에

Buildroot에는 루트 파일 시스템 BR2_PACKAGE_DTC=y에 넣을 수 있는 구성이 있습니다.dtc

QEMU-machine dumpdtb

QEMU에서 Linux를 실행하는 경우 QEMU는 명시적으로 지정하지 않으면 -dtb자동으로 DTB를 생성하므로 다음을 사용하여 직접 덤프할 수도 있습니다.

qemu-system-aarch64 -machine virt -cpu cortex-a57 -machine dumpdtb=dtb.dtb

명시된 바와 같이:https://lists.gnu.org/archive/html/qemu-discuss/2017-02/msg00051.html

시험용이 QEMU + Buildroot 설정Linux 커널 v4.19 arm64.

감사해요/proc/device-treeHarry Tsai는 커널 문서에서 이것이 사용자 영역에서 선호되는 선택이라고 지적합니다 ..

답변2

내 이해가 맞는지 잘 모르겠습니다.

dtb로 부팅하는 시스템을 사용하는 경우 debugfs 내에서 장치 트리에 액세스할 수 있어야 합니다.

blob에서 dt를 인쇄하는 fdtdump 및 fdtget을 포함하는 Pantelis Antoniou의 dtc 도구를 사용해 볼 수도 있습니다.

장치 트리가 전혀 없고 dtb에서 부팅하지 않는 경우 기계 코드를 직접 살펴보고 모든 장치 관련 속성과 노드를 dts에 추가해야 합니다. 이 유형의 부팅에는 "합성" 장치 트리가 생성되지 않습니다. 시작점은 유사한 시스템이거나 상위 시스템일 수 있으며 시스템별로 작업할 수 있습니다.

관련 정보