gdb의 메모리 매핑된 레지스터에 액세스

gdb의 메모리 매핑된 레지스터에 액세스

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페이지에 게재하고 있습니다, "일부 물리적 주소는 하드웨어 레지스터입니다. 이를 쓰거나 읽는 것만으로도 컴퓨터/장치가 충돌하거나 녹거나 폭발할 수 있습니다. 경고했습니다!"

관련 정보