Qemu 가상 머신에서 메모리 매핑된 하드웨어 레지스터를 읽고 쓰기도 하기 위해 gdb(원격 연결)를 사용하려고 합니다. 하지만 작동하지 않습니다.
(gdb) p *0x2000000
Cannot access memory at address 0x20000000
하지만 컴퓨터에 로그인하여 실행하면
# devmem 0x2000000
0xE321F0D3
이것은 훌륭하게 작동합니다. 분명히 gdb는 그것으로부터 정보를 얻지 못합니다 /dev/mem
. 제가 생각할 수 있는 모든 컴파일 타임 디버깅 플래그를 활성화했으며 중단점을 설정하고 코드를 단계별로 실행하며 기호와 관련된 역참조 포인터를 설정할 수 있습니다. 그러나 대부분의 원시 포인터 역참조는 실패합니다.
기록을 위해 이것이 내가 qemu를 시작하는 방법입니다:
qemu-system-arm -M versatilepb -kernel output/images/zImage \
-dtb output/images/versatile-pb.dtb \
-drive file=output/images/rootfs.ext2,if=scsi \
-append "root=/dev/sda console=ttyAMA0,115200 nokaslr norandmaps printk.devkmsg=on printk.time=y" \
-nographic -s
nokaslr
나는 그것이 변화를 가져올 것이라고 생각했기 때문에 거기에 등을 추가했습니다 . 분명히 그렇지 않습니다. 무슨 일인지 아는 사람 있나요?
답변1
gdb
그리고 devmem
두 가지 다른 일을 하고 있습니다. gdb
보는 0x20000000
위치매핑된당신의프로세스 주소 공간, 프로세스마다 다릅니다(그렇지 않으면 스왑 파일과 페이지 테이블이 본질적으로 쓸모가 없습니다.). devmem
파일을 보고 /dev/mem
실제 메모리를 직접 보고 있습니다.
프로세스 주소 공간이 모든 물리적 주소 위치를 프로세스에 노출하지 않는 이유는 무엇입니까? 주된 이유는 이것이 큰 보안 허점이 될 수 있다는 것입니다. 임의의 프로세스가 자신이 소유하지 않은 메모리에서 데이터를 읽고 쓸 수 있는 것을 원하지 않습니다(그렇지 않으면 쉽게 보안을 우회할 수 있습니다).이 devmem
페이지에 게재하고 있습니다, "일부 물리적 주소는 하드웨어 레지스터입니다. 이를 쓰거나 읽는 것만으로도 컴퓨터/장치가 충돌하거나 녹거나 폭발할 수 있습니다. 경고했습니다!"