উত্তর:
ফাইলটি /proc/kallsyms
চলমান কার্নেলের সমস্ত চিহ্নকে তালিকাভুক্ত করে। কনভেনশন দ্বারা, সিস্টেম কলগুলির একটি নাম থাকে যা দিয়ে শুরু হয় sys_
। একটি 64-বিট সিস্টেমে, 32-বিট প্রোগ্রামগুলির জন্য সিস্টেম কলগুলির একটি নাম থাকে যা দিয়ে শুরু হয় sys32_
। কড়া কথায় বলতে গেলে, এটি সিস্টেম কল নয়, অভ্যন্তরীণ কার্নেল ফাংশনগুলি তালিকাভুক্ত করে, তবে আমি মনে করি যে এই চিঠিপত্রটি কাজ করে (প্রতিটি সিস্টেম কল কাজ করার জন্য অভ্যন্তরীণ কার্নেল ফাংশনটি আহ্বান করে, এবং আমি মনে করি নামটি সর্বদা sys_
প্রিপেন্ডেড সহ সিস্টেম কলের নাম) )।
</proc/kallsyms sed -n 's/.* sys_//p'
এটি সাধারণত দরকারী তথ্য নয়, কারণ সিস্টেম কলগুলি খুব ধীরে ধীরে পরিবর্তিত হয়। ঐচ্ছিক উপাদান যেমন ডিভাইস বিদ্যমান ব্যবস্থার কল পরিপ্রেক্ষিতে কার্যকারিতা প্রদান, সাধারণ বৈশিষ্ট্যগুলি ব্যবহার (সঙ্গে ioctl যখন read
এবং write
, ফাইল সিস্টেম, সকেট, ইত্যাদি সমর্থিত syscalls তালিকা নির্ধারণ আপনি বৈশিষ্ট্যগুলি সম্পর্কে কিছু বলব না এটিকে কেটে না) যে সিস্টেম সমর্থন করে। অন্যান্য অভ্যন্তরীণ ফাংশন নামগুলি হ'ল সাহায্য করবে না কারণ এগুলি খুব দ্রুত পরিবর্তিত হয়: ফাংশনটির নাম যা একটি কার্নেল সংস্করণে কিছু বৈশিষ্ট্য প্রয়োগ করে পরবর্তী সংস্করণে পরিবর্তিত হতে পারে।
এই উত্তরটি লেখার সময় আমি নতুন বিকল্পগুলি সন্ধান করতে থাকি, সুতরাং আমি কেবল তাদের প্রত্যেকটি সম্পর্কে কিছুটা বিশদ লিখেছি এবং কিছু পরিসংখ্যান করেছি। মূলত: আপনি হয়:
/proc
)।/sys
ডিরেক্টরি ব্যবহার করুন ।গণিত করার পরে, আমি /sys
ফাইল সিস্টেমটি ব্যবহার করে (আমার বিকল্পগুলির মধ্যে) প্রস্তাব দেব , যেহেতু এটি সিস্টেম কলের সংখ্যার দিক থেকে সেরা ফলাফল বলে মনে হয়। আপনি যদি অন্য কৌশল সম্পর্কে পড়তে না চান তবে আপনি সরাসরি বিভাগে যেতে পারেন jump
আপনি যদি apropos
সেগুলির কিছু মিস করতে পারেন তবে আপনি বিভাগ 2 (সিস্টেম কল) এর সাথে সম্পর্কিত সমস্ত ম্যানপেজগুলি তালিকাভুক্ত করতে ব্যবহার করতে পারেন :
$ apropos -s2 . | awk '{print $1}' | column
column
আপনি অভিনব কলামযুক্ত আউটপুট না চাইলে সরান ।
আমি এটি কেবল সন্ধান করেছি, তবে সিস্টেম কল সম্পর্কে একটি লিনাক্স ম্যান পৃষ্ঠা রয়েছে এবং আপনি এটিতে বেশিরভাগ সন্ধান করতে সক্ষম হবেন।
$ man syscalls
আমি এই দুটি ওয়েবসাইট জুড়ে এসেছি যা আকর্ষণীয় হতে পারে:
সম্পাদনা: এখন, যখন কম্পিউটার প্রোগ্রামগুলি উপলব্ধ তা নির্ধারণ করে প্রোগ্রামের মাধ্যমে (বা কমপক্ষে, ডকুমেন্টেড বৈশিষ্ট্যগুলির উপর নির্ভর না করে) আসে, তখন আমি ভয় করি যে কার্নেল কমপক্ষে এর আকারের অধীনে নয়, তার সিস্টেম কলগুলির একটি টেবিল রাখে না afraid স্ট্রিংগুলির একটি তালিকা (যেমন আপনি সম্ভবত তাদের হেরফের করতে পারেন)। এই স্তরে, আমরা ফাংশন নামগুলির চেয়ে ফাংশন ঠিকানা এবং পয়েন্টার সম্পর্কে আরও কথা বলছি।
আমি কেবল আমার /usr/include
ডিরেক্টরিটি ব্রাউজ করেছি এবং grep
কয়েকটি জিনিস দিয়েছি : আপনি নিম্নলিখিত ডিরেক্টরিগুলি আকর্ষণীয় দেখতে পাচ্ছেন। আপনার আর্কিটেকচার এবং বিতরণের উপর নির্ভর করে তাদের মধ্যে কিছু আপনার মেশিনে আলাদা হতে পারে তবে আমি নিশ্চিত যে আপনি সেগুলি মানিয়ে নিতে সক্ষম হবেন।
এই ফাইলে ফাংশন সংজ্ঞা অনুসন্ধান করে, আপনি অনেকগুলি সিস্টেমে কল পাবেন, যদিও সেগুলিতে সেখানে সম্পূর্ণরূপে সংজ্ঞায়িত করা হবে না। আমি 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
। এই ডিরেক্টরিটি সিস্টেমে প্রতিটি সিস্টেম কল ব্যবহার নিরীক্ষণ করতে ব্যবহৃত হয়। প্রতিটি সিস্টেমে এতে দুটি ডিরেক্টরি থাকে:
অতএব, ব্যবহার ls
, grep
এবং cut
...
$ ls /sys/kernel/debug/tracing/events/syscalls | grep 'sys_enter' | cut -d'_' -f3
আমার সিস্টেমে:
grep
-ইডার __SYSCALL
ফাইলগুলির জন্য 212 সিস্টেম কল প্রকাশিত হয়েছিল।/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
বিষয়টি নিকটতম সমাধান বলে মনে হচ্ছে)।
সমস্ত উত্তর ঠিক আছে।
আপনি যদি একটি নির্দিষ্ট সিস্টেম কল নাম খুঁজছেন:
$ cat /proc/kallsyms | grep <sys_call_name>
আপনি যদি সমস্ত সিস্টেম কলের তালিকা খুঁজছেন:
$ cat /proc/kallsyms
/proc/kallsyms
অন্য ফাইলগুলির মতো কারসাজি করা যায় তাই এটি প্রোগ্রামে এটি ব্যবহার করা বেশ সহজ হয়ে যায়।