2011-02-03 5 views
2

임베디드 시스템 용 이더넷 드라이버에서 메모리 손상 문제를 조사하고 있습니다.리눅스 sk_buff에서 skb-> data는 실제 또는 가상 주소입니까?

버스 마스터 링 DMA 컨트롤러와 느린 SDRAM 사이에 문제가 있다고 생각됩니다. 그래서 빠른 SRAM에서 바운스 버퍼를 사용하고 싶습니다. 이렇게하려면 두 가지가 필요합니다 : 나는 (버스 마스터의 관점에서 볼 때) SRAM의 물리적 주소를 DMA 컨트롤러 버퍼 디스크립터에 넣어야하고, 일단 DMA 컨트롤러가 DMA를보고하면 바운스 버퍼의 데이터를 SDRAM의 sk_buff에 memcpy해야합니다. 들어오는 패킷. 내가

을 읽고, 판단 할 수 없었던 무엇

데이터가 물리적 또는 가상 주소> skb- 여부입니다. 즉 나는

memcpy(skb->data, phys_to_virt(bounce_addr), len); 

또는

memcpy(phys_to_virt(skb->data), phys_to_virt(bounce_addr), len); 

는 리눅스 네트워킹 스택의 나머지 부분을 처리 할 수 ​​있도록 한 sk_buff로 패킷을 얻기 위해 전화를해야합니까?

편집 : This is the driver in question. 나는 그것이 가상 주소를 DMA 컨트롤러 레지스터에 전달하고 있기 때문에 작동하지 않을 것이라고 말하고 싶지만이 코드가 작동하는 devkit을 가지고 있습니다. 그러나 내 SDRAM에는 devkit DDR SDRAM만큼 좋은 타이밍이 없으므로 바운스 버퍼를 구현할 생각입니다.

+0

흠, 같은 버퍼를 가리키고 있기 때문에 가상해야합니다. 맞습니까? –

+0

@ 니콜라이 : 같은 버퍼 무엇? –

+0

@Ben,'* head','* tail','* end'와 동일합니다. 하드웨어와 통신 할 때'skb-> data'에서 항상'pci_map_single'을하는 곳의 e100 코드를보십시오 : http://lxr.linux.no/#linux+v2.6.37/drivers/net/ e100.C# L1883 –

답변

4

가상입니다. 기본적으로 커널에 타입이 foo * 인 것은 가상 주소가 될 것이고, 실제로는 하위 메모리 관리 밖에있는 실제 주소 인 을 거의 다루지 않을 것입니다. 가상 주소는 입니다. 주소 또는 struct page을 사용하면 가상 주소를 얻으려면 kmap해야합니다.

+0

"저수준 메모리 관리를 벗어난 실제 주소를 다루는 경우는 드물다"는 것을 의미한다고 가정합니다. 하지만 분명히 사실이 아닙니다. DMA 기능이있는 장치의 드라이버는 장치에 DMA 버퍼의 실제 주소를 알려줘야하며, 이것이 내 질문의 주제입니다. 필자는 실제 주소가 포인터가 아닌 포인터 크기의 정수 타입으로 유지되어야한다고 생각해야한다. 왜냐하면 포인터가 참조 해제 될 수 없기 때문에 실제 소스 코드를 보지 않기 때문이다. 어쩌면이 특별한 운전자는 잘 쓰여지지 않을 것입니다. –

+0

감사합니다. 오타가 수정되었습니다.그리고 내 경험에 따르면 장치 드라이버 대신 코어 커널 코드가 대부분이므로 임의의 드라이버가 실제로 무엇을하는지 말할 수는 없습니다. 나는 잘 쓰여진 사람들이 구별을하기를 기대하지만 거기에는 많은 진절머리 나는 사람들이있다. – nelhage