2010-12-07 3 views
1

리눅스 커널 모듈에서 User-Space로 초당 몇 메가 바이트의 데이터를 전송해야하며, 모듈에서 어떤 메시지도 놓치지 않기를 바랍니다. 나는 그것을 읽었다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?커널에서 사용자 공간으로 큰 데이터를 전송하는 가장 좋은 방법

Named-Pipes, Proc-File 및 Block-Device 그러나 나는 선택할 수있는 것이 무엇인지, 어느 것이 내가 Kernel-Newbie 이래로 최상의 성능을 약속하는지 잘 모르겠습니다.

현재 나는 메시지를 저장하기 위해 커널 모듈에서 링 버퍼 (spinlocks와 함께)를 사용하고 Proc-File이 읽히고 있으면 나는 Ring-Buffer에서 Proc-File로 데이터를 저장한다. 사용자 측에 cat /proc/procfile을 반복적으로 실행하고 출력을 보여주는 프로그램이 있습니다. 이 솔루션의 문제는 대신 출력

메시지 1 메시지 2 메시지 3

을 받고, 나는이 (때로는 수천 번씩 몇 가지 메시지)를 참조한다는 것입니다

메시지 1 메신저 3

답변

1

필자가 생각하기에 "가난한 사람의 시스템 호출"을 구현하는 것이 가능합니다. char 장치를 만든 다음 원하는 의미론을 사용하여 사용자 지정 ioctl을 만듭니다.

이 경우 사용자 공간 버퍼를 전달하는 ioctl이 있고 커널에있는 순환 버퍼에서 데이터 덩어리를 반환한다고 가정합니다.

원자 변수와 스핀 록을주의 깊게 사용하면 필요한 경우 여러 스레드에서 데이터에 빠르고 안전하게 액세스 할 수 있어야합니다.

1

I bel ieve character device 당신을위한 좋은 해결책이 될 것입니다.

3

이전에는 relayfs라고하는 릴레이 인터페이스를 사용하고 싶을 것입니다.

Documentation/filesystems/relay.txt을 참조하십시오. 거기에서

:

릴레이 인터페이스 커널 애플리케이션을 효율적 로그 및 사용자 정의 '중계 채널의 통해 유저 커널에서 대량의 데이터를 전송하기위한 수단 을 제공한다.

0

많은 방법을 사용할 수 있습니다. 그러나 Netlink는 신뢰할 수있는 전송 (UDP와 같은)이 아니기 때문에 그 중 하나가 아닙니다. 문자 장치는 순서대로 보이지만 TCP 소켓 (cf. nfsd)을 사용할 수도 있습니다.

관련 문제