2010-06-17 13 views
13

लिनक्स 2.6.30+ के तहत उपयोगकर्ता स्पेस से (गैर-साझा) mmap के पृष्ठों की गंदगी का उपयोग किया जा सकता है? प्लेटफार्म-विशिष्ट हैक्स और क्लुज का स्वागत है।क्या उपयोगकर्ता क्षेत्र से एमएमएपी के पृष्ठों की गंदगी मिल सकती है?

आदर्श रूप में, मैं mmaped क्षेत्र के बिट्स, एक प्रति पृष्ठ (4kB?) की एक सरणी की तलाश कर रहा हूं, जो सेट किया गया है यदि उस पृष्ठ को एमएमएपी के बाद से लिखा गया है।

(मैं वाकिफ हूँ, कि इस प्रक्रिया लेखन कर इस जानकारी का ट्रैक रखने सकता है - लेकिन यह करता है, तो गिरी यह वैसे भी कर रही है ऐसा करने के लिए मूर्खतापूर्ण लगता है।)

धन्यवाद,

क्रिस।

उत्तर

10

देखें/proc/*/पेजमैप और/proc/kpageflags इंटरफेस देखें। सबसे पहले आपको एक पते के लिए पीएफएन बताता है, दूसरा आपको पीएफएन को गंदे बिट बताता है।

एफएस/proc/task_mmu.c, दस्तावेज़ीकरण/वीएम/पेजमैप.txt, दस्तावेज़ीकरण/वीएम/पेज-प्रकार.c देखें।

2

generic_writepages और balance_dirty_pages_ratelimited_nr गंदे पृष्ठों से संबंधित कर्नेल (2.6.20) में प्रवेश बिंदु प्रतीत होता है। मुझे उम्मीद है कि वे 2.6.30+ में भी काम करेंगे। दिलचस्प सवाल, क्या मैं पूछ सकता हूं कि आप क्या लिख ​​रहे हैं जिसके लिए पृष्ठों पर इस तरह के नियंत्रण की आवश्यकता है?

+0

धन्यवाद, मुझे generic_writepages का उपयोग करने पर एक नज़र डालेंगी। मैं सिर्फ यह सोच रहा था कि एमएमएपी को मोटे अनाज वाले psuedo एसटीएम सिस्टम के रूप में दुरुपयोग किया जा सकता है या नहीं। ऐसा हो सकता है कि मौजूदा एसटीएम सिस्टम पहले से ही ऐसा करते हैं, मुझे एक मिनट मिलने पर मुझे कुछ कोड से गुजरना होगा। – fadedbee

+0

ये उपयोगकर्ता स्थान के ठीक सामने नहीं आये हैं? –

4

पारंपरिक समाधान केवल पढ़ने के लिए mprotect है, और फिर sigsegv को संभालने और लिखने की अनुमति देने के लिए reprotecting से पहले गंदा चिह्नित करें। हमने इस उद्देश्य के लिए बहुत समय पहले ऑब्जेक्टस्टोर में ऐसा किया था।

+0

कृपया इस उद्देश्य के लिए एसआईजीएसईजीवी से कैसे संभालें और पुनर्प्राप्त करें इसका उदाहरण दें। –

+0

'सिग्नेक्शन' और 'mprotect' का कौन सा हिस्सा आपके लिए मुश्किल लगता है? – bmargulies

+1

ओपी जानता है कि यह इस तरह से किया जा सकता है, लेकिन वह इस ओवरहेड से बचना चाहता है। – pythonic

0

यदि आपकी बिट्स की सरणी काफी छोटी है, तो शायद आप इंटेल पर डीबग रजिस्टरों का उपयोग कर सकते हैं (हालांकि मुझे यकीन नहीं है कि यह लिनक्स पर कैसे किया जाता है)।

1

यह डेटा लगातार पुराना होगा - यह संभव है कि पेज को आपकी प्रक्रिया के बाद पेज गंदा हो जाने के बाद लिखा जा सके।

उस ने कहा, टोन तरीका इसे एक-पेज के हिस्सों में मैप करना है, फिर यह देखने के लिए /proc/pid/smaps देखें कि भाग गंदे हैं या नहीं, यह कहा जा सकता है कि कर्नेल पृष्ठों को विलीन कर देता है।

दुर्भाग्यवश, चूंकि पेज टेबल उपयोगकर्ता स्थान प्रक्रिया के लिए दृश्यमान नहीं हैं, यह किसी भी प्रकार के कर्नेल पैच के बिना आप सबसे अच्छा कर सकते हैं।