2012-04-04 10 views
7

मान लें कि हमें पृष्ठ कैश किए गए फ़ाइल के पता स्थान से struct page मिल गया है।किसी संरचित पृष्ठ से संबंधित डेटा का भौतिक पता कैसे प्राप्त करें?

हम इस struct page से 4 केबी डेटा का प्रारंभिक भौतिक पता कैसे प्राप्त कर सकते हैं?

मुझे लगता है कि data पॉइंटर struct sk_buff के अंदर कुछ होना चाहिए, लेकिन मुझे यह नहीं मिला।


जवाब के लिए संपादित करें

धन्यवाद चटाई और llya।

उत्तर देखने के बाद, मुझे लगता है कि पहली समस्या यह पहचानना है कि struct pageZONE_NORMAL या ZONE_HIGHMEM में स्थित है या नहीं।

फ़ाइल I/O के दौरान, जब हमें कैश किए गए पृष्ठ नहीं मिलते हैं, तो हम पहले page_cache_alloc_cold() का उपयोग करके एक नया पृष्ठ आवंटित करेंगे। page_cache_alloc_cold() अंततः alloc_pages() पर कॉल करेगा जो ऐसा लगता है कि यह ZONE_HIGHMEM (जो x86 में है, कर्नेल मेमोरी एरिया PAGE_OFFSET + 896M) से शुरू हो जाएगा।

तो

  • मुझे लगता है कि चटाई के जवाब ZONE_NORMAL
  • मान लीजिए हम kmap() का उपयोग struct पृष्ठ से संबद्ध 4KB डेटा के शुरू भौतिक पता खोजने के लिए पृष्ठों के लिए उपयुक्त है, यह है कि हम चाहिए सही है भौतिक पता खोजने के लिए (unsigned long)(&page)-PAGE_OFFSET का उपयोग करें जहां संरचना को स्वयं स्टोर करता है?

कृपया सही करें।

+0

'mem_map' सरणी में किसी आइटम के रूप में' पृष्ठ' के बारे में सोचें। –

उत्तर

1

आप इस प्रकार कर्नेल स्मृति में एक page मैप करने की आवश्यकता: (। पूर्व के लिए this लिंक देखें) के रूप में वहाँ लिनक्स में एक HighMemory अवधारणा है

void * mapping = kmap_atomic(page, KM_USER0); 
// work with mapping... 
kunmap_atomic(mapping, KM_USER0); 

यह चाल की आवश्यकता है।

यूपीडी: आप गैर-परमाणु संदर्भों में kmap_atomic के बजाय kmap का उपयोग कर सकते हैं।

+1

ओपी का कहना है कि उसके पास पहले से ही 'स्ट्रक्चर पेज' है, उसे उसे बिल्कुल मैप करने की आवश्यकता क्यों है? (बीटीडब्लू: http://lwn.net/Articles/356378/; kmap_atomic के लिए दूसरा तर्क 200 9 के अफवाह में कुछ समय चला गया) – Mat

+0

ठीक है, हाईमेमरी से निपटने के दौरान कुछ बाधाएं हैं। जेनेरिक 32-बिट कर्नेल केवल 1 जी मेमोरी (0xc000000 के बाद) देख सकता है। तो कल्पना करें कि आपके पास 4 जी रैम अधिक है। आप इसे कर्नेल से कैसे एक्सेस करते हैं? –

संबंधित मुद्दे