2011-03-20 4 views
2

Xen 설정에서 게스트 VM의 IO 액세스는 XEN 하이퍼 바이저와의 호출이있는 수정 된 Linux 커널 인 dom0이라는 권한있는 도메인을 통과합니다. 블록 IO의 경우 프런트 엔드가 게스트 VM에 있고 드라이버의 백엔드가 domain0에있는 분할 드라이버 모델을 가지고 있습니다. 백엔드는 '바이오'구조를 만들고 전통적인 리눅스 블록 드라이버 코드에서와 같이 submit_bio()를 호출합니다.장치 드라이버의 아래쪽 절반에서 디스크 읽기를 실행

내 목표는 디스크에 기록 된 데이터에 문제가 있는지 (손실 된 데이터, 자동으로 손상된 쓰기, 잘못 지시 된 쓰기 등) 확인하는 것입니다. 따라서 디스크에 기록 된 데이터를 읽고 캐시의 데이터 복사본과 비교해야합니다.이 데이터는 '읽기 후 쓰기'라는 공통 디스크 기능입니다. 내 질문은, 내 백엔드 드라이버 수준에서 __bread()를 호출 할 수 있습니까? __bread가 호출 될 때 커널이 충돌합니다. 아무도 이유를 이해할 수 있습니까? 또한 이것이 가능하지 않은 경우, 드라이버의 하단에서 디스크의 특정 데이터 블록을 읽는 다른 방법은 무엇입니까?

글의 바이오 구조를 가로 채고 복제 할 수 있으며 새로운 바이오에서 읽기로 작업을 변경하고 submit_bio()를 다시 호출 할 수 있습니까? 그랬지 만, submit_bio()의 완료 콜백에 의해 반환되는 바이오 구조의 섹터 번호는 내가 보낸 것이 아닌 임의의 값입니다 ..

고마워.

답변

0

이것이 내 작업이라면, 먼저 새로운 스케줄링 알고리즘을 작성해보십시오. cfq 또는 deadline 또는 noop 또는 as 일정 코드를 복사하여 쓰기 요청을 수락 한 후 읽기 명령을 자기 제출하기 위해 거기에서 작업을 시작하십시오. noop은 쓰기 후에 을 바로으로 수정하고 오류를 위쪽으로 전파하는 것이 가장 쉬운 방법이지만 성능이 매우 좋을 것이라고 상상할 수는 없습니다. 그러나 다른 스케줄러 중 하나를 기본으로 사용하면 쓰기 직후에 오류를 알리기가 훨씬 어려울 수 있습니다. 다시 읽기를 예약하기 전에 몇 초가 걸렸을 것입니다. 그래서 실제로는 사실 이후의 진단으로서 유용하며 응용 프로그램에 직접적으로 이익이 될 수있는 것은 아닙니다.

관련 문제