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이는 장치 드라이버가 통화를 처리할 때 또는 특정 장치가 어느 보조 장치에 해당하는지(또는 여러 기본 장치를 처리하는 경우 기본 장치)를 결정해야 할 때 작동합니다. 드라이버에는 처리가 필요한 인덱스 노드가 제공됩니다. 장치 노드의 경우 장치 번호, 메이저 및 마이너 인코딩을 포함합니다. 이것MAJOR그리고MINOR매크로 또는 inode에서 시작imajor그리고iminor값을 추출하는 데 사용해야 하는 함수입니다.

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

관련 정보