/ Dev / mem là gì?


40

Có lẽ nó bằng cách nào đó liên quan đến bộ nhớ? Sẽ ra sao

sudo cat /dev/urandom > /dev/mem

làm gì Rác hết RAM? Tất cả bộ nhớ ảo không kernel? Không có cái nào ở trên?


2
Xem thêm:dd if=/dev/urandom of=/dev/kmem bs=1 count=1 seek=$RANDOM
user3490

6
Không nên bảo vệ bộ nhớ dừng truy cập vào RAM vật lý cho tất cả các quy trình ngoại trừ quy trình đã được chỉ định cho khu vực RAM đó? Hay sudo ghi đè lên sự bảo vệ đó?
Khóa Matthew

Câu trả lời:


32

Nó cung cấp quyền truy cập vào bộ nhớ vật lý của hệ thống.

Các mem(4)trang người đàn ông giải thích thêm về những gì /dev/memlà.

Vâng - nó có thể gây ra tất cả các loại vấn đề. Khởi động lại sẽ sửa chữa bạn, nhưng những điều xấu có thể xảy ra rất dễ dàng. Hãy cẩn thận! :-)


4
Tôi muốn đề nghị xem lại trang mem man. Vải vụn là chính xác. "mem là một tệp thiết bị ký tự là hình ảnh của bộ nhớ chính của máy tính. Ví dụ, nó có thể được sử dụng để kiểm tra (và thậm chí vá) hệ thống. Địa chỉ byte trong mem được hiểu là địa chỉ bộ nhớ vật lý." Và ... "Tập tin kmem giống như mem, ngoại trừ bộ nhớ ảo kernel chứ không phải bộ nhớ vật lý được truy cập."
Ông Shickadance

@Andrew Flanagan: Liên kết của bạn bây giờ cho thấy cách người ta có thể thiết lập đồng hồ bấm giờ bằng lệnh thời gian.
Aiyion.Prime

1
@ Aiyion.Prime. Cảm ơn - chỉ vào một phiên bản archive.org.
Andrew Flanagan

19

/ dev / mem cung cấp quyền truy cập vào bộ nhớ vật lý của hệ thống , không phải bộ nhớ ảo. Không gian địa chỉ ảo của hạt nhân có thể được truy cập bằng cách sử dụng / dev / kmem.

Nó chủ yếu được sử dụng để truy cập các địa chỉ bộ nhớ IO liên quan đến phần cứng ngoại vi, như bộ điều hợp video.


9

sudo cat /dev/urandom > /dev/memsẽ không làm gì cả, vì sudo sẽ nâng cao đặc quyền của mèo nhưng không phải là chuyển hướng. Bạn có thể làm sudo suvà sau đó làm việc trong vỏ gốc hoặc sử dụng
sudo dd if=/dev/urandom of=/dev/mem

/dev/memcung cấp quyền truy cập vào bộ nhớ vật lý, tức là tất cả RAM trong hệ thống, tuy nhiên điều này không có nghĩa là nó cung cấp cho bạn quyền truy cập đọc / ghi đầy đủ vào RAM (xem tùy chọn CONFIG_STRICT_DEVMEM trong tài liệu này ). Cũng lưu ý rằng một số vùng của bộ nhớ vật lý sẽ có các thiết bị khác như bộ nhớ thẻ video, v.v. được ánh xạ lên nó.

Viết một cách mù quáng /dev/memsẽ dẫn đến một hành vi không chắc chắn, đây là một video youtube làm tương tự.


7

Kiểm tra nó với busybox devmem

busybox devmemlà một tiện ích CLI nhỏ mà mmaps /dev/mem.

Bạn có thể lấy nó trong Ubuntu với: sudo apt-get install busybox

Cách sử dụng: đọc 4 byte từ địa chỉ vật lý 0x12345678:

sudo busybox devmem 0x12345678

Viết 0x9abcdef0vào địa chỉ đó:

sudo busybox devmem 0x12345678 w 0x9abcdef0

Nguồn: https://github.com/mirror/busybox/blob/1_27_2/miscutils/devmem.c#L85

MAP_SHARED

Khi mmaps /dev/mem, bạn có thể muốn sử dụng:

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

MAP_SHARED làm cho ghi vào bộ nhớ vật lý ngay lập tức, điều này giúp dễ quan sát hơn và có ý nghĩa hơn đối với ghi thanh ghi phần cứng.

CONFIG_STRICT_DEVMEMnopat

Để sử dụng /dev/memđể xem và sửa đổi RAM thông thường trên kernel v4.9, bạn phải nắm tay:

  • vô hiệu hóa CONFIG_STRICT_DEVMEM(được đặt mặc định trên Ubuntu 17.04)
  • vượt qua nopattùy chọn dòng lệnh kernel cho x86

Cổng IO vẫn hoạt động mà không có.

Xem thêm: https://stackoverflow.com/questions/39134990/mmap-of-dev-mem-fails-with-invalid-argument-for-virt-to-phys-address-but-addre/45127582#45127582

Xóa bộ nhớ cache

Nếu bạn cố ghi vào RAM thay vì đăng ký, bộ nhớ có thể được CPU lưu vào bộ nhớ cache: https://stackoverflow.com/questions/22701352/how-to-flush-the-cpu-cache-for-a-region -of-address-space-in-linux và tôi không thấy một cách rất dễ mang theo / dễ dàng để xóa nó hoặc đánh dấu khu vực là không thể truy cập:

Vì vậy, có lẽ /dev/memkhông thể được sử dụng đáng tin cậy để chuyển bộ đệm cho các thiết bị?

Điều này không thể được quan sát trong QEMU, vì QEMU không mô phỏng bộ nhớ cache.

Làm thế nào để kiểm tra nó

Bây giờ cho phần thú vị. Dưới đây là một vài thiết lập thú vị:

  • Bộ nhớ người dùng
    • phân bổ volatilebiến trên quy trình người dùng
    • lấy địa chỉ vật lý với /proc/<pid>/maps+/proc/<pid>/pagemap
    • địa chỉ vật lý với devmem2và xem phản ứng của quá trình người dùng:
  • Bộ nhớ hạt nhân
    • cấp phát bộ nhớ kernel với kmalloc
    • lấy địa chỉ vật lý với virt_to_physvà chuyển nó trở lại userland
    • sửa đổi địa chỉ vật lý với devmem2
    • truy vấn giá trị từ mô-đun hạt nhân
  • IO mem và thiết bị nền tảng ảo QEMU
    • tạo một thiết bị nền tảng với các địa chỉ thanh ghi vật lý đã biết
    • sử dụng devmem2để ghi vào sổ đăng ký
    • xem printfs đi ra khỏi thiết bị ảo để đáp ứng

5

/ dev / mem theo truyền thống cung cấp quyền truy cập vào toàn bộ không gian địa chỉ vật lý. Điều đó bao gồm ram nhưng nó cũng bao gồm bất kỳ thiết bị IO ánh xạ bộ nhớ.

Nhiều hạt nhân hiện đại sẽ được cấu hình với "CONFIG_STRICT_DEVMEM" chỉ giới hạn / dev / mem đối với các thiết bị IO được ánh xạ bộ nhớ.

Viết rác ngẫu nhiên cho nó là một ý tưởng tồi nhưng chính xác những gì xấu sẽ xảy ra là diifcult để dự đoán. Phần cứng có thể phản ứng theo những cách không thể đoán trước đối với rác ngẫu nhiên, cấu trúc bộ nhớ kernel bị hỏng có thể gây ra hành vi kernel không thể đoán trước. Tốt nhất tôi sẽ mong đợi một sự cố hệ thống, ở tình trạng hỏng dữ liệu tồi tệ nhất hoặc thậm chí là bị chặn phần cứng không phải là vấn đề.

PS lưu ý rằng lệnh của bạn khi chạy như một người dùng bình thường không nên làm bất cứ điều gì, bởi vì sudo chỉ lảng tránh lệnh mèo chứ không phải chuyển hướng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.