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?
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?
Câu trả lời:
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/mem
là.
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! :-)
/ 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.
sudo cat /dev/urandom > /dev/mem
sẽ 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 su
và sau đó làm việc trong vỏ gốc hoặc sử dụng
sudo dd if=/dev/urandom of=/dev/mem
/dev/mem
cung 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/mem
sẽ 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ự.
Kiểm tra nó với busybox devmem
busybox devmem
là 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 0x9abcdef0
và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_DEVMEM
và nopat
Để 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:
CONFIG_STRICT_DEVMEM
(được đặt mặc định trên Ubuntu 17.04)nopat
tùy chọn dòng lệnh kernel cho x86Cổng IO vẫn hoạt động mà không có.
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/mem
khô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ị:
volatile
biến trên quy trình người dùng/proc/<pid>/maps
+/proc/<pid>/pagemap
devmem2
và xem phản ứng của quá trình người dùng:kmalloc
virt_to_phys
và chuyển nó trở lại userlanddevmem2
devmem2
để ghi vào sổ đăng kýprintf
s đi ra khỏi thiết bị ảo để đáp ứng/ 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.
dd if=/dev/urandom of=/dev/kmem bs=1 count=1 seek=$RANDOM