2009-11-08 10 views
9

के साथ संरचना मैंने कुछ प्रकार के चरित्र डिवाइस को लागू किया है और मुझे copy_ from_user फ़ंक्शन के साथ सहायता चाहिए।लिनक्स कर्नेल: copy_from_user - पॉइंटर्स

मैं एक संरचना है:

struct my_struct{ 

int a; 

int *b; 
}; 

मैं उपयोगकर्ता अंतरिक्ष में यह प्रारंभ और 'लिखने' समारोह का उपयोग कर मेरे चार डिवाइस के लिए my_struct सूचक गुजरती हैं। कर्नेल के स्पेस कैरेक्टर डिवाइस 'लिखें' फ़ंक्शन में मैंने इसे * char से इस तरह की संरचना में डाला। मैं kmalloc का उपयोग कर एक संरचना के लिए कुछ स्मृति आवंटित करता हूं और इसमें copy_from_user करता हूं।

यह सरल 'int ए' के ​​लिए ठीक है, लेकिन यह बी मान के केवल सूचक (पता) की प्रतिलिपि बनाता है, बी द्वारा इंगित मूल्य नहीं, इसलिए अब मैं कर्नेल स्पेस में हूं और मैं एक पॉइंटर के साथ काम कर रहा हूं जो इंगित करता है एक उपयोगकर्ता अंतरिक्ष स्मृति। क्या यह गलत है और मुझे सीधे उपयोगकर्ता स्पेस पॉइंटर तक नहीं पहुंचना चाहिए और मुझे अपनी संरचना में प्रत्येक पॉइंटर copy_from_user करना है और फिर copy_to_user फ़ंक्शन का उपयोग करके "पॉइंट" फ़ंक्शन में प्रत्येक पॉइंटर को कॉपी करना होगा?

उत्तर

6

आप अपने अनुमान में सही हैं। यदि आपको *b मान का उपयोग करने की आवश्यकता है, तो आपको उपयोगकर्ता प्रक्रिया में इसे वापस अपडेट करने के लिए copy_from_user (और copy_to_user) का उपयोग करने की आवश्यकता होगी।

+2

मैं यह भी इंगित करता हूं कि मैं किसी भी सिस्कोल या इओक्ट्स के बारे में नहीं सोच सकता जो उनके अंदर पॉइंटर्स के साथ structs लेते हैं। यहां तक ​​कि जिनके पास तार हैं, उनके पास संरचना में वर्णों की एक सरणी होगी। तथ्य यह है कि प्रत्येक सूचक सदस्य के लिए ऐसा करने के लिए कोड लिखना बेहद परेशान है, उसके साथ कुछ करने के लिए कुछ हो सकता है। :-) – asveikau

+0

@asveikau: 'readv()' और 'writev()'? – caf

13

आपको हमेशा copy_from_user का उपयोग करना चाहिए और कर्नेल स्पेस से उपयोगकर्ता स्पेस मेमोरी एक्सेस करने के समान ही, आपको पॉइंटर कैसे मिला है, इस पर ध्यान दिए बिना। चूंकि b उपयोगकर्ता स्पेस मेमोरी के लिए एक सूचक है, इसलिए आपको इसे एक्सेस करने के लिए copy_from_user का उपयोग करना होगा।

  1. वे उपयोगकर्ता अंतरिक्ष में यकीन है कि सूचक अंक बनाने के लिए और कर्नेल स्थान नहीं:

    इन कार्यों के लिए दो महत्वपूर्ण अतिरिक्त कार्य करने के। इस चेक के बिना, उपयोगकर्ता सुरक्षा प्रोग्राम सामान्य सुरक्षा को छोड़कर, कर्नेल मेमोरी को पढ़ने या लिखने में सक्षम हो सकते हैं।

  2. वे पेज दोषों को सही तरीके से संभालते हैं। आम तौर पर कर्नेल मोड में एक पेज गलती के परिणामस्वरूप ओओपीएस या आतंक हो जाएगा - copy_*_user कार्यों के परिवार में एक विशेष ओवरराइड होता है जो पीएफ हैंडलर को बताता है कि सब ठीक है, और गलती सामान्य रूप से संभाली जानी चाहिए; और यदि घटना आईओ द्वारा संतुष्ट नहीं हो सकती है (यानी, आमतौर पर SIGSEGV या SIGBUS) का कारण बनता है, तो इसके बजाय एक त्रुटि कोड लौटाएं ताकि उनके कॉलर -EFAULT के साथ उपयोगकर्ता स्थान पर लौटने से पहले कोई आवश्यक सफाई कर सकें।
संबंधित मुद्दे