임베디드 시스템 용 이더넷 드라이버에서 메모리 손상 문제를 조사하고 있습니다.리눅스 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만큼 좋은 타이밍이 없으므로 바운스 버퍼를 구현할 생각입니다.
흠, 같은 버퍼를 가리키고 있기 때문에 가상해야합니다. 맞습니까? –
@ 니콜라이 : 같은 버퍼 무엇? –
@Ben,'* head','* tail','* end'와 동일합니다. 하드웨어와 통신 할 때'skb-> data'에서 항상'pci_map_single'을하는 곳의 e100 코드를보십시오 : http://lxr.linux.no/#linux+v2.6.37/drivers/net/ e100.C# L1883 –