কার্নেল চলায় সিস্টেম কল সমর্থিত


9

বর্তমানে লিনাক্স কার্নেল চালিত দ্বারা সমর্থিত সিস্টেম কলগুলির সংখ্যা বা তালিকা পাওয়ার কোনও উপায় আছে কি? সুতরাং আমি চলমান কার্নেলের সিস্কল টেবিলটি 'পড়ার' উপায় খুঁজে পেতে চাই।

উত্তর:


15

ফাইলটি /proc/kallsymsচলমান কার্নেলের সমস্ত চিহ্নকে তালিকাভুক্ত করে। কনভেনশন দ্বারা, সিস্টেম কলগুলির একটি নাম থাকে যা দিয়ে শুরু হয় sys_। একটি 64-বিট সিস্টেমে, 32-বিট প্রোগ্রামগুলির জন্য সিস্টেম কলগুলির একটি নাম থাকে যা দিয়ে শুরু হয় sys32_। কড়া কথায় বলতে গেলে, এটি সিস্টেম কল নয়, অভ্যন্তরীণ কার্নেল ফাংশনগুলি তালিকাভুক্ত করে, তবে আমি মনে করি যে এই চিঠিপত্রটি কাজ করে (প্রতিটি সিস্টেম কল কাজ করার জন্য অভ্যন্তরীণ কার্নেল ফাংশনটি আহ্বান করে, এবং আমি মনে করি নামটি সর্বদা sys_প্রিপেন্ডেড সহ সিস্টেম কলের নাম) )।

</proc/kallsyms sed -n 's/.* sys_//p'

এটি সাধারণত দরকারী তথ্য নয়, কারণ সিস্টেম কলগুলি খুব ধীরে ধীরে পরিবর্তিত হয়। ঐচ্ছিক উপাদান যেমন ডিভাইস বিদ্যমান ব্যবস্থার কল পরিপ্রেক্ষিতে কার্যকারিতা প্রদান, সাধারণ বৈশিষ্ট্যগুলি ব্যবহার (সঙ্গে ioctl যখন readএবং write, ফাইল সিস্টেম, সকেট, ইত্যাদি সমর্থিত syscalls তালিকা নির্ধারণ আপনি বৈশিষ্ট্যগুলি সম্পর্কে কিছু বলব না এটিকে কেটে না) যে সিস্টেম সমর্থন করে। অন্যান্য অভ্যন্তরীণ ফাংশন নামগুলি হ'ল সাহায্য করবে না কারণ এগুলি খুব দ্রুত পরিবর্তিত হয়: ফাংশনটির নাম যা একটি কার্নেল সংস্করণে কিছু বৈশিষ্ট্য প্রয়োগ করে পরবর্তী সংস্করণে পরিবর্তিত হতে পারে।


+1 টি। এখন আমি এটাই বোঝাতে চেয়েছি যখন "আমি উত্তর দেওয়ার চেয়ে কাউকে আরও অভিজ্ঞতার সাথে ছেড়ে দেব" । তদতিরিক্ত, যেহেতু /proc/kallsymsঅন্য ফাইলগুলির মতো কারসাজি করা যায় তাই এটি প্রোগ্রামে এটি ব্যবহার করা বেশ সহজ হয়ে যায়।
জন ডব্লিউ এইচ স্মিথ

2
@ জোহানডাব্লুএইচএসমিথ “অন্য যে কোনও ফাইলের মতো চালিত হতে পারে”… কার্নেল এএসএলআর সিস্টেমে এই ফাইলটি কেবল রুট দ্বারা পঠনযোগ্য হওয়া উচিত।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

7

টি এল; ডিআর

এই উত্তরটি লেখার সময় আমি নতুন বিকল্পগুলি সন্ধান করতে থাকি, সুতরাং আমি কেবল তাদের প্রত্যেকটি সম্পর্কে কিছুটা বিশদ লিখেছি এবং কিছু পরিসংখ্যান করেছি। মূলত: আপনি হয়:

  • গিলসের উত্তরটি পড়ুন, যা এটি করার জন্য একটি পরিষ্কার এবং দ্রুত উপায় সরবরাহ করে (নির্ভর করে /proc)।
  • ডকুমেন্টেশন সংস্থান ব্যবহার করুন।
  • আপনার সিস্টেমের সি হেডার ফাইলগুলি ব্যবহার করুন।
  • কার্নেল উত্স কোড নিজেই ব্যবহার করুন।
  • /sysডিরেক্টরি ব্যবহার করুন ।

গণিত করার পরে, আমি /sysফাইল সিস্টেমটি ব্যবহার করে (আমার বিকল্পগুলির মধ্যে) প্রস্তাব দেব , যেহেতু এটি সিস্টেম কলের সংখ্যার দিক থেকে সেরা ফলাফল বলে মনে হয়। আপনি যদি অন্য কৌশল সম্পর্কে পড়তে না চান তবে আপনি সরাসরি বিভাগে যেতে পারেন jump

ডকুমেন্টেশন সংস্থান ব্যবহার করে

আপনি যদি aproposসেগুলির কিছু মিস করতে পারেন তবে আপনি বিভাগ 2 (সিস্টেম কল) এর সাথে সম্পর্কিত সমস্ত ম্যানপেজগুলি তালিকাভুক্ত করতে ব্যবহার করতে পারেন :

$ apropos -s2 . | awk '{print $1}' | column

columnআপনি অভিনব কলামযুক্ত আউটপুট না চাইলে সরান ।

আমি এটি কেবল সন্ধান করেছি, তবে সিস্টেম কল সম্পর্কে একটি লিনাক্স ম্যান পৃষ্ঠা রয়েছে এবং আপনি এটিতে বেশিরভাগ সন্ধান করতে সক্ষম হবেন।

$ man syscalls

আমি এই দুটি ওয়েবসাইট জুড়ে এসেছি যা আকর্ষণীয় হতে পারে:

শিরোনাম ফাইল ব্যবহার করে

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

আমি কেবল আমার /usr/includeডিরেক্টরিটি ব্রাউজ করেছি এবং grepকয়েকটি জিনিস দিয়েছি : আপনি নিম্নলিখিত ডিরেক্টরিগুলি আকর্ষণীয় দেখতে পাচ্ছেন। আপনার আর্কিটেকচার এবং বিতরণের উপর নির্ভর করে তাদের মধ্যে কিছু আপনার মেশিনে আলাদা হতে পারে তবে আমি নিশ্চিত যে আপনি সেগুলি মানিয়ে নিতে সক্ষম হবেন।

  • , / Usr / অন্তর্ভুক্ত / Linux
  • , / Usr / অন্তর্ভুক্ত /, x86_64-লিনাক্স-GNU
  • , / Usr / অন্তর্ভুক্ত / sys
  • , / Usr / অন্তর্ভুক্ত / এ এস এম-জেনেরিক

এই ফাইলে ফাংশন সংজ্ঞা অনুসন্ধান করে, আপনি অনেকগুলি সিস্টেমে কল পাবেন, যদিও সেগুলিতে সেখানে সম্পূর্ণরূপে সংজ্ঞায়িত করা হবে না। আমি grepএই ডিরেক্টরিগুলিতে কয়েকটি গুলি চালিয়েছি এবং আমি কিছু সিস্টেম কলের উল্লেখ পেতে সক্ষম হয়েছি। এখানে একটি উদাহরণ:

$ grep 'sys_exit' /usr/include -R
asm-generic/unistd.h:__SYSCALL(__NR_exit, sys_exit)

সুতরাং, আমি অনুমান করছি যে এর মধ্যে কয়েকটি খুঁজে পাওয়ার অন্য উপায়টি হ'ল:

$ egrep '^__SYSCALL' /usr/include -Rh | awk '{print $2}' | tr -d ')'

কার্নেলের উত্স কোড এবং এটির সিস্টেল টেবিল ব্যবহার করা

আর একটি সমাধান হ'ল কার্নেল উত্স কোডটি নিজেরাই ব্যবহার করুন (এবং কেবল শিরোনামই নয়!), এবং দক্ষতার সাথে এটি অনুসন্ধানের জন্য কোনও উপায় খুঁজে বের করুন। যেহেতু কার্নেল 303395ac3bf3e2cb488435537d416bc840438fcb প্রতিশ্রুতিবদ্ধ তাই আপনি এটি আগের চেয়ে সামান্য সহজ মনে করতে পারেন। এখানে 3.13 (যা আমার কর্নেল) এর উদাহরণ রয়েছে:

$ wget https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/plain/arch/x86/syscalls/syscall_64.tbl?id=refs/tags/v3.13 -O syscall_64.tbl

এখন যেহেতু আপনি আসল সিস্টেমে টেবিল পেয়েছেন, কেবল এটি ব্রাউজ করুন:

$ while read line; do awk '! /#/ {print $3}'; done < syscall_64.tbl

আপনি একটি উপায় খুঁজে বের করতে পারে, ব্যবহার unameএবং archডাউনলোড করতে tblথেকে ফাইল সোজা git.kernel.org , আপনার চলমান কার্নেল সংস্করণ ও স্থাপত্য উপর ভিত্তি করে।

/sysফাইল সিস্টেম ব্যবহার করে

গিলসের উত্তর আমাকে কিছুটা অনুপ্রেরণা দিয়েছিল এবং আপনি সেই সিস্টেম কলগুলি ভিতরে খুঁজে পেতে পারেন /sys/kernel/debug/tracing/events/syscalls। এই ডিরেক্টরিটি সিস্টেমে প্রতিটি সিস্টেম কল ব্যবহার নিরীক্ষণ করতে ব্যবহৃত হয়। প্রতিটি সিস্টেমে এতে দুটি ডিরেক্টরি থাকে:

  • sys_enter_ [প্রাপ্ত syscall]
  • sys_exit_ [প্রাপ্ত syscall]

অতএব, ব্যবহার ls, grepএবং cut...

$ ls /sys/kernel/debug/tracing/events/syscalls | grep 'sys_enter' | cut -d'_' -f3

পরিসংখ্যান

আমার সিস্টেমে:

  • ম্যান পেজ ব্যবহার করে 440 সিস্টেম কল প্রকাশিত হয়েছে।
  • grep-ইডার __SYSCALLফাইলগুলির জন্য 212 সিস্টেম কল প্রকাশিত হয়েছিল।
  • কার্নেল উত্স থেকে সিস্কল টেবিলটি পড়ে 346 সিস্টেম কল প্রকাশিত হয়েছিল।
  • /sysপ্রকাশিত 290 সিস্টেম কল ব্যবহার করে ।

এখন, আমি যদি সবকিছু একত্রিত করি ...

$ apropos -s2 . | awk '{print $1}' > system_calls.txt
$ egrep '^__SYSCALL' /usr/include -Rh | awk '{print $2}' | tr -d ')' >> system_calls.txt
$ while read line; do awk '! /#/ {print $3}'; done < syscall_64.tbl >> system_calls.txt
$ ls /sys/kernel/debug/tracing/events/syscalls | grep 'sys_enter' | cut -d'_' -f3 >> system_calls.txt

$ sort < system_calls.txt | uniq | wc -l
707

সেখানে আমরা, 707 সিস্টেম কল! অবশ্যই, এই সংখ্যাটি একটি "সিস্টেম কল" এর একটি নমনীয় সংজ্ঞাটি প্রতিফলিত করে, যেহেতু 3.13 কেবল 274 সিস্টেম কল সরবরাহ করবে (পড়ার /sysবিষয়টি নিকটতম সমাধান বলে মনে হচ্ছে)।


আমি ম্যান পেজগুলিতে কোন সিস্টেম কল ডকুমেন্টেড আছে তা আবিষ্কার না করে সিস্টেম কল টেবিলটি কোনও উপায়ে 'পড়া' শর্তে আরও একটি উপায় সন্ধান করছি
Swair

আমি মনে করি না কার্নেল তার সিস্টেমে একটি তালিকা রাখে, কমপক্ষে স্ট্রিংয়ের তালিকা হিসাবে নয়। আমি আমার উত্তর সম্পাদনা করেছি। যদি এটি করার কোনও আসল উপায় থাকে তবে আমি আমার চেয়ে বেশি অভিজ্ঞতার সাথে কাউকে উত্তর দেব let)
জন ডাব্লু এইচ স্মিথ

তাই আমি এই নিয়ে ভাবছিলাম যে আমি কার্নেলে একটি সিস্টেম কল যুক্ত করার পরে এটি ব্যবহার করার চেষ্টা করছিলাম "ফাংশন বাস্তবায়িত হয়নি", এবং আমি ভাবছিলাম যে বর্তমান কার্নেলের জন্য সিস্কেল টেবিল পাওয়ার কোনও উপায় আছে কিনা? যখন আমি '# মেক ইনস্টল' করি, গ্রাব আপডেট করি এবং একটি নতুন কার্নেল শুরু করি, নতুন কর্নেলটি কী পদক্ষেপে প্রাসঙ্গিকভাবে নতুন সিস্টেম কলযুক্ত ফাইলগুলি অন্তর্ভুক্ত করে?
স্বায়ার

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

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

1

সমস্ত উত্তর ঠিক আছে।

আপনি যদি একটি নির্দিষ্ট সিস্টেম কল নাম খুঁজছেন:

$ cat /proc/kallsyms | grep <sys_call_name>

আপনি যদি সমস্ত সিস্টেম কলের তালিকা খুঁজছেন:

$ cat /proc/kallsyms
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.