2014-07-12 2 views
1

blk_rq_map_sg으로 매핑 된 struct scatterlist의 배열이 최소한 가상 주소 도메인에서 모두 인접하는지 묻고 싶습니다. 스 캐터리스트는 기본적으로 DMA를위한 것으로, 각 scatter-gather (sg) 배열 요소는 메모리 덩어리를 기술하고 그 덩어리는 물리적 주소에서 불연속 적입니다.가상 주소에 인접한 커널 스 캐터리스트가 있습니까?

블록 장치 드라이버를 쓰고 있습니다. 내 request_queue에서 구조 요청을 수신했다고 가정하고 내 요청이 보유하고있는 I/O 데이터 (예 : memcpy)를 어딘가에 보내고 싶습니다. 이 작업에는 가상 주소 및 길이 매개 변수가 필요합니다. 이제 내가 아는 것은 도우미 함수 blk_map_rq_sg()을 통해 매핑 된 scatterlist를 통해 요청의 데이터에 액세스 할 수 있다는 것입니다. 내 가정이 맞는지, 그 sg 요소가 가상 연속적이며, sg_virt()을 통해 데이터 주소를 가져올 수 있으며 해당 주소와 전체 길이를 memcpy으로 사용할 수 있습니까? 또는 그들은 가상에서 불연속이며, 각각의 sg 배열 요소와 memcpy을/sg 메모리 덩어리로 (가상에서) 더 열심히 걸어 가야합니까?

+0

'blk_rq_map_sg'의 결과를 검사 해 보셨습니까? 그들이 연속적이지 않다면, 당신은 그들이 존재한다는 가정을 할 수 없습니다. 그것들이 연속적이라면, 당신은 여전히 ​​그것이 100 % 일어날 것이라고 가정 할 수 없다. –

답변

0

writev과 같은 기능은 불연속 요청을 허용하고 높은 메모리의 페이지는 가상 주소가 없습니다.

CPU로 SG 목록 내용에 액세스하려면 sg_copy_from_buffer과 같은 것을 사용하십시오. 그러면 페이지가 임시로 자동 매핑됩니다.

관련 문제