2014-04-21 10 views
5

मैं xv6, यूनिक्स संस्करण 6.iget() xv6

मेरी पहली हैक के लिए का एक आधुनिक कार्यान्वयन के साथ एक सा खेल रहा हूँ में छिपा क्यों है, मैं साधारण getcwd syscall लागू करने के लिए चाहता था, लेकिन मैं कर रहा हूँ थोड़ा खो गया है कि किस स्तर के अमूर्तता का उपयोग करना चाहिए।

  • क्या मुझे struct file इंटरफ़ेस का उपयोग करना चाहिए?
  • या शायद struct inode इंटरफ़ेस?
  • क्या मायने रखता है, ऐसा लगता है कि इसे पूरी तरह से उपयोगकर्तालैंड में लागू किया जा सकता है।

मैंने इसे struct inode मैनिपुलेशन के साथ कार्यान्वित करना शुरू कर दिया। मेरा बेवकूफ विचार proc->cwd, फिर readi() अपनी दूसरी प्रविष्टि (..) को पुनर्प्राप्त करना था, इसे मेरे पिछले inum को पुनर्प्राप्त करने के लिए स्कैन करें, और इसलिए जब तक मैं रूट को हिट नहीं करता तब तक रिकर्सिव पर।

बहुत प्रदर्शनकारी प्रतीत नहीं होता है, लेकिन यह पहले हैक के लिए उपयुक्त होगा।

मेरे समस्या यह है कि मैं fs.c:iget() जरूरत inum रों मैं dirent रों में मिलता है से एक struct inode पुनः प्राप्त करने के लिए है। मैंने देखा है कि iget()fs.c में स्थिर है और defs.h में घोषित नहीं किया गया है जो मुझे थोड़ा परेशान करता है, लेकिन मुझे कारण नहीं मिल रहा है।

तो, यह मेरा सवाल है। ऐसा क्यों है कि iget() जानबूझकर कर्नेल के बाकी हिस्सों से छिपा हुआ था?

+1

मुझे लगता है कि आपको वास्तव में इस प्रश्न के लिए http://unix.stackexchange.com/ आज़माएं। –

+0

टिप के लिए धन्यवाद। मैंने अभी एक पोस्ट बनाया है, लेकिन मुझे लगता है कि यह मुख्य स्टैक ओवरफ्लो से बहुत कम दौरा किया गया है। – NewbiZ

+1

सच है, लेकिन मुझे संदेह है कि यहां अधिकांश उपयोगकर्ता यूनिक्स के साथ काम कर रहे हैं। अपनी अन्य पोस्ट से लिंक करना: http://unix.stackexchange.com/questions/126261/why-is-iget-hidden-in-xv6 –

उत्तर

1

मुझे लगता है वे सिर्फ व्यावहारिक थे।

iget केवल निर्देशिका मैनिपुलेशन दिनचर्या द्वारा उपयोग किया जाता है। निर्देशिका मैनिपुलेशन दिनचर्या fs.c. में हैं

getcwd कार्यान्वयन के लिए। यदि आप chdir syscall कोड का पालन करते हैं तो यह बेहतर होगा। पथ वहां है। आपको बस इसे संरचना संरचना में एक नए क्षेत्र में स्टोर करने की आवश्यकता है। बेशक, यदि दिया गया पथ सापेक्ष है, तो आपको इसे वर्तमान संग्रहीत पथ में जोड़ना चाहिए।

+0

ठीक है, मैं इसे ले जाऊंगा। और पॉइंटर्स के लिए 'getcwd' के लिए धन्यवाद :) – NewbiZ

-1

आपका प्रश्न करने के लिए मेरी राय जवाब में है:

  1. यह असुरक्षित और गैर सामान्य था। (यदि आप सीधे इनडोड के माध्यम से सीधे फ़ाइल का उपयोग कर सकते हैं, बिना किसी सुरक्षा के, सुरक्षा कैसे संरक्षित की जाएगी? आपको फ़ाइल के लिए अनुमति की आवश्यकता है और साथ ही पैरेंट निर्देशिका के लिए निष्पादन की आवश्यकता है)
  2. यह इनोड द्वारा फ़ाइल तक पहुंचने के लिए अनिवार्य था (उसी इनोड के साथ फ़ाइल कई निर्देशिकाओं में हो सकता है, और इनोड संख्या केवल एफएस के लिए अद्वितीय है)

लेकिन शायद मैंने आपको गलत समझा? कैसे CWD पाने के लिए के बारे में, मैं बहुत कुछ आप समाधान के लिए सूचक तो शायद पसंद करते हैं इस में मदद मिलेगी कर रहा हूँ:

  1. u.u_dent.u_name में क्या रखा जा रहा है? (User.h को करीब से देख ले)

तुम भी इन पर एक नज़र लेने के लिए चाहते हो सकता है:

http://lwn.net/Articles/254486/

Why can't files be manipulated by inode?

how to get directory name by inode value in c?