क्या KMALLOC केवल पृष्ठ आकार मेमोरी में आवंटित करता है या यह कम आवंटित कर सकता है? kmalloc आवंटित किए जा सकने वाले आकार क्या हैं? मुझे इसका विवरण कहां मिल सकता है, क्योंकि हर जगह मैंने देखा कि यह वास्तव में यह नहीं कहता कि यह कितनी मेमोरी आवंटित करता है? मैं क्या जानना चाहता हूं कि KMALLOC आवंटित वास्तविक आकार क्या हैं। क्या यह 2 की शक्ति आवंटित करता है? क्या यह सिर्फ कैश से मुक्त वस्तुओं को तैयार करता है जो तैयार है?KMALLOC आकार आवंटन
उत्तर
मेरी समझ निम्नानुसार है: कर्नेल सिस्टम की भौतिक स्मृति से निपट रहा है, जो केवल पृष्ठ के आकार के हिस्सों में उपलब्ध है; इस प्रकार जब आप kmalloc()
पर कॉल करते हैं तो आपको केवल कुछ निश्चित पूर्वनिर्धारित, निश्चित-आकार बाइट सरणी मिलेंगे।
वास्तविक स्मृति जो आप वापस प्राप्त करते हैं वह सिस्टम के आर्किटेक्चर पर निर्भर है, लेकिन kmalloc को संभालने वाला सबसे छोटा आवंटन 32 या 64 बाइट जितना बड़ा हो सकता है। आप कॉल से वापस kmalloc()
कम से कम जितनी मेमोरी (आमतौर पर अधिक) के लिए पूछे जाएंगे। आमतौर पर आप नहीं मिलेगा और अधिक से अधिक 128 KB (फिर से, वास्तुकला निर्भर)
पृष्ठ आकार (बाइट्स में) प्राप्त करने के लिए अपने सिस्टम से आप आदेश पर अमल कर सकते हैं:
getconf PAGESIZE
या
getconf PAGE_SIZE
पर अधिकतम पृष्ठ आकार यह जानकारी /usr/src/linux/include/linux/slab.h
में है और हाँ, पृष्ठ आकार आम तौर पर 2 की शक्तियों रहे हैं, लेकिन फिर से, आप प्राप्त करने के लिए नहीं जा रहे हैं ठीक ठीक आप क्या पूछते हैं, लेकिन थोड़ा और।
आप इस तरह की कुछ कोड का उपयोग कर सकते हैं:
void * stuff;
stuff = kmalloc(1,GFP_KERNEL);
printk("I got: %zu bytes of memory\n", ksize(stuff));
kfree(stuff);
आबंटित स्मृति की वास्तविक राशि दिखाने के लिए:
[90144.702588] I got: 32 bytes of memory
आप कुछ आम के साथ अपने सिस्टम kmalloc()
पूर्णांक द्वारा इस्तेमाल किया आकार देख सकते हैं:
cat /proc/slabinfo | grep kmalloc
इस पर विचार करने से अधिक महत्वपूर्ण है कि kmalloc क्या कर सकता है किसी पृष्ठ से कम आवंटित करना सवाल यह है कि क्या यह किसी पृष्ठ से अधिक आवंटित कर सकता है: यदि आप परमाणु संदर्भ में kmalloc()
पर कॉल कर रहे हैं (GFP_ATOMIC
ध्वज के साथ), तो यह स्मृति में संगत पृष्ठों को खोजने में बहुत कठिन प्रयास नहीं कर सकता , इसलिए यदि आपकी याददाश्त बहुत खंडित है, और आपके आवंटन का क्रम उच्च (allocation size → pagesize*2^(allocation order))
है, आवंटन विफल हो सकता है। तो, परमाणु संदर्भ में, बड़े आवंटन विफल होने की संभावना है।
this other SO question about maximum AF_UNIX datagram size पर आदेश 7 (512 Kb) के असफल आवंटन का एक उदाहरण है।
यह सब आपके कर्नेल में उपयोग किए गए आवंटक पर निर्भर करता है। स्लैब, स्लब या स्लॉब। गिरी विन्यास चर निम्न देखें:
CONFIG_SLAB
CONFIG_SLUB
CONFIG_SLOB
उपरोक्त सभी allocators MAX_ORDER और PAGE_SHIFT का उपयोग kmalloc() की अधिकतम सीमा तय करने के लिए
सबसे बड़ा kmalloc आकार स्लैब allocators द्वारा समर्थित 32 मेगाबाइट है (2^25) या अधिकतम आवंटित पृष्ठ ऑर्डर यदि यह 32 एमबी से कम है।
#define KMALLOC_SHIFT_HIGH ((MAX_ORDER + PAGE_SHIFT - 1) <= 25 ? \ (MAX_ORDER + PAGE_SHIFT - 1) : 25)
#define KMALLOC_SHIFT_MAX KMALLOC_SHIFT_HIGH
एसएलयूबी सीधे ऑर्डर -1 पृष्ठ (PAGE_SIZE * 2) में फ़िट करने के अनुरोध आवंटित करता है। पृष्ठ आवंटक को बड़े अनुरोध पास किए जाते हैं।
#define KMALLOC_SHIFT_HIGH (PAGE_SHIFT + 1)
#define KMALLOC_SHIFT_MAX (MAX_ORDER + PAGE_SHIFT)
एसएलओबी पृष्ठ आवंटक को एक पृष्ठ से बड़े सभी अनुरोधों को पास करता है। कोई kmalloc सरणी आवश्यक नहीं है क्योंकि विभिन्न आकारों की वस्तुओं को उसी पृष्ठ से आवंटित किया जा सकता है। kmalloc() द्वारा
#define KMALLOC_SHIFT_HIGH PAGE_SHIFT
#define KMALLOC_SHIFT_MAX 30
अधिकतम allocatable आकार kmalloc से
#define KMALLOC_MAX_SIZE (1UL << KMALLOC_SHIFT_MAX)
न्यूनतम allocatable आकार() स्लैब के लिए
#define KMALLOC_MIN_SIZE (1 << KMALLOC_SHIFT_LOW)
डिफ़ॉल्ट KMALLOC_SHIFT_LOW 5 है, और slub के लिए और यह मूर्ख 3.
- 1. सबसे बड़ा मेमोरी मानचित्र आवंटन आकार?
- 2. जावा आवंटन स्मृति आवंटन
- 3. आवंटन
- 4. mmap: उपयोगकर्ता स्थान में मैपिंग kmalloc
- 5. स्टेटिक आवंटन बनाम गतिशील आवंटन बनाम स्वचालित आवंटन
- 6. सरणी आवंटन
- 7. शून्य आकार के सरणी पास करें, आवंटन सहेजें?
- 8. द्विआधारी से स्थैतिक आवंटन के आकार को कैसे ढूंढें?
- 9. शून्य आकार के सरणी आवंटन का क्या अर्थ है?
- 10. मेमोरी आवंटन सुझाव
- 11. जावा मेमोरी आवंटन संरेखण
- 12. kmalloc() kcalloc() vmalloc() और kzalloc() के बीच अंतर क्या हैं?
- 13. मेमोरी आवंटन
- 14. आवंटन malloc
- 15. सी-मेमोरी आवंटन भ्रम
- 16. आईआईएस एसएमटीपी: भंडारण आवंटन प्रतिक्रिया
- 17. kmalloc झंडे में जीएफपी का अर्थ क्या है?
- 18. बाह्य आवंटन बहुत बड़ा
- 19. वालग्रिंड कहते हैं, "आवंटन ढेर," मैं कहता हूं "ढेर आवंटन"
- 20. डिज़ाइन क्लास एकत्रीकरण - स्टैक आवंटन बनाम गतिशील स्मृति आवंटन
- 21. पीआईएमपीएल और स्टैक आवंटन
- 22. सीमा आवंटन सेट
- 23. डेल्फी ऑब्जेक्ट मेमोरी आवंटन
- 24. विधानसभा स्मृति आवंटन
- 25. थ्रेड-विशिष्ट ढेर आवंटन
- 26. स्थैतिक वर्ग आवंटन
- 27. गतिशील स्मृति आवंटन सवाल
- 28. आरक्षण आवंटन एल्गोरिदम
- 29. पीडीएफ मेमोरी आवंटन (CGPDFDocumentRef)
- 30. सी ++ मेमोरी आवंटन मुद्दे
'kmalloc()' का स्रोत कोड आपको यह सारी जानकारी दे सकता है। आवंटित स्मृति की वास्तविक मात्रा के लिए, [ksize() फ़ंक्शन] देखें (http://lxr.free-electrons.com/ident?i=ksize)। कभी-कभी, 'kmalloc()' वास्तव में एक एप्रोप्रेट कैश में एक मुक्त ऑब्जेक्ट की तलाश करता है, कभी-कभी यह पूरे पृष्ठों को आवंटित करने के लिए रिसॉर्ट करता है। हां, 'kmalloc' किसी पृष्ठ से कम वास्तविक आकार वाले ब्लॉक आवंटित कर सकता है। कार्यान्वयन समय के साथ बदल रहा है, इसलिए किसी अन्य दस्तावेज की तलाश करने के बजाय 'kmalloc()' के स्रोत कोड का विश्लेषण करने के लिए यह और अधिक उपयोगी हो सकता है। – Eugene