DMA 전송에 사용할 메모리를 만들고 싶습니다. (리눅스 2.6.18-128.el5 # 1 SMP 사용)DMA 전송에 사용할 사용자 공간의 실제 메모리 만들기
나는 나를 위해이 일을 할 수있는 H/W API 스택 + 커널 드라이버를 가지고있다.
API를 사용하여 DMA 전송을 만드는 경우 시스템 RAM (예 : 0x7373a6f8 한 번 실행)에서 매우 높은 메모리를 할당합니다. (나는 장치의 ICD를 가지고 있으므로, mmap'd 이상의 메모리 맵을 가지고 있는데,이 주소를 찾는 방법이며, 결국 내 자신의 주소와/dev/mem에 SET하고 싶다. 아래의 맵에서)
아마도이 높은 주소 주위에 메모리를 mmap 할 수없는 것처럼 보입니다. 가상 메모리 공간이 부족하고 커널에 의해 차단되고있는 것 같습니다.
내가 할 수 있기를 원하는 것은이 주소를 사용 (지도)하여 읽기/쓰기가 가능하거나 읽거나 쓸 수있는 내 자신의 실제 메모리를 만들 수 있습니다. 내가 제대로 이해 해요 경우
# cat /proc/iomem
00000000-0009fbff : System RAM
00000000-00000000 : Crash kernel
000a0000-000bffff : Video RAM area
000c0000-000c7fff : Video ROM
000f0000-000fffff : System ROM
00100000-7fd64fff : System RAM # Is this all of /dev/mem?
00400000-00612916 : Kernel code
00612917-006ef9db : Kernel data
# cat /proc/3450/maps
08207000-08228000 rw-p 08207000 00:00 0 [heap]
b7e7b000-b7f85000 rw-p b7e7b000 00:00 0
b7f89000-b7f8a000 rw-p b7f89000 00:00 0
b7f8a000-b7f8b000 rw-s 80114000 00:11 1541 /dev/mem
b7f8b000-b7f8d000 rw-p b7f8b000 00:00 0
bff70000-bff85000 rw-p bffea000 00:00 0 [stack]
, 당신이 가난하게 행동하는 것 장치 드라이버를 가지고 있고, 수동으로 사용자 공간에서 물리적 RAM을 할당하는 것을 해결할려고? 대신에 드라이버를 고치는 데 관심이없는 이유가 있습니까? 이것은 매우 이상한 요청처럼 들리지만, 대부분의 사람들이 적절한 고침으로 간주하는 것이 아닙니다. 기본 드라이버 문제를 해결하고 있다면 더 많은 도움을받을 것으로 생각됩니다. –
오른쪽, 사용자 공간 API/라이브러리는 sllooow입니다. 나는 경험 많은 C/C++ 개발자이지만 이전에는 장치 드라이어를 사용하지 않았으며 이제는 내 회사 도메인입니다. 나는 작업을 마친 후 빠른 (읽기에 더러운) 해킹을 원했지만, 실제로는 더 나은 드라이버를 제공하기 위해 API/커널 드라이버 공급 업체에 이르기까지되었습니다. 귀하의 회신에 감사드립니다! –
@ 에릭이 단어들을 답으로 쓰고 싶다면 받아 들일 것입니다. 지금은 DMA를 사용하고 있지는 않지만 우리 자신의 장치 드라이버 (http://stackoverflow.com/q/5185397/119790) –