আমার ভেঙ্গে যাক।
আপনি যখন একটি এক্সিকিউটেবল চালনা করেন, সিস্টেম কলগুলির একটি ক্রম কার্যকর করা হয়, উল্লেখযোগ্যভাবে fork()
এবং execve()
:
fork()
কলিং প্রক্রিয়াটির একটি শিশু প্রক্রিয়া তৈরি করে, যা (বেশিরভাগ ক্ষেত্রে) পিতামাতার একটি সঠিক অনুলিপি, উভয় এখনও একই নির্বাহযোগ্য (কপি অন-লিখিত মেমরি পৃষ্ঠা ব্যবহার করে, তাই এটি দক্ষ) running এটি দু'বার ফিরে আসে: পিতামাতায়, এটি শিশু পিআইডি প্রদান করে। সন্তানের মধ্যে, এটি 0 ফিরে আসে ly সাধারণত, শিশু প্রক্রিয়া কলগুলি এখনই সম্পাদন করা হয়:
execve()
আর্গুমেন্ট হিসাবে এক্সিকিউটেবলের জন্য একটি পুরো পথ নেয় এবং এক্সিকিউটেবলের সাথে কলিং প্রক্রিয়াটি প্রতিস্থাপন করে। এই সময়ে সদ্য নির্মিত প্রক্রিয়াটি তার নিজস্ব ভার্চুয়াল ঠিকানার স্থান অর্থাৎ ভার্চুয়াল মেমরি পায় এবং তার প্রবেশ বিন্দুতে (এক্সপ্লোরেশন প্ল্যাটফর্মটি এবিআইয়ের নতুন প্রক্রিয়াগুলির জন্য বিধি দ্বারা নির্দিষ্ট একটি রাজ্যে) কার্যকর হয় execution
এই মুহুর্তে, কার্নেলের ইএলএফ লোডার এক্সিকিউটেবলের টেক্সট এবং ডেটা বিভাগগুলিকে মেমরির মধ্যে ম্যাপ করেছে , যেমন এটি mmap()
সিস্টেম কলটি ব্যবহার করেছে (যথাক্রমে ভাগ করে পঠনযোগ্য এবং ব্যক্তিগত পঠন-রাইটিং ম্যাপিংগুলি সহ)। বিএসএসকে এমএপ_অ্যানওয়াইমোয়াসের মতো ম্যাপ করা হয়েছে। (বিটিডাব্লু, সরলতার জন্য আমি এখানে গতিশীল সংযোগ উপেক্ষা করছি: ডায়ামিক লিঙ্কার open()
এবং mmap()
গুলি সমস্ত ডায়নামিক লাইব্রেরি মূল এক্সিকিউটেবলের এন্ট্রি পয়েন্টে ঝাঁপ দেওয়ার আগে।)
নতুন-এক্সিকিউটিভ () এডের নিজস্ব কোড চালানো শুরু করার আগে কেবল কয়েকটি পৃষ্ঠাই ডিস্ক থেকে মেমরিতে লোড হয়। পরবর্তী পৃষ্ঠাগুলি চাহিদা অনুসারে চাহিদাযুক্ত পেজ করা হয় , যদি / যখন প্রক্রিয়াটি তার ভার্চুয়াল ঠিকানা জায়গার সেই অংশগুলিকে স্পর্শ করে। (ব্যবহারকারী-স্পেস কোড সম্পাদন করা শুরু করার আগে কোড বা ডেটাগুলির কোনও পৃষ্ঠা প্রাক লোড করা কেবল একটি পারফরম্যান্স অপটিমাইজেশন))
এক্সিকিউটেবল ফাইলটি নিম্ন স্তরের ইনোড দ্বারা চিহ্নিত করা হয়। ফাইলটি নির্বাহ করা শুরু হওয়ার পরে, কার্নেল ফাইলের নাম দ্বারা নয়, ফাইলের নাম দ্বারা নয়, ওপেন ফাইল বর্ণনাকারী বা ফাইল-ব্যাকযুক্ত মেমরি ম্যাপিংয়ের মতো ফাইল সামগ্রীটি অক্ষত রাখে। সুতরাং আপনি এক্সিকিউটেবলকে সহজেই ফাইল সিস্টেমের অন্য কোনও জায়গায় বা একটি ভিন্ন ফাইল সিস্টেমে সরিয়ে নিতে পারেন। পার্শ্ব নোট হিসাবে, প্রক্রিয়াটির বিভিন্ন স্ট্যাটাস পরীক্ষা করতে আপনি /proc/PID
(প্রদত্ত প্রক্রিয়াটির প্রসেস আইডি) ডিরেক্টরিতে উঁকি দিতে পারেন । আপনি এমনকি এক্সিকিউটেবল ফাইলটি খুলতে পারেন এমনকি /proc/PID/exe
এটি ডিস্ক থেকে লিঙ্কযুক্ত করা হয়েছে।
এখন চলন্ত খনন করা যাক:
আপনি যখন কোনও ফাইল ফাইলকে একই ফাইল সিস্টেমের মধ্যে সরিয়ে rename()
আনেন তখন এক্সিকিউট হওয়া সিস্টেম কলটি হ'ল ফাইলটি অন্য নামে পুনরায় নামকরণ করে, ফাইলের ইনোড একই থাকে।
যেখানে দুটি ভিন্ন ফাইল সিস্টেমের মধ্যে দুটি জিনিস ঘটে:
নতুন অবস্থানে, প্রথম কপি ফাইল বিষয়বস্তু read()
এবংwrite()
এর পরে, ফাইলটি উত্স ডিরেক্টরি থেকে আনলিংক করা হয়েছে unlink()
এবং সম্ভবত ফাইলটি নতুন ফাইল সিস্টেমে একটি নতুন ইনোড পাবে।
rm
প্রকৃতপক্ষে unlink()
ডিরেক্টরি ট্রি থেকে প্রদত্ত ফাইলটি সবেমাত্র করা হচ্ছে, সুতরাং ডিরেক্টরিতে লেখার অনুমতি থাকা আপনাকে সেই ডিরেক্টরি থেকে কোনও ফাইল সরিয়ে নেওয়ার পর্যাপ্ত অধিকার পাবে।
এখন মজা করার জন্য, কল করুন যখন আপনি দুটি ফাইলসাইটের মধ্যে ফাইলগুলি সরিয়ে রাখছেন এবং unlink()
উত্স থেকে আপনার কাছে ফাইলের অনুমতি নেই ?
ঠিক আছে, ফাইলটি প্রথমে ( read()
, write()
) গন্তব্যে অনুলিপি করা unlink()
হবে এবং তারপরে অপর্যাপ্ত অনুমতির কারণে ব্যর্থ হবে। সুতরাং, ফাইল উভয় ফাইল সিস্টেমে থাকবে !!