প্রোগ্রামিং ভাষার প্রয়োগ না হলে "সিস্টেম কল" বলতে কী বোঝায়?


14

আমি "সিস্টেম কল" শব্দটি বুঝতে চাই। আমি জানি যে সিস্টেম কলগুলি ব্যবহারকারীর অ্যাপ্লিকেশন থেকে কার্নেল পরিষেবা পেতে ব্যবহৃত হয়।

যে অংশটির সাথে আমার স্পষ্টকরণ দরকার তা হ'ল "সিস্টেম কল" এবং "সিস্টেম কলের সি প্রয়োগকারী" এর মধ্যে পার্থক্য।

এখানে একটি উদ্ধৃতি যা আমাকে বিভ্রান্ত করে:

ইউনিক্স-মতো সিস্টেমে, সেই এপিআই সাধারণত গ্ল্যাবসি-র মতো সি লাইব্রেরির (লিবিসি) প্রয়োগের অংশ হয় যা সিস্টেম কলগুলির জন্য মোড়ক ফাংশন সরবরাহ করে, প্রায়শই তারা কল করে যে সিস্টেম কল বলে

"সিস্টেম কল যেগুলি তারা কল করে" কী? তাদের উত্স কোথায়? আমি কি তাদের সরাসরি আমার কোডে অন্তর্ভুক্ত করতে পারি?

জেনারিক অর্থে "সিস্টেম কল" কি কেবল একটি পসিক্স সংজ্ঞায়িত ইন্টারফেস কিন্তু বাস্তবে বাস্তবায়ন দেখতে হলে কেউ সি উত্স পরীক্ষা করতে পারে এবং এর মধ্যে দেখতে পেল যে কার্নেল যোগাযোগের প্রকৃত ব্যবহারকারী স্থানটি কীভাবে চলে?

পটভূমি নোট: আমি প্রতিটি সি ফাংশনটি ডিভাইসগুলির সাথে ইন্টারঅ্যাক্ট করা শেষ করে কিনা তা বোঝার চেষ্টা করছি /dev

উত্তর:


21

প্রতি সেটে সিস্টেম কলগুলি একটি ধারণা। এগুলি এমন ক্রিয়াগুলি উপস্থাপন করে যা প্রক্রিয়াগুলি কার্নেলকে সম্পাদন করতে বলে দিতে পারে।

এই সিস্টেম কলগুলি ইউনিক্স-এর মতো সিস্টেমের কার্নেলে প্রয়োগ করা হয়। এই বাস্তবায়ন (সিতে লেখা, এবং ছোট অংশগুলির জন্য asm) আসলে সিস্টেমে ক্রিয়া সম্পাদন করে।

তারপরে, প্রক্রিয়াগুলি একটি সিস্টেম ইন্টারফেস ব্যবহার করে সিস্টেম কলগুলি সম্পাদনের জন্য সিস্টেমকে জিজ্ঞাসা করে। এই ইন্টারফেসটি পসিক্স দ্বারা নির্দিষ্ট করা হয়েছে। এটি সি স্ট্যান্ডার্ড লাইব্রেরির ফাংশনগুলির একটি সেট। এগুলি আসলে মোড়ক, তারা কিছু চেক করতে পারে এবং তারপরে কার্নেলের একটি সিস্টেম-নির্দিষ্ট ফাংশন কল করতে পারে যা এটি সিস্টেম কল দ্বারা প্রয়োজনীয় ক্রিয়াগুলি করতে বলে। এবং কৌশলটি হ'ল যে ফাংশনগুলি ইন্টারফেস হয় তাদের নামকরণ করা হয় যেমন সিস্টেম তাদের কল করে এবং প্রায়ই "সিস্টেম কল" হিসাবে সরাসরি উল্লেখ করা হয়।

কার্নেলের মধ্যে আপনি ফাংশনটি কল করতে পারেন যা সিস্টেম-নির্দিষ্ট ব্যবস্থার মাধ্যমে সরাসরি সিস্টেম কল সম্পাদন করে। সমস্যাটি হ'ল এটি আপনার কোডটিকে একেবারে পোর্টেবল নয়।

সুতরাং, একটি সিস্টেম কল হল:

  • একটি ধারণা, ব্যবহারকারীর প্রক্রিয়াতে কোনও পরিষেবা দেওয়ার জন্য কার্নেল দ্বারা সম্পাদিত ক্রমের ক্রম
  • সি স্ট্যান্ডার্ড লাইব্রেরির ফাংশনটি কার্নেল থেকে এই পরিষেবাটি পেতে আপনার কোডে ব্যবহার করা উচিত।

1
আপনার কাছে কী "র‌্যাপার ফাংশন" এবং একটি প্রকৃত সিস্টেম কল রয়েছে? (লিনাক্সে ফাইলের
পাতাগুলি

3
উদাহরণস্বরূপ, getpidএটি লিনাক্স কার্নেলের সিস্টেম কল বাস্তবায়ন : lxr.free-electrons.com/source/kernel/timer.c?v=2.6.35#L1337 । এবং এটি জিএনইউ সি স্ট্যান্ডার্ড লাইব্রেরির গিবিসি-২.১ in : fossies.org/dox/glibc-2.19/… এ মোড়ক ফাংশন ।
দীর্ঘ

@ ইজারজিট: আপনার লিঙ্কগুলি আর কাজ করবে না। কার্নেল প্রয়োগের জন্য আপডেট হওয়া লিঙ্ক: github.com/torvalds/linux/blob/… । আজকাল গ্লিবসি কী করে তা আমি খুঁজে পাইনি, সেই কোডটি নেভিগেট করা অসম্ভব।
rchard2scout

6

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

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

ইউনিক্সি সিস্টেমগুলি সিস্টেম কল হিসাবে কমপক্ষে সরাসরি পসআইএক্স ইন্টারফেস দেয়। সাধারণত সিস্টেম কলগুলি সরাসরি আহ্বান করার একটি উপায় রয়েছে, syscall(2)লিনাক্সে কীভাবে এই সুবিধাটি ব্যবহার করতে হয় তার বিশদ অনুসন্ধান করুন।


1
আপনি একটি গুরুত্বপূর্ণ পয়েন্টটি স্পর্শ করেন যা অন্য উত্তরগুলি কেবল তার বিপরীতে মেলে। কোন ফাংশন যে একটি যুক্তিসঙ্গতভাবে সক্ষম প্রোগ্রামার নিজের জন্য লিখতে পারেন (যেমন strlen, strcpy, sqrt, এবং qsort) হতে পারে এবং সম্ভবত একটি লাইব্রেরি থেকে লোড ইউজার-স্পেস রয়েছে। (বেশিরভাগই লিবিসি; গণিত ফাংশনগুলির মতো sqrtএবং ট্রিগনোমেট্রিক এবং হাইপারবোলিক ফাংশনগুলি সম্ভবত লিবিমে থাকে, গণিতের গ্রন্থাগার)) ... (অব্যাহত)
স্কট

1
(ক্রমাগত) ... কিন্তু কোন উপায় একটি ব্যবহারকারী তার নিজের লিখতে পারেন এর fork, killঅথবা openফাংশন, কারণ এই অপারেটিং সিস্টেমের কার্নেল মেমরি স্পেস (যেমন, প্রক্রিয়া টেবিল) অথবা সুবিধাপ্রাপ্ত নির্দেশাবলী (যেমন I / O) এর অ্যাক্সেস দরকার। সুতরাং যে কোডগুলি এই ফাংশনগুলি সম্পাদন করে সেগুলি অবশ্যই অপারেটিং সিস্টেমের কার্নেলের মধ্যে থাকতে হবে; অতএব, সিস্টেম ফাংশন বা সিস্টেম কল।
স্কট

5

অবশ্যই, আসুন আমরা এই-হাতি-থেকে-কত-দিকনির্দেশ-দেখতে পারি? জিনিস।

প্রকৃত সিস্টেম কলটি হ'ল, আপনার নির্মিত প্রোগ্রামে, মেশিনের নির্দেশনাটি কার্নেল মোডে সুবিধাসমূহকে বাড়িয়ে তোলে এবং কার্নেলের মধ্যেই এই কোডটি নির্দেশ দেয়। Libc কোড (এবং প্রতিটি ভাষা রানটাইম) মেশিনের নিবন্ধগুলি এবং ইন-স্টোরেজ প্যারামিটার সেট করে যেখানে কর্নেল কোড তাদের সন্ধানের প্রত্যাশা করে, যা মেশিনের নির্দেশের ক্ষেত্রে বাধার কারণে নির্ধারিতভাবে বিজোড় স্থানগুলি হতে পারে।

নিজেই ওএস কোডে আসার পরে, ইউজারল্যান্ড রানটাইমটি মেশিন-নির্দিষ্ট স্টাফগুলিতে কিছুটা মিরর-চিত্র আনইন্ডিং করে এবং তারপরে একেবারে সাধারণ সাববুটিন কল।
আপনি যদি পুরো স্কেল ওএসে এটি কীভাবে কাজ করে তা দেখতে চান, কার্নেল উত্সটি টানুন ( git clone https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/) এবং উদাহরণস্বরূপ করুন git grep -i system\ call। গ্লিবসি উত্সটি টানুন এবং একইভাবে করুন।


সত্য, তবে লিনাক্স বা
গ্লিবিসিতে চারপাশে রম্যাজিং

3

লিনাক্সে কমপক্ষে সিস্টেম কল প্রক্রিয়াটি বেশিরভাগ আর্কিটেকচারের অধীনে কিছু রেজিস্টার বা পূর্বনির্ধারিত মেমরি ঠিকানার মধ্যে নির্দিষ্টভাবে বিন্যাসিত ডেটা (সাধারণত কিছু ধরণের সি স্ট্রাক্ট) রেখে কাজ করে।

সমস্যাটি আসলে সিপিইউকে কার্নেল স্পেসে স্যুইচ করতে বাধ্য করার ক্ষেত্রে আসে যাতে এটি কলটি পরিষেবাতে সুবিধাযুক্ত কার্নেল কোডটি চালাতে পারে। এটি কোনও ধরণের ত্রুটি (0 দ্বারা বিভাজন, একটি অপরিজ্ঞাত ওভারফ্লো বা একটি সেগফল্ট ইত্যাদি) জোর করে এই কর্নেলটিকে ফল্টটি পরিচালনা করার জন্য মৃত্যুদন্ড কার্যকর করতে বাধ্য করে।

সাধারণত কার্নেলটি ফলস্বরূপ প্রক্রিয়াটি হ্রাস করে অথবা কোনও ব্যবহারকারী সরবরাহকারী হ্যান্ডলার চালিয়ে ত্রুটিগুলি পরিচালনা করে। তবে সিস্কলের ক্ষেত্রে এটি পরিবর্তিত পূর্বনির্ধারিত রেজিস্টারগুলি এবং মেমরির অবস্থানগুলি পরীক্ষা করে এবং যদি তাদের একটি সিস্কেল অনুরোধ থাকে তবে এটি মেমোরি স্ট্রাক্টে ব্যবহারকারী প্রসেস দ্বারা সরবরাহ করা ডেটা ব্যবহার করে চালানো হবে। এটি সাধারণত কিছু বিশেষ কারুকার্যযুক্ত সমাবেশ দিয়ে করা যায় এবং ব্যবহারকারীর জন্য সিস্কেল ব্যবহার সহজ করতে সিস্টেমের সি লাইব্রেরিটিকে এটি একটি ফাংশন হিসাবে মোড়ানো হয়। নিম্ন স্তরের ইন্টারফেসের জন্য দয়া করে সিসকলগুলি কীভাবে কাজ করে এবং আপনি কীভাবে সি র‌্যাপার ছাড়া কল করতে পারেন সে সম্পর্কে কিছু তথ্যের জন্য http://man7.org/linux/man-pages/man2/syscall.2.html দেখুন ।

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

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


1

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


প্রতিটি কল (অপারেশন) অভ্যন্তরীণভাবে একটি নম্বর দ্বারা চিহ্নিত করা হয়, সত্য। তবে নম্বরটি অপারেশনের উপর নির্ভর করে , রিটার্নের মান বা তর্ক সংখ্যার উপর নির্ভর করে না। এটি কীভাবে x86 এ ব্যবহারকারীল্যান্ড থেকে কাজ করত তার একটি ব্যাখ্যা এখানে রয়েছে
ভোনব্র্যান্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.