मुझे पता है कि copy_to_user
/copy_from_user
, get_user
/put_user
फ़ंक्शंस इस उद्देश्य के लिए हैं।लिनक्स कर्नेल से उपयोगकर्ता स्पेस मेमोरी तक कैसे पहुंचे?
मेरा सवाल यह है कि, उपयोगकर्ता स्पेस पता/पॉइंटर दिया गया है, मैं सामान्य रूप से कर्नेल से पते द्वारा इंगित डेटा तक कैसे पहुंच सकता हूं?
मैं कल्पना कर सकता हूं कि पहले मुझे यह सुनिश्चित करना होगा कि युक्त पृष्ठ भौतिक स्मृति (डिस्क में की बजाय) में होना चाहिए।
अगला कदम क्या है? क्या मैं *p
का उपयोग कर सकता हूं, जहां p
कुछ उपयोगकर्ता स्थान डेटा को इंगित करने वाला पॉइंटर है, सीधे डेटा को संदर्भित करने के लिए?
या क्या मुझे कर्नेल वर्चुअल एड्रेस स्पेस में युक्त भौतिक पृष्ठ फ्रेम को मैप करने के लिए पहले kmap
का उपयोग करना होगा? क्यूं कर?
अच्छा बिंदु और कोड तर्क अच्छा है। लेकिन मुझे लगता है कि कुछ हैश टेबल या समान डेटा संरचना है, जिसे वर्चुअल एड्रेस दिया गया है, आपको भौतिक पृष्ठ को तुरंत ढूंढने में मदद करता है। एक दोष है: kaddr = __va (पैडर); यह पंक्ति केवल तभी काम करती है जब पैडर कम स्मृति में रहता है, है ना? – Infinite
पैड्रर का अर्थ भौतिक पता है, इसलिए, हमेशा स्मृति में मौजूद होता है। कैडर का मतलब कर्नेल पता है। लिनक्स कर्नेल परिभाषित में '# परिभाषित __va (x) ((शून्य *) ((हस्ताक्षर किए गए लंबे) (x) + PAGE_OFFSET)) '। कर्नेल पता मेमोरी मैपिंग जटिल नहीं है, केवल एक PAGE_OFFSET है। (X86 मोड पर 0xC0000000 होना चाहिए)। पता पाने का दूसरा तरीका है। उपयोगकर्ता जानकारी एप्लिकेशन पृष्ठ जानकारी प्राप्त करने के लिए/proc//पेजमैप के साथ कर्नेल पते तक पहुंच सकता है। अगर पीएफएन प्राप्त हो सकता है, तो यह कर्नेल पता भी प्राप्त कर सकता है। –
richliu