2012-01-19 2 views
1

친구, 저는 코어, 메모리 계층 및 상호 연결 같은 다양한 아키텍처 매개 변수에서 실행되는 코드의 타이밍 효과를 시뮬레이트하는 데 사용되는 사내 아키텍처 시뮬레이터를 연구하고 있습니다.i386 linux 커널 용 qemu를 사용하는 주소 공간 식별자

"PinTool"및 "qemu-linux-user"와 같은 에뮬레이터에서 실행중인 프로그램의 실제 추적을 가져 와서이 추적을 시뮬레이터에 제공합니다.

내 접근 방식은 다음과 같습니다. 1) 이진 실행 파일의 objdump를 가져 와서이 정보를 구문 분석합니다. 2) 이제 에뮬레이터는 load-address/store-address와 같은 명령어 포인터 및 기타 정보를 피드에 제공해야합니다.

이러한 접근법은 프로그램 내용을 알고있는 경우에만 작동합니다.

하지만 지금은 표준 리눅스 커널 위에 실행 가능한 실행 파일의 흔적을 가져 오려고했습니다. 이제 문제는 기본 커널 이미지에 LKM (로드 가능한 커널 모듈)의 코드가 포함되어 있지 않다는 것입니다. 또한 커널을 시작할 때 데몬을 알 수 없습니다.

따라서이 솔루션에 대한 접근 방식은 다음과 같습니다. 1) qemu를 사용하여 컴퓨터를 에뮬레이션합니다. 2) 처음으로 명령을 발견하면이를 구문 분석하고이 정보를 저장합니다. 나중에. 3) 명령이 실행될 때 ip, load/store 주소를 보내는 헬퍼 함수를 ​​만듭니다.

2 단계에서 멈췄습니다. 내가 어떻게 에뮬레이터이며 손님 OS에 대해 아무것도 몰라 qemu에서 다른 프로세스를 구별합니까 ??

게스트 OS의 스케줄러를 수정할 수는 있지만 실제로 진행 방법을 알 수는 없습니다.

매우 긴 질문 인 경우 죄송합니다. 나는 어떤 부분을 추상화 할 수 있었지만 어떤 부분은 문제의 맥락에 대한 설명을 제공한다고 느꼈다.

답변

2

첫 번째 경우 qemu-linux-user를 사용하여 단일 프로그램의 사용자 모드 에뮬레이션을 수행하면 메모리가 선형이며 에뮬레이터와 관련된 가상 메모리가 없으므로 작업이 매우 쉽습니다. 전체 시스템 에뮬레이션의 두 번째 경우는 기본적으로 커널 구조에서 주소를 구문 분석해야하므로 훨씬 더 복잡합니다.

가상 주소를 QEmu에서 직접 가져올 수 있다면 작업이 좀 더 쉽습니다. 그런 다음 단일 프로세스의 경우와 마찬가지로 프로세스를 식별하고 다른 모든 기능을 파악하면됩니다. get_pid()으로 시스템 호출을 위조하여 PID를 얻을 수 있습니다.

그렇지 않으면이 모든 것이 실제 메모리 덤프에서 시스템을 디버깅하는 것과 상당히 비슷합니다. 이 작업에는 some tools이 있습니다. 그들은 모든 명령어에 대해 실행하기에는 너무 느릴 수 있지만 힌트를 찾을 수는 있습니다.

+0

예, 저는 사용자 모드 에뮬레이션을 위해 qemu-linux-user를 사용하고 있으며, 완전한 시스템 에뮬레이션을 위해 qemu-system-i386을 사용하고 있습니다. 완벽한 시스템 에뮬레이션을 위해서는 문제가 정확히 지적한 것입니다. qemu가 명령어를 분석하고있는 프로세스의 PID를 안다. qemu의 지시 단계를 분해하는 중에 가상 주소를 얻고 있습니다. –

+0

누군가가 일부 출력 포트에서 현재 프로세스의 PID를 출력 할 수있는 Linux 스케줄러에서 해당 위치를 가리킬 수 있습니까? –