আমি কীভাবে লিনাক্স কার্নেল সিস্টেম কল প্রয়োগ করতে পারি?


375

আমি বোঝার চেষ্টা করছি mkdirযে কার্নেল উত্সটি দেখে কোনও ফাংশন কীভাবে বলবে works এটি কার্নেল ইন্টার্নালগুলি বোঝার এবং বিভিন্ন ফাংশনের মধ্যে নেভিগেট করার চেষ্টা। আমি জানি mkdirসংজ্ঞায়িত করা হয় sys/stat.h। আমি প্রোটোটাইপটি পেয়েছি:

/* Create a new directory named PATH, with permission bits MODE.  */
extern int mkdir (__const char *__path, __mode_t __mode)
     __THROW __nonnull ((1));

এখন আমার দেখতে হবে কোন সি ফাইলটিতে এই ফাংশনটি প্রয়োগ করা হয়েছে। উত্স ডিরেক্টরি থেকে, আমি চেষ্টা করেছি

ack "int mkdir"

যা প্রদর্শিত

security/inode.c
103:static int mkdir(struct inode *dir, struct dentry *dentry, int mode)

tools/perf/util/util.c
4:int mkdir_p(char *path, mode_t mode)

tools/perf/util/util.h
259:int mkdir_p(char *path, mode_t mode);

তবে এগুলির কোনওটিরই সংজ্ঞা মেলে না sys/stat.h

প্রশ্নাবলি

  1. কোন ফাইলটির mkdirপ্রয়োগ রয়েছে?
  2. উপরের মত ফাংশন সংজ্ঞা সহ, আমি কীভাবে খুঁজে পেতে পারি যে কোন ফাইলটির প্রয়োগ রয়েছে? কার্নেল সংজ্ঞায়িত এবং প্রয়োগের পদ্ধতিগুলির অনুসরণ করে এমন কোন প্যাটার্ন রয়েছে কি?

দ্রষ্টব্য: আমি কার্নেলটি 2.6.36-rc1 ব্যবহার করছি ।


2
যাইহোক, এটি দেখুন: voinici.ceata.org/~tct/resurse/utlk.pdf
টম ব্রিটো

উত্তর:


386

সিস্টেম কলগুলি নিয়মিত ফাংশন কলগুলির মতো পরিচালনা করা হয় না। এটির ব্যবহারকারীর স্থান থেকে কার্নেল স্পেসে স্থানান্তর করতে বিশেষ কোড লাগে, কল সাইটে আপনার প্রোগ্রামের মধ্যে মূলত কিছুটা ইনলাইন এসেম্বলি কোড ইনজেকশন করা হয়। সিস্টেমের কলটি "ধরা" দেয় এমন কর্নেল সাইড কোডটি নিম্ন স্তরের স্টাফও যা আপনার সম্ভবত কমপক্ষে প্রথমে গভীরভাবে বুঝতে হবে না।

ইন 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.cmmap(2)উদাহরণস্বরূপ, এটি শুরু হয় mm/mmap.cকারণ এটি কার্নেলের মেমরি পরিচালনার ("মিমি") সাবসিস্টেমের অংশ।

আমি আপনাকে প্রস্তাব দিচ্ছি যে আপনি বোভেট এবং সিসিটি দ্বারা " লিনাক্স কার্নেল বোঝার " একটি অনুলিপি পাবেন ।


খুব ভাল উত্তর। আপনার উল্লেখ করা বইটি সম্পর্কে একটি বিষয়, "লিনাক্স কার্নেল বোঝা"। আমার কাছে এটি নেই, তবে মুক্তির তারিখ (2000) এবং টিওসি (ওরিলি সাইটে) আমার কাছে মনে হয় এটি প্রায় 2.2 কার্নেল এবং ২.৪ কার্নেল থেকে কিছু অন্তর্দৃষ্টি রয়েছে (তবে আমি আমার ভুল হতে পারি)। আমার প্রশ্নটি হল: এখানে একটি সমমানের বই রয়েছে যা ২.6 কার্নেলের অভ্যন্তরীণ অংশকে কভার করে? (বা আরও ভাল যে কভার 2.2, 2.4 এবং 2.6)?
দাভালপিআই

2
@ ডেভালপি: যতদূর আমি অবগত, বোভেট এবং সিসিটি এখনও এই বিষয়ের সেরা একক বই is যখন আমার এটিতে টু টু ডেট উপাদান সরবরাহ করা দরকার তখন আমি Documentationযে কার্নেলের সাথে কাজ করছি তার জন্য উত্স গাছের উপ-ডিরেক্টরিতে খনন করতে যাই ।
ওয়ারেন ইয়াং

1
প্রকৃতপক্ষে উন্মুক্ত (2) একটি ভার্সেস ফাংশন। এটিকে কল করার জন্য কেবল দুটি উপায় রয়েছে, সুতরাং ম্যানপেজটি এটি এভাবে নথি করে দেয়, আসল প্রোটোটাইপটিতে ...কোনও ভারার্গস ফাংশন হিসাবে রয়েছে। অবশ্যই, এটি libc পর্যায়ে প্রয়োগ করা হয়। তৃতীয় প্যারামিটার ব্যবহার না করা হলে এটি কার্নেল এবিআই-তে 0 বা একটি আবর্জনার মান পাস করতে পারে।
র্যান্ডম 832

"এটি এমন কিছু যা আপনার বোঝার দরকার নেই"। এই ধরণের বাক্যটি স্ট্যাকেক্সচেঞ্জ নেটওয়ার্কে কোথাও না পাওয়া গেলে বিশ্ব আরও ভাল জায়গা হবে।
পেটর

84

এটি সম্ভবত আপনার প্রশ্নের সরাসরি উত্তর দেয় না, তবে straceঅন্তর্নিহিত সিস্টেম কলগুলি, কার্যত, এমনকি সর্বাধিক সরল শেল কমান্ডের জন্য করা বোঝার চেষ্টা করার সময় আমি খুব শীতল বলে মনে করেছি । যেমন

strace -o trace.txt mkdir mynewdir

কমান্ডটির জন্য সিস্টেম কলগুলি mkdir mynewdirআপনার দেখার আনন্দের জন্য trace.txt এ ছুঁড়ে ফেলা হবে।


5
+1 ঝরঝরে কৌশল! আমি এর আগে ব্যবহার করিনি
ডেভিড ওনিল

3
আরও ভাল, আউটপুট ফাইলটি ট্রেস.স্টেস করুন এবং এটি ভিআইএম-এ খুলুন। ভিআইএম এটিকে হাইলাইট করবে, এটি পড়া খুব সহজ করে তুলবে।
মার্চিন

55

লিনাক্স কার্নেল উত্স পড়ার জন্য একটি ভাল জায়গা হ'ল লিনাক্স ক্রস-রেফারেন্স (এলএক্সআর) ¹ ¹ অনুসন্ধানগুলি নিখরচায় পাঠ্য অনুসন্ধানের ফলাফলের পাশাপাশি টাইপ করা ম্যাচগুলি (ফাংশন প্রোটোটাইপস, ভেরিয়েবল ডিক্লেয়ারেশন ইত্যাদি) ফেরত দেয়, সুতরাং এটি নিখরচায় গ্রেপ (এবং আরও দ্রুত) এর চেয়েও দুর্দান্ত।

এলএক্সআর প্রিপ্রসেসর সংজ্ঞাগুলি প্রসারিত করে না। সিস্টেম কলগুলিতে পুরো জায়গা জুড়ে প্রিপ্রসেসর দ্বারা তাদের নাম ম্যাঙ্গেল করা হয়েছে। তবে, বেশিরভাগ (সমস্ত?) সিস্টেম কল SYSCALL_DEFINExম্যাক্রোগুলির একটি পরিবারের সাথে সংজ্ঞায়িত হয় । যেহেতু mkdirদুটি যুক্তি নেয়, তাই অনুসন্ধান সিস্কাল ঘোষণারSYSCALL_DEFINE2(mkdir দিকে পরিচালিত করে :mkdir

SYSCALL_DEFINE2(mkdir, const char __user *, pathname, int, mode)
{
    return sys_mkdirat(AT_FDCWD, pathname, mode);
}

ঠিক আছে, এর sys_mkdiratঅর্থ এটি mkdiratসিস্টস্কল, সুতরাং এটিতে ক্লিক করা আপনাকে কেবলমাত্র ঘোষণার দিকে নিয়ে যায় include/linux/syscalls.hতবে সংজ্ঞাটি ঠিক উপরে।

mkdiratকল করার প্রধান কাজ হ'ল vfs_mkdir(ভিএফএস হল জেনেরিক ফাইল সিস্টেম স্তর)। এটিতে ক্লিঙ্কিং দুটি অনুসন্ধানের ফলাফল দেখায়: এর মধ্যে ঘোষণা এবং include/linux/fs.hউপরের কয়েকটি লাইন definition এর মূল কাজ vfs_mkdirফাইলসিস্টেম-নির্দিষ্ট বাস্তবায়ন ডাকতে হল: dir->i_op->mkdir। কিভাবে খুঁজতে এই বাস্তবায়িত হয়, আপনি পৃথক ফাইলসিস্টেম বাস্তবায়ন চালু করতে হবে, আর কোন দৃঢ়-এবং ফাস্ট নিয়ম - এটি এমনকি কার্নেল গাছ বাহিরে একটি মডিউল হতে পারে।

X এলএক্সআর একটি ইনডেক্সিং প্রোগ্রাম। বেশ কয়েকটি ওয়েবসাইট রয়েছে যা জ্ঞাত সংস্করণগুলির সামান্য ভিন্ন সেট এবং কিছুটা আলাদা ওয়েব ইন্টারফেস সহ এলএক্সআরকে একটি ইন্টারফেস সরবরাহ করে। তাদের আসা-যাওয়ার প্রবণতা রয়েছে, সুতরাং আপনি যদি ব্যবহার করেন তবে তা যদি না পাওয়া যায় তবে অন্যটি খুঁজে পেতে "লিনাক্স ক্রস-রেফারেন্স" এর জন্য একটি ওয়েব অনুসন্ধান করুন।


এটি হ'ল এক সংস্থান। দুর্দান্ত উত্তর।
স্টেলেডোগ

Linux.no এর লিঙ্কে "অভ্যন্তরীণ সার্ভার ত্রুটি" ।
ফ্রেড্রিক গাউস

@ ফ্রেড্রিকগৌস কিছুক্ষণের জন্য lxr.linux.no এটি এলএক্সআর-এর সর্বোত্তম ইন্টারফেস ছিল তবে এটির ঘন ঘন ডাউনটাইম ছিল। এখন আমি মনে করি এটি ভাল হয়েছে। আমি অন্য লিঙ্কআর ইন্টারফেসের প্রথম লিঙ্কটি প্রতিস্থাপন করেছি।
গিলস

21

সিস্টেম কলগুলি সাধারণত SYSCALL_DEFINEx()ম্যাক্রোতে আবৃত থাকে , একারণে কোনও সাধারণ grepতাদের খুঁজে পায় না:

fs/namei.c:SYSCALL_DEFINE2(mkdir, const char __user *, pathname, int, mode)

ম্যাক্রো প্রসারিত হওয়ার পরে চূড়ান্ত ফাংশনের নামটি শেষ হয়ে যায় sys_mkdirSYSCALL_DEFINEx()ম্যাক্রো কোড প্রতিটি প্রাপ্ত syscall সংজ্ঞা থাকতে হবে ট্রেসিং মত boilerplate, কিছু যোগ করা হয়েছে।


17

দ্রষ্টব্য: .h ফাইলটি ফাংশনটি সংজ্ঞায়িত করে না । এটি .h ফাইলটিতে ঘোষণা করা হয়েছে এবং অন্য কোথাও সংজ্ঞায়িত (প্রয়োগ করা হয়েছে)। এটি সংযোজকটিকে ফাংশনের স্বাক্ষর সম্পর্কে তথ্য অন্তর্ভুক্ত করতে (প্রোটোটাইপ) আর্গুমেন্টের ধরণের চেক করার অনুমতি দেয় এবং আপনার কোডের কোনও কলিং প্রসঙ্গে রিটার্নের ধরণের সাথে মেলে।

সি তে সাধারণত .h (হেডার) ফাইলগুলি ফাংশন ঘোষণা করতে এবং ম্যাক্রো সংজ্ঞায়িত করতে ব্যবহৃত হয়।

mkdirবিশেষত একটি সিস্টেম কল। সিস্টেম কলের চারপাশে একটি জিএনইউ লিবিসি র‌্যাপার থাকতে পারে (প্রায় নিশ্চিতভাবেই এটি বাস্তবে)। mkdirকার্নেল উত্স এবং বিশেষত সিস্টেম কলগুলি অনুসন্ধান করে সত্যিকারের কার্নেল প্রয়োগটি পাওয়া যাবে।

মনে রাখবেন যে প্রতিটি ফাইল সিস্টেমের জন্য ডিরেক্টরি তৈরির কোডের এক প্রকারের প্রয়োগও থাকবে। ভিএফএস (ভার্চুয়াল ফাইল সিস্টেম) স্তরটি একটি সাধারণ এপিআই সরবরাহ করে যা সিস্টেম কল স্তর কল করতে পারে। প্রতিটি ফাইল সিস্টেমে ভিএফএস স্তরটি কল করার জন্য ফাংশনগুলি নিবন্ধ করতে হবে। ডিরেক্টরিগুলি কীভাবে কাঠামোগত হয় তার জন্য এটি বিভিন্ন ফাইল সিস্টেমগুলি তাদের নিজস্ব শব্দার্থক প্রয়োগ করতে সহায়তা করে (উদাহরণস্বরূপ যদি তারা নির্দিষ্ট এন্ট্রিগুলির সন্ধান আরও দক্ষ করে তুলতে কোনও ধরণের হ্যাশিং স্কিম ব্যবহার করে সংরক্ষণ করা হয়)। আমি এটি উল্লেখ করেছি কারণ আপনি যদি লিনাক্স কার্নেল উত্স ট্রিটি সন্ধান করেন তবে আপনি এই ফাইল-সিস্টেম নির্দিষ্ট ডিরেক্টরি তৈরির কার্যাদি সন্ধান করতে পারেন।


8

আপনি যে প্রয়োগগুলি খুঁজে পেয়েছেন তার মধ্যে কোনও সিএস / স্ট্যাটেইচ প্রোটোটাইপের সাথে মেলে না কেন এই হেডার ফাইলটির সাথে অন্তর্ভুক্ত বিবরণীর অনুসন্ধান করা আরও সফল হবে?


1
বাস্তবায়ন (সিএস / স্ট্যাটাসে বর্ণিত হিসাবে) ইউজারল্যান্ড এবং লিবিকের ব্যবসা। কার্নেলের অভ্যন্তরীণ জিনিসগুলি (এটি কীভাবে সত্যি হয়) হ'ল কার্নেল অভ্যন্তরীণ ব্যবসা। সমস্ত কার্নেল হ্যাকারদের যত্নের জন্য, অভ্যন্তরীণ ফাংশনটিকে জাইজি বলা যেতে পারে এবং 5 টি পরামিতি নিতে পারে। ইউজারল্যান্ড কলটি নেওয়া, কার্নেল অন্তর্ভুক্তির জন্য যা কিছু প্রয়োজন তা এটিকে অনুবাদ করা, শিপ অফ করে কোনও ফলাফল সংগ্রহ করা লিবিসির কাজ।
ভোনব্র্যান্ড

6

নিম্ন-স্তরের কার্নেল উত্স কোডটি নীচে শিকার করার জন্য বিভিন্ন কৌশল বর্ণনা করে এমন একটি দম্পতি সত্যিই দুর্দান্ত ব্লগ পোস্ট রয়েছে are


12
দয়া করে ব্লগ বা ফোরামে কেবল লিঙ্কগুলি পোস্ট করবেন না, তাদের বিষয়বস্তুর সংক্ষিপ্তসার করুন যাতে পাঠকরা তারা কী করছেন তা দেখতে এবং সাইটগুলি অদৃশ্য হয়ে গেলে কিছু বাকী থাকতে পারে। এছাড়াও, আপনার প্রথম লিঙ্কটি libc সম্পর্কিত, যা এই প্রশ্নের জন্য অফ-বিষয়।
গিলস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.