물리적으로 연속적이고 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
을 사용하여 등록해야합니다. 이 올바른지?
일부 통신에서는 이미 Netlink를 사용하고 있습니다. 그래서 netlink_create에 전달 된'struct socket * sock'을 가져 와서'ops' 필드 ('struct struct_proto_ops')에 접근하고'ops'의'mmap' 필드를 수정할 수 있습니다. 그게 효과가 있니? – Joshua
수정, Netlink는 모든 sock-> ops가 가리킬 수있는'netlink_ops' 변수를 사용합니다. 그래서'netlink_ops'를 복사하고'mmap' 필드를 수정해야합니다. – Joshua
@ Joshua, 당신이 제안하는 것이 효과가 있을지 모르지만 나는 정상적인 방법으로 일하는 대신에 커널을 해킹 할 필요가 없다. 정상적인 방법으로, 당신은 나쁜 놀람을 피할 더 나은 기회가 있습니다. – ugoren