2016-08-17 2 views
0

장치 드라이버를 작성할 때 device_create() 함수를 사용합니다.이 함수는 fops를 통해 등록 된 함수에 연결된/dev에 파일을 만듭니다.프로그램 내에서 파일 권한을 변경할 수 있습니까?

문제는 일단이 모듈을 insmod로 만들면 fprintf로/dev 파일에 쓸 수 없다는 것입니다. 페이지 도메인 오류가 발생합니다. 나는 정상적인 파일에 쓸 수 있기 때문에/dev에있는 파일에 쓸 수있는 권한이 없다고 상상해보십시오. 내가 외부에서 설정할 필요가 없도록 device_create()를 호출하는 동안 커널 모듈 내에서 파일을 쓰기 가능하도록 설정하기 위해 할 수있는 일이 있습니까?

답변

1

제가이 권리를 읽으면, 다음과 같이 지원되는 장치 파일에서 fopen + fprintf를하는 사용자 공간 프로그램이 있습니다. 당신의 커스텀 드라이버. 사용 중에 커널이 충돌합니다.

먼저 FILE 추상화 (fopen 및 fprintf와 함께 사용)는 장치 드라이버에 적용 할 때 매우 추상적입니다. 내부 버퍼링을 수행하기 때문에 실제로 어떤 데이터가 드라이버에 닿아 어떤 청크인지 알 수 없습니다. 대신 표준 파일 설명자를 직접 사용하십시오 (열기 + 쓰기).

이제 허가 문제가 있다는 의혹은 옳지 않습니다. 드라이버의 열린 루틴에 도달하면 커널이 이미 필요한 권한을 가지고 있다고 판단했습니다. 마찬가지로 쓰기 루틴에 도달하면 파일이 이미 열려 있으므로 사용 권한이 있음을 알 수 있습니다. 그러나 어떤 종류의 권한 문제가 있더라도 페이지 도메인 오류는 분명히 커널이 응답으로 만날 수는 없습니다.

질문의 품질을 감안할 때 나는이 재료로 게임하기에 너무 새롭고 당분간 사용자 공간을 고수하는 것이 좋습니다.

+0

나는 사람들에게 일을 배우고 배우지 말라고 말하는 사고 방식에 특히 동의하지 않지만 대답에 감사드립니다. – Zephyr

+0

나는 당신에게 "일을 배우지 말라"는 말을하지 않고, 올바른 순서로 배우라고 말하고 있습니다. 사용자 공간 프로그램은 작성하기가 쉽고 디버그하기 쉽습니다. 이 단계에서 커널을 가지고 노는 것은 불필요하게 어려운 일입니다. –

0

커널에서 syscalls를 사용하는 예제가있는 init/initramfs.c을 살펴보십시오. linux/syscalls.h을 포함하고 sys_chmod 만 사용하십시오. 그것은 userspace 변형처럼 작동합니다. 이것은 거의 모든 시스템 호출에 적용될 수 있습니다. (커널에서 socket을 사용하는 것은 좋은 생각이 아닙니다.)

+0

나는 이것이 결코 좋은 해결책인지는 알 수 없으므로 결코 커널 드라이버를 작성한 적이 없지만 괜찮아 보입니다. 내 주요 문제는 그것의 세부 사항의 부족이다. 자세한 내용은 소스 코드를 참조하는 것이 적절할 수 있지만 적어도 거기에 무엇이 있을지에 대한 개요를 제공해야합니다. –

관련 문제