2012-09-24 15 views
7

क्या KMALLOC केवल पृष्ठ आकार मेमोरी में आवंटित करता है या यह कम आवंटित कर सकता है? kmalloc आवंटित किए जा सकने वाले आकार क्या हैं? मुझे इसका विवरण कहां मिल सकता है, क्योंकि हर जगह मैंने देखा कि यह वास्तव में यह नहीं कहता कि यह कितनी मेमोरी आवंटित करता है? मैं क्या जानना चाहता हूं कि KMALLOC आवंटित वास्तविक आकार क्या हैं। क्या यह 2 की शक्ति आवंटित करता है? क्या यह सिर्फ कैश से मुक्त वस्तुओं को तैयार करता है जो तैयार है?KMALLOC आकार आवंटन

+2

'kmalloc()' का स्रोत कोड आपको यह सारी जानकारी दे सकता है। आवंटित स्मृति की वास्तविक मात्रा के लिए, [ksize() फ़ंक्शन] देखें (http://lxr.free-electrons.com/ident?i=ksize)। कभी-कभी, 'kmalloc()' वास्तव में एक एप्रोप्रेट कैश में एक मुक्त ऑब्जेक्ट की तलाश करता है, कभी-कभी यह पूरे पृष्ठों को आवंटित करने के लिए रिसॉर्ट करता है। हां, 'kmalloc' किसी पृष्ठ से कम वास्तविक आकार वाले ब्लॉक आवंटित कर सकता है। कार्यान्वयन समय के साथ बदल रहा है, इसलिए किसी अन्य दस्तावेज की तलाश करने के बजाय 'kmalloc()' के स्रोत कोड का विश्लेषण करने के लिए यह और अधिक उपयोगी हो सकता है। – Eugene

उत्तर

10

मेरी समझ निम्नानुसार है: कर्नेल सिस्टम की भौतिक स्मृति से निपट रहा है, जो केवल पृष्ठ के आकार के हिस्सों में उपलब्ध है; इस प्रकार जब आप 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 
2

आप कुछ आम के साथ अपने सिस्टम 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) के असफल आवंटन का एक उदाहरण है।

2

यह सब आपके कर्नेल में उपयोग किए गए आवंटक पर निर्भर करता है। स्लैब, स्लब या स्लॉब। गिरी विन्यास चर निम्न देखें:

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.

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