2012-05-31 1 views
3

Linux에서 단위 테스트를 위해 메모리 I/O 장치를 에뮬레이트 할 수 있습니까?리눅스에서 단위 테스트를 위해 메모리 I/O 장치를 에뮬레이트 할 수 있습니까?

임베디드 배포를위한 일부 소스 코드에 대한 단위 테스트를 작성하고 있습니다.

코드는 칩과 통신하기 위해 특정 주소 공간에 액세스하고 있습니다.

  • Linux에서이 코드를 단위 테스트 (UT)하고 싶습니다.
  • 단위 테스트는 사람의 개입없이 실행할 수 있어야합니다.
  • 일반 사용자로 UT를 실행해야합니다.
  • 테스트해야하는 코드는 대상 시스템에서 실행중인 소스 코드와 정확히 일치해야합니다.

내가 어떻게 해결할 수 있는지에 대한 아이디어가 있습니까?

일반 사용자가 특정 주소에서 특정 메모리 할당을 수행해야한다고 MMU에 알릴 수 있습니까? 또는 데이터 블록이 특정 메모리 영역에 있어야합니까?

내가 알고있는 것처럼 :

  • SIGSEGV는 사용할 수 없습니다; 핸들러에서 반환 된 후 동일한 mem 액세스 코드가 다시 호출되어 다시 실패하기 때문입니다.

    헨리에게

    감사

+0

가상 컴퓨터. –

답변

2

먼저 읽을 수 있도록 주소를 만들 주입 된 의존성을 (또는 실수로 메모리 영역은 실제로 그냥 내가하고 싶은되지 무엇을, 거기에 유효한 데이터가있을 수 있습니다) 하드 코드 된 종속성 대신 코드의 이제 테스트 조건에서의 위치에 대해 걱정할 필요가 없습니다. 원하는대로 할 수 있습니다.

그렇다면 테스트중인 항목에 따라 마법 주소를 종속성으로 읽고 쓰는 기능을 주입해야 할 수도 있습니다. 이제 I/O를 수행하고 있다고 생각하도록 테스트중인 코드를 속이는 방법에 대해 걱정할 필요가 없습니다. 하드웨어 I/O 동작을 스텁/모의/할 수 있습니다.

너무 낮은 수준의 간접 참조를 도입하고 싶지 않으므로 설명하는 조건에서 하위 수준 코드를 테스트하는 것은 매우 어렵습니다. 또한 테스트 모드가 아닌 상태에서 매우 효율적으로 유지합니다.

"정확히 소스 코드"는 해석 방법에 따라 여러 가지 죄를 숨길 수 있습니다. 예를 들어, "의존성 주입"은 매크로를 통해 이루어질 수 있으므로 단위 소스는 "동일"하지만 부적절한 -D 컴파일러 옵션을 사용하여 수행 한 작업을 완전히 변경했습니다.

+0

감사합니다. 문제는 모든 가능한 경우 정확히 동일한 코드 여야한다는 것입니다. 그래서이 경우 #ifdef는 눈살을 찌푸리게됩니다. –

0

AFAIK 블록 장치를 만들어야합니다 (문자 장치가 작동하는지 잘 모르겠습니다). 해당 메모리 범위를 자체에 매핑하는 커널 모듈을 만듭니다. 읽기/쓰기 기능을 생성하므로 해당 메모리 범위를 터치 할 때마다 해당 읽기/쓰기 기능이 호출됩니다.

이 커널에 읽기/쓰기 기능을 등록하여 해당 주소에 대한 읽기/쓰기가있을 때마다 커널이 호출되고 사용자 대신 커널에서 읽기/쓰기 기능이 수행되도록합니다.

+0

커널 모듈을 설치하려면 루트 액세스가 필요하지 않습니까? –

+0

하지만 "정상적인 사용으로 UT를 실행해야합니다."라고 말씀하셨습니다. 모듈을 커널에로드하면 루트 액세스없이 UT를 실행할 수 있습니다. – peeyush