
अप्रलेखित हार्डवेयर के लिए विलंबता एक्स-रे
MMIO टाइमिंग के लिए एक अन्वेषणात्मक उपकरण — किसी भी भौतिक पते का समय नापें, और विलंबता से हार्डवेयर की पड़ताल करें।

हार्डवेयर रिवर्स-इंजीनियरिंग, हाइपरवाइज़र फ़िंगरप्रिंटिंग, डिवाइस गतिविधि की साइड-चैनलिंग, रजिस्टर विशेषता-निर्धारण, कैलिब्रेट करने, दुर्भावनापूर्ण ट्रिगर, और बेतुके लंबे मशीन निर्देश बनाने के लिए अप्रत्याशित रूप से उपयोगी।
भौतिक मेमोरी का पहला मेगाबाइट शुरू करने के लिए एक आसान उदाहरण है, भले ही इसकी संरचना पहले से ही अच्छी तरह से ज्ञात हो।

विलंबता सीमाएँ हमें बताई गई लेआउट पर निर्भर हुए बिना एड्रेस स्पेस को विभाजित करने देती हैं।
sudo ./mmiotic --start-address 0x0 --end-address 0x100000 --stride 4 --count 20 --quiet-mmap0x9FFFF तक DRAM ~380 cy, फिर
128 KB वीडियो होल, जो 0xB0000 पर दो भागों में बँट जाता है। 0x20000 पर
विचरण में बदलाव नल पेज के लिए अलग पेज वॉक का संकेत दे सकता है।A0000–AFFFF: धीमा और अस्थिर (996 cy, stdev 327), पावर्ड-लेकिन-निष्क्रिय
Radeon को रूट किया गया। B0000–BFFFF: तेज़ और स्थिर (780 cy, stdev 3.2,
ffffffff पढ़ता है), किसी के द्वारा दावा नहीं किया गया। समान दिखने वाला डेटा, लेकिन 100x
विचरण अंतर।C0000–FFFFF: /proc/iomem कहता है "System ROM", लेकिन स्कैन DRAM
विलंबता दिखाता है, फ्लैश गति नहीं — BIOS DRAM में शैडो किया गया है।रूट-कॉम्प्लेक्स कॉन्फ़िग स्पेस (00:00.0, 4 KB) को एक समतल ~675-साइकिल फ़्लोर
के मुकाबले लेटेंसी आउटलायर्स के लिए स्कैन करें:

मेलबॉक्स विलंबता आसपास के डेटा से काफी अधिक है, और डुप्लिकेट स्पाइक्स तथा समतुल्य विचरण हमें कार्यात्मक रूप से समान रजिस्टरों को मिलाने देते हैं।
sudo ./mmiotic --start-address 0xf8000000 --end-address 0xf8001000 --stride 4 --count 2000xe4 (1218 cy, value 80e3110b) और
0xa4 (1199 cy, value deadbeef)। e4 एक प्रलेखित डोरबेल है; a4 है
अप्रलेखित।e4 सार्वजनिक है।deadbeef एक अनइनिशियलाइज़्ड/त्रुटि सेंटिनल की तरह पढ़ा जाता है — वही
मेलबॉक्स, a4 अकार्यान्वित या अमान्य इनपुट दिया गया।सावधानीपूर्वक चुनी गई विलंबताएँ कभी-कभी असामान्य शोषण परिदृश्यों में उपयोग की जा सकती हैं (MCHAMMER, smiiiiiiiiiiiiiiii):

यहाँ एक निष्क्रिय, ड्राइवर-रहित Radeon एक संरेखित 4-बाइट रीड को ~100,000-साइकिल रुकावट में बदल देता है।
sudo ./mmiotic --start-address 0x90e00000 --end-address 0x90e00100 --stride 4 --count 50 — GPU BAR
(0x90e00000, 256 KB) के शीर्ष को स्वीप करें। 0x90e00008 की लागत 110,152 cy; 0x90e00018,
16 बाइट आगे, फिर से तेज़ — 1,523 पर — प्रति-रजिस्टर, प्रति-पेज नहीं।sudo ./mmiotic --start-address 0x90e00000 --end-address 0x90e40000 --stride 4 --count 1 --binary — --binary
बिट-रिवर्सल क्रम में जाँच करता है, इसलिए पूर्ण 256 KB एपर्चर समान रूप से कवर हो जाता है
1,012 प्रोब के बाद, एक सतत 48 KB ब्लॉक का नक्शा बनाता है जहाँ हर रजिस्टर धीमा है।आदर्श रूप से, किसी भौतिक पते को पढ़ना एक अपेक्षाकृत सुरक्षित ऑपरेशन होगा, लेकिन
mmiotic गलती से अपवादों को ढूँढने में विशेष रूप से अच्छा है:

उदाहरण के लिए, उपरोक्त प्लेटफ़ॉर्म पर, 0xdc5003b0 का 1-बाइट रीड — एक अनड्रिवन
Zen 4 iGPU रजिस्टर BAR (Region 5, 0xdc500000, 512 KB) का ऑफसेट 0x3b0
— विश्वसनीय रूप से सिस्टम को रीसेट कर देता है।
sudo ./mmiotic --address 0xdc5003b0 --size 1 --count 1। कोई आउटपुट नहीं; मशीन
रिबूट हो जाती है।0x3ac और 0x3b4 ~3,200 cy पर 00000000 पढ़ते हैं
और हानिरहित हैं।0x3a0–0x3fc का प्रति-dword स्वीप 17 सुरक्षित dwords के साथ मिले-जुले
7 ज़हरीले dwords ढूँढता है।sudo busybox devmem 0xdc5003b0 32 और sudo dd if=/dev/mem bs=1 count=1 skip=$((0xdc5003b0))
मशीन को बंद कर देते हैं यदि आप बिचौलिया छोड़ना चाहते हैं।[!WARNING] कुछ प्लेटफ़ॉर्म रीसेट हो जाएँगे जब विशिष्ट एड्रेस क्षेत्रों की जाँच की जाती है
mmioticद्वारा। सावधान रहें कि आप इसका उपयोग कहाँ करते हैं।
| विकल्प | नाम |
|---|---|
-b/-d/-f/-r | PCI --bus/--device/--function/--register — ECAM आधार के विरुद्ध डिकोड किया गया |
-o, --offset <n> | MMIO आधार से ऑफसेट (B/D/F डिकोड छोड़ता है) |
-A, --address <n> | एक भौतिक पता; क्षेत्र आधार को परोक्ष रूप से सेट करता है |
-a/-z | --start-address/--end-address — एक भौतिक रेंज; --scan का संकेत देता है |
ECAM आधार और आकार ACPI MCFG
(/sys/firmware/acpi/tables/MCFG) से स्वतः पता लगाए जाते हैं। -M, --mmio-base /
-Z, --mmio-size के साथ ओवरराइड करें।
| विकल्प | प्रभाव |
|---|---|
-S, --scan | लक्ष्य क्षेत्र के सभी पतों को स्कैन करें |
-t, --stride <n> | पतों के बीच कदम (डिफ़ॉल्ट: 4) |
-n, --limit <n> | इतने पतों के बाद रुकें |
--binary | बिट-रिवर्सल क्रम में जाँच करें — k जाँचों के बाद रेंज ~range/k ग्रैन्युलैरिटी पर समान कवरेज रखती है (ऊपर चेतावनी देखें) |
-x, --limited | सीमित रजिस्टर रेंज (0x00–0xff बनाम 0x000–0xfff) |
-e, --skip | उन फ़ंक्शनों को छोड़ें जो ऑफसेट 0 पर 0xffffffff पढ़ते हैं (अनुपस्थित डिवाइस) |
-I, --iomem | /proc/iomem में हर गैर-System-RAM टॉप-लेवल क्षेत्र को स्कैन करें |
-R, --ioregion <name> | /proc/iomem के उन क्षेत्रों को स्कैन करें जिनका लेबल <name> से मेल खाता है, किसी भी गहराई पर |
--find-target/--find-longest स्कैनिंग को खोज में बदल देते हैं:
| विकल्प | प्रभाव |
|---|---|
-F, --find-target <s> | ऐसा पता खोजें जिसका एक्सेस समय s सेकंड तक पहुँचे, फिर उसे और ऊपर ले जाने के लिए चौड़ाई बढ़ाएँ (असंरेखित 4b → 8/16/32/64/512b) |
-G, --find-longest | वही खोज, लेकिन पहली हिट पर रुकने के बजाय हर उम्मीदवार को समाप्त करें |
-B, --fallbacks <n> | एस्केलेशन चरण में ले जाए गए उम्मीदवार (डिफ़ॉल्ट: 10) |
| विकल्प | प्रभाव |
|---|---|
-s, --size <n> | प्रति एक्सेस बाइट्स: 1 / 2 / 4 (डिफ़ॉल्ट) / 8 / 16 (XMM) / 32 (YMM) / 64 (ZMM) / 512 (fxrstor)। आकार > 4 स्पेक के बाहर हैं लेकिन परीक्षित हार्डवेयर पर काम करते हैं; AVX चौड़ाई के लिए AVX / AVX-512F आवश्यक है |
-c, --count <n> | प्रति पता नमूने (डिफ़ॉल्ट: 1); न्यूनतम रिपोर्ट किया जाता है |
-L, --lock | लॉक किए गए RMW का समय नापें: lock xadd (आकार 1/2/4/8) या lock cmpxchg16b (आकार 16)। मान को वापस लिखता है |
-g, --gather | एक वेक्टर किए गए गैदर का समय नापें; --size 16/32/64 XMM/YMM/ZMM (AVX-512) चुनता है |
-w, --write-read | एक ऐसे रीड को समयबद्ध करके write विलंबता को कैप्चर करें जिसे पिछले पोस्ट किए गए राइट को देखना चाहिए — नीचे देखें |
-E, --enter (--enter-2, --enter-3) | एक enter $0, $31 से 30 एक्सेस तक का बर्स्ट चलाएँ — नीचे देखें |
-k, --continue | fxrstor फ़ॉल्ट पर, उस नमूने को छोड़ दें और स्कैन करते रहें |