/ dev / mem은 무엇입니까? 그것은 어떻게 든 메모리와 관련이 있습니까?

아마도 그것은 어떻게 든 메모리와 관련이 있습니까? 어떤 것

sudo cat /dev/urandom > /dev/mem

하다? 모든 RAM을 삭제 하시겠습니까? 커널이 아닌 모든 가상 메모리? 위의 어느 것도?



답변

시스템의 실제 메모리에 대한 액세스를 제공합니다.

mem(4)매뉴얼 페이지 에 대한 자세한 설명 /dev/mem입니다.

예. 모든 종류의 문제가 발생할 수 있습니다. 재부팅하면 문제가 해결되지만 나쁜 일이 매우 쉽게 발생할 수 있습니다. 조심해! 🙂


답변

/ dev / mem은 가상 메모리가 아닌 시스템의 물리적 메모리에 대한 액세스를 제공합니다 . 커널 가상 주소 공간은 / dev / kmem을 사용하여 액세스 할 수 있습니다.

주로 비디오 어댑터와 같은 주변 장치 하드웨어와 관련된 IO 메모리 주소에 액세스하는 데 사용됩니다.


답변

sudo cat /dev/urandom > /dev/memsudo는 고양이의 권한을 높이지만 리디렉션은하지 않기 때문에 아무것도하지 않습니다. 당신도 할 수있는 sudo su루트 쉘에서 다음 작업 또는 사용
sudo dd if=/dev/urandom of=/dev/mem

/dev/mem실제 메모리, 즉 시스템의 모든 RAM에 대한 액세스를 제공하지만 이것이 RAM에 대한 전체 읽기 / 쓰기 액세스를 제공한다는 의미는 아닙니다 ( 문서의 CONFIG_STRICT_DEVMEM 옵션 참조 ). 또한 실제 메모리의 일부 영역에는 비디오 카드 메모리 등과 같은 다른 장치가 매핑되어 있습니다.

맹목적으로 글을 쓰는 /dev/mem것은 불확실한 행동을 초래할 것입니다. 여기 YouTube 동영상도 마찬가지입니다.


답변

그것으로 테스트 busybox devmem

busybox devmemmmaps 작은 CLI 유틸리티입니다 /dev/mem.

우분투에서 다음을 얻을 수 있습니다. sudo apt-get install busybox

사용법 : 실제 주소에서 4 바이트를 읽습니다 0x12345678.

sudo busybox devmem 0x12345678

0x9abcdef0그 주소에 쓰십시오 :

sudo busybox devmem 0x12345678 w 0x9abcdef0

출처 : https://github.com/mirror/busybox/blob/1_27_2/miscutils/devmem.c#L85

MAP_SHARED

mmapping 할 때 /dev/mem다음을 사용하려고합니다.

open("/dev/mem", O_RDWR | O_SYNC);
mmap(..., PROT_READ | PROT_WRITE, MAP_SHARED, ...)

MAP_SHARED 쓰기는 물리적 메모리로 즉시 이동하므로 관찰하기가 쉬워지고 하드웨어 레지스터 쓰기에 더 적합합니다.

CONFIG_STRICT_DEVMEMnopat

/dev/mem커널 v4.9에서 일반 RAM을보고 수정 하려면 다음을 수행해야합니다.

  • disable CONFIG_STRICT_DEVMEM(우분투 17.04에서 기본적으로 설정)
  • nopatx86에 대한 커널 명령 행 옵션 전달

IO 포트는 여전히 포트없이 작동합니다.

참고 항목 : https://stackoverflow.com/questions/39134990/mmap-of-dev-mem-fails-with-invalid-argument-for-virt-to-phys-address-but-addre/45127582#45127582

캐시 플러싱

레지스터 대신 RAM에 쓰려고하면 CPU가 메모리를 캐시 할 수 있습니다. https://stackoverflow.com/questions/22701352/how-to-flush-the-cpu-cache-for-a-region -어드레스-공간-리눅스 에서 나는 그것을 플러시하거나 리전을 캐시 할 수없는 것으로 표시하는 매우 휴대용 / 쉬운 방법을 보지 못한다 :

따라서 /dev/mem메모리 버퍼를 장치에 전달하는 데 안정적으로 사용할 수 없습니까?

QEMU는 캐시를 시뮬레이트하지 않기 때문에 불행히도 QEMU에서 관찰 할 수 없습니다.

그것을 테스트하는 방법

이제 재미있는 부분입니다. 다음은 몇 가지 멋진 설정입니다.

  • 유저 랜드 메모리
    • volatile유저 랜드 프로세스에 변수 할당
    • /proc/<pid>/maps+로 실제 주소를 얻습니다/proc/<pid>/pagemap
    • 로 실제 주소를 지정 devmem2하고 userland 프로세스가 다음과 같이 반응하는지 확인하십시오.
  • 커널 랜드 메모리
    • 커널 메모리 할당 kmalloc
    • 실제 주소를 가져 와서 virt_to_physuserland에 다시 전달하십시오.
    • 실제 주소를 수정 devmem2
    • 커널 모듈에서 값을 쿼리
  • IO mem 및 QEMU 가상 플랫폼 장치
    • 알려진 물리적 레지스터 주소로 플랫폼 장치를 만듭니다.
    • devmem2레지스터에 쓰는 데 사용
    • printf응답으로 가상 장치에서 시계 가 나옴

답변

/ dev / mem은 전통적으로 전체 물리적 주소 공간에 대한 액세스를 제공했습니다. 여기에는 램이 포함되지만 메모리 매핑 IO 장치도 포함됩니다.

많은 최신 커널이 “CONFIG_STRICT_DEVMEM”으로 구성되어 / dev / mem이 메모리 매핑 IO 장치로만 제한됩니다.

랜덤 쓰레기를 쓰는 것은 나쁜 생각이지만 정확히 어떤 나쁜 일이 일어날지는 예측하기 어렵습니다. 하드웨어는 임의의 가비지에 대해 예측할 수없는 방식으로 응답 할 수 있으며, 손상된 커널 메모리 구조는 예측할 수없는 커널 동작을 유발할 수 있습니다. 기껏해야 시스템 충돌, 최악의 데이터 손상 또는 하드웨어 브릭 킹에 대해서는 의문의 여지가 없습니다.

추신 : sudo는 리디렉션이 아닌 cat 명령 만 제거하기 때문에 일반 사용자로 실행할 때 명령을 수행하면 안됩니다.