2011-10-30 2 views
2

내 문제를 해결하기 위해 몇 가지 적합한 예제를 찾는 데 어려움이 있습니다. 사용자와 커널 공간 사이에 4K (4096) 바이트의 데이터를 공유하려고합니다. 커널에서 메모리를 할당하고 사용자 공간에서 mmap해야한다는 많은 아이디어를 발견했습니다. 누군가 리눅스 2.6.38에서 그것을하는 방법에 대한 예제를 제공 할 수 있습니까? 그것을 설명하는 좋은 문서가 있습니까?mmap을 사용하여 사용자 공간 및 커널 스레드를 공유하는 방법

미리 감사드립니다.

+0

여기에는 하나의 구현이 있습니다. http://people.ee.ethz.ch/~arkeller/linux/kernel_user_space_howto.html#s8 – Mat

+0

나는 이것을 보았습니다. 이것은 debugfs를 사용합니다. 이 debugfs를 피하는 방법? – max

답변

4

제안 된 방법은 한 가지 방법이지만 사용자 공간이 사용자의 통제 범위를 벗어 났으므로 (사용자 공간 프로그램이 커널을 파고들 가능성이 있음을 의미 함) 사용자 공간으로부터의 악의적 인 공격의 기회를 여는 것입니다. 이 커널 기반 메모리 공유 -와 - 사용자 공간도 여기에 설명되어 있습니다 :

http://www.scs.ch/~frey/linux/memorymap.html

대신, 어떻게 사용자 공간에 메모리를 할당에 대한 다음 커널에서이 API를 위해서는 copy_from_user()와 copy_to_user라는()를 사용하여 복사 사용자 공간 메모리로 /부터? 만약 다른 프로세스들 사이에서 메모리를 공유하고 싶다면, u는 항상 IPC 관련 API를 사용하여 shmget() 등 메모리를 할당하고 정의 할 수 있습니다.이 경우 커널 소스 자체에 많은 샘플 코드가 있습니다.

예 :

fs/checksum.c : 누락 된 = __copy_from_user (dst, src, len);

+0

이 링크는 메모리 매핑을 얻는 데 효과적입니다. 먼저 사용자 공간에서 메모리를 할당하고 포인터를 커널 공간에 전달하여 copy_from_user를 통해 사용하려고했습니다. 하지만 문제는 커널 스레드에서 액세스해야하며 커널 스레드는 내 프로세스 컨텍스트에서 항상 실행되지 않기 때문에 copy_from_user가 원하는 메모리에서 복사하지 못합니다. – max

+0

내가 볼 수 있듯이, 단일 사용자 프로세스간에 메모리를 공유하지는 않지만 많은 사용자 프로세스와 커널간에 메모리를 공유한다는 의미입니다. 그렇다면 커널에 한 번 할당 한 다음 사용자 공간을 mmap하는 것이 좋습니다. 이는 동일한 커널 메모리 영역을 가리키는 많은 페이지 테이블 항목 (각 프로세스의 사용자 공간 구성 요소에 대해 모두 동일한 커널 구성 요소를 공유 했음에도 불구하고)을 생성한다는 것을 의미합니다. 성능은 매우 나빠질 것입니다. 보통의 페이지 오류 메커니즘을 통해 각 업데이트가 모든 프로세스에 동 기적으로 복제되기 때문입니다. –

+0

하나의 프로세스 인스턴스 만 있습니다. 해당 프로세스의 스레드가 여러 개 있습니다. 시스템 콜에서 생성 된 여러 커널 스레드도 있습니다. 이러한 커널 스레드와 사용자 수준 스레드는 메모리를 공유합니다. 커널 수준 스레드가 뭔가를 넣습니다. 사용자 스레드가이를 선택합니다. 그리고 그런 것입니다. – max

관련 문제