Linux 커널 Register_chdev 반환 값

Linux 커널 Register_chdev 반환 값

이 비디오새로운 캐릭터 장치를 생성하는 Raspberry Pi Linux 커널 모듈의 예를 보여줍니다. 커널 API를 사용합니다 register_chdev. 동영상에 대한 댓글(직접 링크를 생성할 수 없음)에서 의 반환 값과 관련하여 register_chdev작성자는 다음과 같이 말합니다.

반환 값이 0이 아닌 경우 해당 장치 번호는 이미 사용 중인 것입니다. 반환 값의 상위 12비트는 주요 장치 번호이고, 하위 20비트는 보조 장치 번호입니다.

"장치 번호가 이미 사용 중입니다"라는 말은 "커널 모듈에서 임의로 선택한 0이 아닌 주요 장치 번호가 이미 사용 중"이라는 뜻이라고 생각합니다.

여러 웹페이지에서 이를 다루고 있음에도 불구하고(공식적인 것, 그 다음에이 하나그리고이 하나), 반환 값의 내부 세분화에 대한 정보를 찾지 못했습니다.

이미 사용 중인 메이저 번호가 있는 장치를 생성하기로 선택하면(내 커널 모듈을 사용하여) 커널은 이를 승인하지 않으며 장치 등록을 거부합니다. 이는 내가 선택한 메이저 번호가 블록 장치의 메이저 번호와 동일한 경우와 내가 선택한 메이저 번호가 문자 장치의 메이저 번호와 동일한 경우에 발생합니다. register_chdev항상 음수 값을 반환합니다. 후자의 경우 대신 0이 아닌 양수 반환 값을 기대했는데, 상위 12비트는 주요 장치 번호를 나타내고 하위 20비트는 부 장치 번호를 나타냅니다(주 번호가 다음과 같은 경우 0보다 클 수 있음). 이미 사용된 경우 시스템에 이미 마이너 번호 0과 관련된 장치가 하나 이상 있을 수 있습니다.

유튜브 댓글에 적힌 내용이 사실인가요? 이에 대한 문서는 어디에서 찾을 수 있나요?


저는 Raspbian 10을 실행 중이며 uname -a다음을 보여줍니다.

Linux raspberrypi 5.10.63-v7+ #1459 SMP Wed Oct 6 16:41:10 BST 2021 armv7l GNU/Linux

답변1

register_chrdev그 자체는 커널에 문서화되어 있지 않지만정의가 짧다:

static inline int register_chrdev(unsigned int major, const char *name,
                  const struct file_operations *fops)
{
    return __register_chrdev(major, 0, 256, name, fops);
}

이는 기본적으로 호출을 의미합니다.__register_chrdev전체 범위의 부전공(0에서 시작하는 256개의 부전공)으로 전공을 등록하고 해당 함수의 결과를 반환합니다. 후자는 다음과 같이 문서화되어 있습니다.

만약에major== 0 이 함수는 전공을 동적으로 할당하고 해당 번호를 반환합니다.

만약에major> 0 이 함수는 주어진 주요 번호로 장치를 예약하려고 시도하고 성공하면 0을 반환합니다.

실패 시 -ve errno를 반환합니다.

암호화되거나 다른 방식으로 미성년자를 돌려보내는 조항은 없습니다. 이러한 기능의 목적은 잠재적으로 미성년자의 하위 집합과 함께 전공을 등록하는 것입니다. 미성년자 한명도 아니고.

그만큼부호화장치 드라이버가 open호출을 처리할 때나 특정 장치가 어떤 마이너(여러 메이저를 처리하는 경우 메이저)에 해당하는지 확인해야 할 때 작동합니다. 드라이버에는 처리하도록 요청된 inode가 제공됩니다. 메이저와 마이너를 인코딩하는 장치 번호를 포함하는 장치 노드의 경우. 그만큼MAJOR그리고MINOR매크로 또는 inode에서 시작하는 경우imajor그리고iminor함수를 사용하여 값을 추출해야 합니다.

일부 문자 장치는 위에서 설명한 주요 등록 메커니즘 외에 멀티플렉싱을 제공합니다. 보다하나의 기타 드라이버가 이 모든 하드웨어를 어떻게 제어합니까?이에 대한 예를 들어 보겠습니다.

관련 정보