/ dev / mem คืออะไร


40

สมมุติว่ามันเกี่ยวข้องกับหน่วยความจำบ้าง? สิ่งที่จะ

sudo cat /dev/urandom > /dev/mem

ทำ? ทิ้ง RAM ทั้งหมดหรือไม่ หน่วยความจำเสมือนที่ไม่ใช่เคอร์เนลทั้งหมดหรือไม่ ไม่มีข้อใดถูก?


2
ดูเพิ่มเติมที่:dd if=/dev/urandom of=/dev/kmem bs=1 count=1 seek=$RANDOM
user3490

6
การป้องกันหน่วยความจำไม่ควรหยุดการเข้าถึง RAM ที่มีอยู่จริงสำหรับกระบวนการทั้งหมดยกเว้นกระบวนการที่ได้รับการกำหนดให้กับพื้นที่ของ RAM นั้นหรือไม่ หรือ sudo แทนที่การป้องกันนั้นหรือไม่
Matthew Lock

คำตอบ:


32

มันให้การเข้าถึงหน่วยความจำกายภาพของระบบ

mem(4)หน้าคนอธิบายเพิ่มเติมเกี่ยวกับสิ่งที่/dev/memเป็น

ใช่ - อาจทำให้เกิดปัญหาได้ทุกประเภท การรีบูตควรแก้ไขคุณ แต่สิ่งเลวร้ายสามารถเกิดขึ้นได้ง่ายมาก ระวัง! :-)


4
ฉันขอแนะนำให้ตรวจสอบหน้า man mem ยาจกถูกต้อง "mem เป็นไฟล์อุปกรณ์อักขระที่เป็นรูปภาพของหน่วยความจำหลักของคอมพิวเตอร์ตัวอย่างเช่นมันอาจถูกใช้เพื่อตรวจสอบ (และแม้แต่แพทช์) ระบบที่อยู่ไบต์ใน mem จะถูกตีความเป็นที่อยู่หน่วยความจำกายภาพ" และ ... "ไฟล์ kmem เหมือนกับ mem ยกเว้นว่าหน่วยความจำเสมือนเคอร์เนลแทนที่จะเข้าถึงหน่วยความจำกายภาพ"
Mr. Shickadance

@Andrew Flanagan: ลิงก์ของคุณตอนนี้แสดงให้เห็นว่าอาจมีการตั้งค่านาฬิกาจับเวลาโดยใช้คำสั่ง time
Aiyion.Prime

1
@ Aiyion.Prime ขอบคุณ - ชี้ไปที่เวอร์ชัน archive.org
แอนดรูฟลานาแกน

19

/ dev / mem ให้การเข้าถึงหน่วยความจำกายภาพของระบบไม่ใช่หน่วยความจำเสมือน พื้นที่แอดเดรสเสมือนของเมล็ดสามารถเข้าถึงได้โดยใช้ / dev / kmem

ส่วนใหญ่จะใช้เพื่อเข้าถึงที่อยู่หน่วยความจำ IO ที่เกี่ยวข้องกับฮาร์ดแวร์ต่อพ่วงเช่นอะแดปเตอร์วิดีโอ


9

sudo cat /dev/urandom > /dev/memจะไม่ทำอะไรเลยเพราะ sudo จะยกระดับสิทธิ์แมว แต่ไม่ใช่การเปลี่ยนเส้นทาง คุณสามารถทำได้sudo suและทำงานในรูทเชลล์หรือใช้
sudo dd if=/dev/urandom of=/dev/mem

/dev/memให้การเข้าถึงหน่วยความจำกายภาพเช่น RAM ทั้งหมดในระบบอย่างไรก็ตามนี่ไม่ได้หมายความว่ามันจะช่วยให้คุณเข้าถึง RAM แบบอ่าน / เขียนแบบเต็ม (ดูที่ CONFIG_STRICT_DEVMEM ตัวเลือกในเอกสารนี้ ) นอกจากนี้โปรดทราบว่าบางพื้นที่ของหน่วยความจำกายภาพจะมีอุปกรณ์อื่นเช่นหน่วยความจำการ์ดวิดีโอ ฯลฯ ที่แมปไว้

การเขียนแบบสุ่มไปยัง/dev/memจะส่งผลให้เกิดพฤติกรรมที่ไม่แน่นอนนี่คือวิดีโอ YouTube ที่ทำเช่นเดียวกัน


6

ทดสอบด้วย busybox devmem

busybox devmemเป็นสาธารณูปโภค CLI เล็ก ๆ ที่ /dev/memmmaps

คุณสามารถหาได้จาก Ubuntu ด้วย: 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_DEVMEM และ nopat

ในการใช้/dev/memเพื่อดูและแก้ไข RAM ปกติบนเคอร์เนล v4.9 คุณต้องมีกำปั้น:

  • ปิดการใช้งานCONFIG_STRICT_DEVMEM(ตั้งค่าเริ่มต้นบน Ubuntu 17.04)
  • ผ่านnopatตัวเลือกบรรทัดคำสั่งเคอร์เนลสำหรับ x86

พอร์ต IO ยังคงทำงานโดยไม่มีสิ่งเหล่านั้น

ดูเพิ่มเติมที่: https://stackoverflow.com/questions/39134990/mmap-of-dem-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 ไม่ได้จำลองแคช

วิธีทดสอบ

ตอนนี้เพื่อความสนุกสนาน นี่คือการตั้งค่าที่ยอดเยี่ยม:

  • หน่วยความจำ Userland
    • จัดสรรvolatileตัวแปรให้กับกระบวนการ userland
    • รับที่อยู่จริงด้วย/proc/<pid>/maps+/proc/<pid>/pagemap
    • ที่อยู่จริงด้วยdevmem2และดูกระบวนการของผู้ใช้ตอบสนอง:
  • หน่วยความจำ Kernelland
    • จัดสรรหน่วยความจำเคอร์เนลด้วย kmalloc
    • รับที่อยู่จริงด้วยvirt_to_physแล้วส่งกลับไปยัง userland
    • แก้ไขที่อยู่ทางกายภาพด้วย devmem2
    • สอบถามค่าจากโมดูลเคอร์เนล
  • อุปกรณ์แพลตฟอร์มเสมือน IO mem และ QEMU
    • สร้างอุปกรณ์แพลตฟอร์มที่มีที่อยู่การลงทะเบียนทางกายภาพที่รู้จัก
    • ใช้devmem2เพื่อเขียนลงทะเบียน
    • นาฬิกาprintfออกมาจากอุปกรณ์เสมือนจริงในการตอบสนอง

5

/ dev / mem ให้การเข้าถึงพื้นที่ที่อยู่จริงทั้งหมดตามธรรมเนียม นั่นรวมถึง ram แต่มันยังรวมถึงหน่วยความจำใด ๆ ที่ทำแผนที่อุปกรณ์ IO

เมล็ดที่ทันสมัยหลายแห่งจะถูกกำหนดค่าด้วย "CONFIG_STRICT_DEVMEM" ซึ่ง จำกัด / dev / mem สำหรับอุปกรณ์ที่แมป IO หน่วยความจำเท่านั้น

การเขียนขยะแบบสุ่มไปเป็นความคิดที่ไม่ดี แต่สิ่งที่เลวร้ายที่จะเกิดขึ้นคือการคาดการณ์ล่วงหน้า ฮาร์ดแวร์อาจตอบสนองด้วยวิธีที่ไม่คาดคิดในการสุ่มขยะโครงสร้างหน่วยความจำเคอร์เนลที่เสียหายอาจทำให้เกิดการทำงานของเคอร์เนลที่ไม่สามารถคาดเดาได้ ที่ดีที่สุดฉันคาดว่าจะเกิดความผิดพลาดของระบบที่ความเสียหายของข้อมูลที่เลวร้ายที่สุดหรือแม้กระทั่งการก่ออิฐฮาร์ดแวร์จะไม่ออกจากคำถาม

PS ทราบว่าคำสั่งของคุณเมื่อทำงานในฐานะผู้ใช้ปกติไม่ควรทำอะไรเพราะ sudo จะลบคำสั่ง cat เท่านั้นไม่ใช่การเปลี่ยนเส้นทาง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.