সিস্টেম কলগুলি নিয়মিত ফাংশন কলগুলির মতো পরিচালনা করা হয় না। এটির ব্যবহারকারীর স্থান থেকে কার্নেল স্পেসে স্থানান্তর করতে বিশেষ কোড লাগে, কল সাইটে আপনার প্রোগ্রামের মধ্যে মূলত কিছুটা ইনলাইন এসেম্বলি কোড ইনজেকশন করা হয়। সিস্টেমের কলটি "ধরা" দেয় এমন কর্নেল সাইড কোডটি নিম্ন স্তরের স্টাফও যা আপনার সম্ভবত কমপক্ষে প্রথমে গভীরভাবে বুঝতে হবে না।
ইন include/linux/syscalls.h
আপনার কার্নেল সোর্স ডিরেক্টরিতে অধীনে, আপনি এই খুঁজে পেয়েছেন:
asmlinkage long sys_mkdir(const char __user *pathname, int mode);
তারপরে /usr/include/asm*/unistd.h
, আপনি এটি খুঁজে পাবেন:
#define __NR_mkdir 83
__SYSCALL(__NR_mkdir, sys_mkdir)
এই কোডটি বলছে mkdir(2)
সিস্টেম কল # 83। এর অর্থ হল, সিস্টেম কলগুলি নাম্বার দ্বারা কল করা হয়, ঠিকানার মাধ্যমে নয় আপনার নিজের প্রোগ্রামের মধ্যে কোনও সাধারণ ফাংশন কল হিসাবে বা আপনার প্রোগ্রামের সাথে সংযুক্ত একটি লাইব্রেরির কোনও ফাংশনে। আমি উপরে উল্লিখিত ইনলাইন সমাবেশ গ্লু কোডটি ব্যবহারকারীকে কার্নেল স্পেসে স্থানান্তরিত করার জন্য এটি ব্যবহার করে এটি আপনার পরামিতিগুলি সাথে রাখে।
জিনিসগুলি এখানে কিছুটা অদ্ভুত প্রমাণের আরেকটি প্রমাণ হ'ল সিস্টেম কলের জন্য সর্বদা একটি কঠোর পরামিতি তালিকা থাকে না: open(2)
উদাহরণস্বরূপ, 2 বা 3 পরামিতি নিতে পারে। তার মানে open(2)
হয় ওভারলোড , সি ++, না C- এর একটি বৈশিষ্ট্য, এখনো প্রাপ্ত syscall ইন্টারফেস সি-সামঞ্জস্যপূর্ণ। (এটি সি এর ভ্যারাগস বৈশিষ্ট্য হিসাবে একই জিনিস নয় , যা একটি একক ফাংশনটিকে ভেরিয়েবল সংখ্যক আর্গুমেন্ট নিতে দেয়))
আপনার প্রথম প্রশ্নের উত্তর দেওয়ার জন্য, সেখানে কোনও একক ফাইল mkdir()
নেই। লিনাক্স বিভিন্ন ফাইল সিস্টেম সমর্থন করে এবং প্রত্যেকের নিজস্ব "এমকেডির" অপারেশন রয়েছে। অ্যাবস্ট্রাকশন স্তর যা কার্নেলকে একক সিস্টেমের কলের পিছনে থাকা সমস্ত কিছু আড়াল করতে দেয় তাকে ভিএফএস বলে । সুতরাং, আপনি সম্ভবত fs/namei.c
সাথে খনন শুরু করতে চান vfs_mkdir()
। নিম্ন-স্তরের ফাইল সিস্টেম সংশোধনকারী কোডের আসল বাস্তবায়ন অন্য কোথাও রয়েছে। উদাহরণস্বরূপ, ext4 বাস্তবায়ন বলা হয় ext4_mkdir()
, সংজ্ঞায়িত fs/ext4/namei.c
।
আপনার দ্বিতীয় প্রশ্ন হিসাবে, হ্যাঁ এই সমস্ত নিদর্শন আছে, কিন্তু একক নিয়ম নয়। আপনার যে যা দরকার তা হ'ল কার্নেল কীভাবে কাজ করে তার জন্য কোনও নির্দিষ্ট সিস্টেম কলের সন্ধান করা উচিত কিনা তা সম্পর্কে মোটামুটি বিস্তৃত বোঝা। সমস্ত সিস্টেম কলগুলি ভিএফএসের সাথে জড়িত না, তাই তাদের কার্নেল-সাইড কল চেইনগুলি সমস্ত শুরু হয় না fs/namei.c
। mmap(2)
উদাহরণস্বরূপ, এটি শুরু হয় mm/mmap.c
কারণ এটি কার্নেলের মেমরি পরিচালনার ("মিমি") সাবসিস্টেমের অংশ।
আমি আপনাকে প্রস্তাব দিচ্ছি যে আপনি বোভেট এবং সিসিটি দ্বারা " লিনাক্স কার্নেল বোঝার " একটি অনুলিপি পাবেন ।