2012-06-25 3 views
4

물리적으로 연속적이고 DMA 가능한 메모리의 일부 메모리 블록을 관리하기 위해 커널 드라이버를 작성하려고합니다. (이것들은 DMA 스트림이기 때문에 kmalloc()을 사용하고 있습니다). 일부 기능을 사용자 공간으로 끌어 들이기 위해이 메모리는 mmap()이고 자체 구현은 mmap()입니다. 나는 리눅스 장치 드라이버을 사용하여 왔으며 Google의 주요 정보 출처로 나쁜 예가 표시되었습니다.mmap()을 구현하는 커널 드라이버가 문자 장치를 만들어야합니까?

mmap() (지금은 my_mmap())을 커널에 등록해야합니다. 이것은 struct file_operations을 사용하여이를 수행하는 유일한 유효한 방법으로 보입니다.하지만 문자 장치와 실제 위치를 만들어야합니다. 나는 그것을하고 싶지 않다. 난 그냥 메모리 버퍼에 액세스하고 메모리 버퍼를 매핑 할 파일을 만들지 userspace 응용 프로그램에 대한 가상 주소를 만들고 싶습니다. 이것이 가능한가?

프레임 버퍼도 mmap() 구현과 동일한 구조를 가지고 있지만 너무 많은 해킹이 될 수 있습니다. 그것과 그것은 더 많은 미지수를 추가합니다.

내가 이해하는 것처럼, my_mmap()은 무거운 유연성을 가지고 괜찮 으면 remap_pfn_range()만큼 무거워서 사용할 수 있습니다. 그렇지 않으면 로컬 nopages()을 구현하고 struct vm_operations_struct을 사용하여 등록해야합니다. 이 올바른지?

답변

6

mmap() 작업은 일부 소스를 가상 주소 공간으로 매핑하라는 사용자 공간의 요청입니다. userspace 프로그램이 을 찾는 방법은 파일 설명자를 제공하여 커널이 아는 자원에 대한 핸들입니다.

즉, 사용자 공간 프로그램이 커널에 관심이 있다고 알릴 수 있도록 장치를 파일 설명자로 나타내야합니다 (커널이 mmap() 구현을 호출하는 것을 알고 있음) - 문자 장치 등록은 그것을하는 전형적인 방법. 프레임 버퍼 장치는 문자 장치를 통해 액세스됩니다.

read()write()과 같은 다른 문자 장치 작업을 구현하지 않아도 장치에 맞지 않습니다. 문자 장치는 사용자 공간 프로그램이 장치에 대한 커널 관리 핸들을 여는 방법 일뿐입니다.

+0

일부 통신에서는 이미 Netlink를 사용하고 있습니다. 그래서 netlink_create에 전달 된'struct socket * sock'을 가져 와서'ops' 필드 ('struct struct_proto_ops')에 접근하고'ops'의'mmap' 필드를 수정할 수 있습니다. 그게 효과가 있니? – Joshua

+0

수정, Netlink는 모든 sock-> ops가 가리킬 수있는'netlink_ops' 변수를 사용합니다. 그래서'netlink_ops'를 복사하고'mmap' 필드를 수정해야합니다. – Joshua

+0

@ Joshua, 당신이 제안하는 것이 효과가 있을지 모르지만 나는 정상적인 방법으로 일하는 대신에 커널을 해킹 할 필요가 없다. 정상적인 방법으로, 당신은 나쁜 놀람을 피할 더 나은 기회가 있습니다. – ugoren