디지털 권한 관리가 필요한 이유렌더 노드번호 매기기는 128부터 시작 /dev/dri/renderD<X>
하고 권한 있는 인터페이스는 /dev/dri/card<X>
0부터 시작합니까?
$ ls -al /dev/dri/
total 0
drwxr-xr-x 3 root root 100 Nov 21 07:46 .
drwxr-xr-x 23 root root 6040 Nov 22 11:09 ..
drwxr-xr-x 2 root root 80 Nov 21 07:46 by-path
crw-rw----+ 1 root video 226, 0 Nov 21 07:46 card0
crw-rw----+ 1 root render 226, 128 Nov 21 07:46 renderD128
답변1
권한 있는 DRI 인터페이스가 먼저 제공되었으며 처음에는 고정된 주 번호 226이 할당되었습니다.오직.
ARM 장치와 GPGPU 컴퓨팅 장치의 진화가 입증되면서 디스플레이 모드 설정과 렌더링은 별도의 장치로 액세스해야 하며,렌더 노드 개발. 128보다 큰 보조 장치 번호가 할당된 것 같지만 이를 명확하게 설명하는 문서를 빨리 찾을 수는 없습니다.
장치 번호 할당 코드는 다음으로 시작됩니다.drm_dev_init()
이 함수는 drivers/gpu/drm/drm_drv.c
커널 소스 코드에 있습니다. 다음으로 시작됨631번 국도그것은이라고drm_minor_alloc
동일한 파일의 기능:
if (drm_core_check_feature(dev, DRIVER_RENDER)) {
ret = drm_minor_alloc(dev, DRM_MINOR_RENDER);
if (ret)
goto err;
}
ret = drm_minor_alloc(dev, DRM_MINOR_PRIMARY);
if (ret)
goto err;
그것은이라고idr_alloc()
존재하다 lib/idr.c
:
r = idr_alloc(&drm_minors_idr,
NULL,
64 * type,
64 * (type + 1),
GFP_NOWAIT);
매개변수는 다음과 같습니다 idr_alloc()
.
* idr_alloc() - Allocate an ID.
* @idr: IDR handle.
* @ptr: Pointer to be associated with the new ID.
* @start: The minimum ID (inclusive).
* @end: The maximum ID (exclusive).
* @gfp: Memory allocation flags.
드라이버가 이 DRIVER_RENDER
기능을 지원하여 렌더 노드를 지원하는 경우 idr_alloc
먼저 렌더 노드를 할당한 다음 마스터 노드를 할당하기 위해 두 번 호출됩니다. 그렇지 않으면 기본 노드만 할당됩니다.
상수는 DRM_MINOR_*
다음에 정의되어 있습니다.include/drm/drm_file.h
:
/* Note that the order of this enum is ABI (it determines
* /dev/dri/renderD* numbers).
*/
enum drm_minor_type {
DRM_MINOR_PRIMARY,
DRM_MINOR_CONTROL,
DRM_MINOR_RENDER,
};
이것이 하나이므로 그 값은 각각 0, 1, 2 이다 enum
.DRM_MINOR_PRIMARY
DRM_MINOR_CONTROL
DRM_MINOR_RENDER
이렇게 하면 0 <= x < 64 범위의 부 장치 번호가 기본 인터페이스 노드에 할당되고 64 <= x < 128이 DRM_MINOR_Control 노드에 할당됩니다(무엇이든 간에... 현재는 6.0.x에서 사용되지 않는 것 같습니다). 커널? ) 및 128 <= x < 192를 DRM_MINOR_RENDER 노드에 추가합니다.
그런 다음 장치의 sysfs 이름을drivers/gpu/drm/drm_sysfs.c
함수에서 drm_sysfs_minor_alloc()
이름의 일부로 부 번호를 사용하십시오.
if (minor->type == DRM_MINOR_RENDER)
minor_str = "renderD%d";
else
minor_str = "card%d";
[...]
r = dev_set_name(kdev, minor_str, minor->index);
그리고 udev
기본 장치 이름을 수정하는 데 규칙을 사용하지 않는 한 sysfs 이름은 장치 노드의 이름도 됩니다.
기본적으로 이는 지금까지 렌더 노드인 경우 기본 장치 이름을 할당할 때 부 장치 노드 번호에서 128을 빼는 조건 절을 추가하는 데 신경을 쓴 사람이 아무도 없었기 때문입니다.
또한 주의사항이 2013년 DRM 개발 블로그 게시물설명하다:
렌더 노드를 이해하는 것도 중요합니다. 아니요특정 카드에 바인딩합니다. 내부적으로는 레거시 노드와 동일한 드라이버에 의해 생성되지만 사용자 공간은 렌더 노드와 레거시/모드 설정 노드 간의 연결을 가정해서는 안 됩니다. 반대로, 사용자 공간에 하드웨어 가속이 필요한 경우에는 켜져야 합니다. 어느 노드를 사용하고 있습니다.
[...]
"특정 카드에 대한 렌더 노드를 어떻게 찾나요?"와 같은 질문은 의미가 없습니다. 예, 드라이버별 사용자 공간은 어떤 렌더 노드가 어떤 드라이버에 의해 생성되었는지, 어떤 렌더 노드가 어떤 드라이버에 의해 생성되었는지 확인할 수 있지만 드라이버가 아닌 특정 사용자 공간에서는 이 작업을 수행해서는 안 됩니다.
이러한 의도를 염두에 두고 의도적으로 128부터 시작하여 렌더 노드 번호를 지정하는 것이 합리적일 수 있습니다( 동일 카드의 잠재적으로 잘못된 가정을 중단 card0
하고 항상 참조하기 위해).renderD0