2012-09-04 15 views
10

में devm_kzalloc() और kzalloc() के बीच क्या अंतर है, मुझे डिवाइस ड्राइवर प्रोग्रामम में devm_kzalloc() और kzalloc() मिला है। लेकिन मुझे नहीं पता कि इन कार्यों का उपयोग कब/कहाँ करें। क्या कोई भी इन कार्यों और उनके उपयोग के महत्व को निर्दिष्ट कर सकता है।लिनक्स ड्राइवर प्रोग्रामिंग

+1

हाय, हम devm_kzalloc() तो यह स्मृति मुक्त करने की कोई जरूरत (का उपयोग करते हैं रेफरी द्वारा किया जाता है: [कड़ी] (http://docs.blackfin.uclinux.org/kernel/generated/device-drivers/re162.html))। तो क्या हम प्रोग्राम में devm_kzalloc() के साथ सभी kzalloc() फ़ंक्शंस को प्रतिस्थापित कर सकते हैं क्योंकि हम गतिशील रूप से आवंटित स्मृति को मुक्त करने के बोझ को कम कर सकते हैं ..? –

+0

मेरा मानना ​​है कि [devres.txt] (https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/driver-model/devres.txt) अधिकतर प्रश्नों का उत्तर देगा । 'Devres.txt' आपके लिनक्स संस्करण (2.6.31+ से) के लिए चालू होना चाहिए। –

उत्तर

16

kzalloc()kmalloc() जैसे कर्नेल मेमोरी आवंटित करता है, लेकिन यह आवंटित स्मृति को भी शून्य-प्रारंभ करता है। devm_kzalloc() प्रबंधित किया गया है kzalloc()। प्रबंधित कार्यों के साथ आवंटित स्मृति डिवाइस से जुड़ा हुआ है। जब डिवाइस को सिस्टम से अलग किया जाता है या डिवाइस के लिए ड्राइवर को अनलोड किया जाता है, तो वह स्मृति स्वचालित रूप से मुक्त हो जाती है। यदि डिवाइस के लिए एकाधिक प्रबंधित संसाधन (मेमोरी या कुछ अन्य संसाधन) आवंटित किए गए थे, तो अंतिम आवंटित संसाधन पहले मुक्त हो जाता है।

प्रबंधित संसाधन किसी भी बिंदु पर प्रारंभिक विफलता के लिए और डिवाइस हटाने के बाद सफल प्रारंभिकता के लिए चालक के सही संचालन को सुनिश्चित करने के लिए बहुत उपयोगी होते हैं।

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

kzalloc() के साथ आवंटित स्मृति को kfree() से मुक्त किया जाना चाहिए। devm_kzalloc() के साथ आवंटित स्मृति स्वचालित रूप से मुक्त हो जाती है। इसे devm_kfree() से मुक्त किया जा सकता है, लेकिन यह आमतौर पर एक संकेत है कि प्रबंधित स्मृति आवंटन कार्य के लिए उपयुक्त नहीं है।

+1

यह उल्लेख करना वाकई लायक है कि प्रबंधित संसाधनों के लिए उपयोग केस '-> जांच()' या समान कॉलबैक है। यह बुरा होगा, ** बुरा विचार ** कॉलबैक में उनका उपयोग करने के लिए '-> खुला() '।उपयोग में फ़ाइल संचालन के मामले में वस्तुओं के जीवनकाल के साथ भी एक समस्या है। – 0andriy

+0

मैंने इसका उल्लेख करने के लिए अपना जवाब विस्तारित किया है, धन्यवाद। यदि प्रबंधित संसाधनों को खुले() में से बचने के अन्य कारण हैं, तो कृपया एक लिंक पोस्ट करें। – proski

1

सरल शब्दों में devm_kzalloc() और kzalloc() दोनों डिवाइस ड्राइवर में स्मृति आवंटन के लिए उपयोग किए जाते हैं, लेकिन अंतर यह है कि अगर आप उस स्मृति को मुक्त करने के लिए उस स्मृति को मुक्त करने के लिए kzalloc() द्वारा स्मृति आवंटित करते हैं तो उस स्मृति चालक के जीवन चक्र समाप्त हो गया है या जब इसे कर्नेल से अनलोड किया जाता है लेकिन यदि आप devm_kzalloc() के साथ ऐसा करते हैं तो आपको स्मृति को खाली करने के बारे में चिंता करने की आवश्यकता नहीं है, वह स्मृति डिवाइस लाइब्रेरी द्वारा स्वचालित रूप से मुक्त हो जाती है।

उन दोनों बिल्कुल वही बात करता है लेकिन मुक्त कराने स्मृति के छोटे से भूमि के ऊपर devm_kzalloc का उपयोग करके kzalloc

static int pxa3xx_u2d_probe(struct platform_device *pdev) 
{ 
    int err; 
    u2d = kzalloc(sizeof(struct pxa3xx_u2d_ulpi), GFP_KERNEL);  1 
    if (!u2d) 
     return -ENOMEM; 
    u2d->clk = clk_get(&pdev->dev, NULL); 
    if (IS_ERR(u2d->clk)) { 
     err = PTR_ERR(u2d->clk);         2 
     goto err_free_mem; 
    } 
... 
    return 0; 
err_free_mem: 
    kfree(u2d); 
    return err; 
} 
static int pxa3xx_u2d_remove(struct platform_device *pdev) 
{ 
    clk_put(u2d->clk);    
    kfree(u2d);              3 
    return 0; 
} 

का उपयोग कर में से प्रोग्रामर

, उदाहरण देकर पहला उदाहरण से आप के बारे में बताएं से जारी है इस उदाहरण आप इस funtion pxa3xx_u2d_remove(), kfree (u2d) (3 लाइन द्वारा इंगित) में नि: शुल्क स्मृति u2d द्वारा आवंटित करने के लिए वहाँ अब devm_kzalloc()

उपयोग करके एक ही कोड देख सकते हैं
static int pxa3xx_u2d_probe(struct platform_device *pdev) 
{ 
    int err; 
    u2d = devm_kzalloc(&pdev->dev, sizeof(struct pxa3xx_u2d_ulpi), GFP_KERNEL); 
    if (!u2d) 
     return -ENOMEM; 
    u2d->clk = clk_get(&pdev->dev, NULL); 
    if (IS_ERR(u2d->clk)) { 
     err = PTR_ERR(u2d->clk); 
     goto err_free_mem; 
    } 
... 
    return 0; 
err_free_mem: 
    return err; 
} 
static int pxa3xx_u2d_remove(struct platform_device *pdev) 
{ 
    clk_put(u2d->clk); 
    return 0; 
} 

कोई kfree() मुक्त कार्य करने के लिए नहीं है, क्योंकि एक ही devm_kzalloc()

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