কার্নেলের একটি প্রধান () ফাংশন রয়েছে? [বন্ধ]


52

আমি ডিভাইস ড্রাইভার এবং কার্নেল প্রোগ্রামিং শিখছি। জোনাথন কর্বেটের বই অনুসারে, main()ডিভাইস ড্রাইভারদের কোনও কাজ নেই ।

সুতরাং আমি দুটি প্রশ্ন:

  • আমাদের কেন main()ডিভাইস ড্রাইভারগুলিতে কোনও ফাংশন দরকার নেই ?
  • কার্নেলের নিজেই কোনও main()ফাংশন রয়েছে?

কেউ কি এটা আমাকে ব্যাখ্যা করতে পারে?


1
এখানে একই ব্যবহারকারীর দ্বারা জিজ্ঞাসা করা হয়েছে: stackoverflow.com/q/18266063/827263
কিথ থম্পসন

@ কিথথম্পসন ... হ্যাঁ ... আমি যা চাই তা উত্তর পাইনি বলেই আমি এখানে এটি জিজ্ঞাসা করেছি।
কেউ

@ শাদুর ... যাইহোক এখন এটি বন্ধ হওয়ার কথা ... এবং আমি এই স্থানান্তরিত করার সুযোগ পাই না ...
কেউ

এটি অন্য উপায়ে অন্যদিকে বন্ধ করা উচিত ছিল, এটির আরও অনেক দর্শন রয়েছে :-)
সিরো সান্তিলি 事件 改造 中心 法轮功 六四

উত্তর:


82

ব্যবহারকারীর স্পেস প্রোগ্রামগুলিতে, বাইনারি সম্পাদন main()করার সময় প্রোগ্রামটির এন্ট্রি পয়েন্টটি লাইবসি ইনিশিয়াল কোড বলে code কার্নেল কোডে libc উপর নির্ভর করার বিলাসিতা নেই, কারণ libc নিজেই মেমরি বরাদ্দকরণ, I / O, প্রক্রিয়া পরিচালন ইত্যাদির জন্য কার্নেল সিস্টেল ইন্টারফেসের উপর নির্ভর করে as

এটি বলেছিল, main()কার্নেল কোডের সমতুল্য হ'ল start_kernel(), যা কার্নেল চিত্র লোড করার পরে বুটলোডার দ্বারা ডাকা হয় , এটি মেমোরিতে সংকোচিত করে এবং প্রয়োজনীয় হার্ডওয়্যার এবং মেমরি পেজিং সেটআপ করে। start_kernel()সিস্টেম সেটআপের বেশিরভাগ অংশ সম্পাদন করে এবং অবশেষে init প্রক্রিয়াটি তৈরি করে।

লিনাক্স কার্নেল মডিউলগুলিতে প্রবেশের বিন্দু একটি init ফাংশন যা module_init()ম্যাক্রো কল করে কার্নেলের সাথে নিবন্ধিত হয় । নিবন্ধিত মডিউল Init ফাংশন তারপর হয় কার্নেল কোড ডাকা মাধ্যমে do_initcalls()কার্নেল সূচনার সময় ফাংশন।


11
mainসি তে পদ্ধতির আসল উদ্দেশ্যকে স্বীকৃতি দেওয়ার জন্য আপনাকে ধন্যবাদ (এটি একটি অতি সাধারণভাবে ধারণ করা ভুল ধারণা যা ওএস সরাসরি কল করে main, যা ঘটনাটি নয় এবং উদাহরণস্বরূপ সি ++ এর ক্ষেত্রে এর চেয়ে কম ক্ষেত্রেও রয়েছে।) '' আমি আপনাকে আর কিছু উপস্থাপন করতে পারি যদি আমি কেবল তার জন্য পারতাম।
একটি সিভিএন

1
@ থমাস ... এই উত্তরের উত্তরের জন্য ধন্যবাদ ....
কেউ

17

কার্নেলের কোনও mainফাংশন নেই। mainসি ভাষার ধারণা is কার্নেলটি সি এবং সমাবেশে লেখা হয়। কার্নেলের প্রবেশ কোডটি সমাবেশ দ্বারা লেখা হয়।

বুট ক্রমটি নিম্নরূপে সংগঠিত হয়:

  1. BIOS সাধারণত বুট ব্লক ডিভাইস থেকে বুট লোডার লোড করে। এখনই একটি জনপ্রিয় বুট লোডার গ্রাব।
  2. গ্রাব প্রাথমিক শিকড় ডিভাইস ( initrd) এর সাহায্যে একটি কার্নেল চিত্রটি মেশিনে লোড করে । তারপরে কিছু ঠিকানায় কোড কার্যকর করা হয়।
  3. কার্নেল ইমেজের কিছু কার্নেল মডিউল রয়েছে, উদাহরণস্বরূপ: ফাইল সিস্টেম মডিউল, ডিভাইস ড্রাইভার। কার্নেল চিত্রটি রুট ফাইল সিস্টেমটি মাউন্ট করার জন্য ফাইল সিস্টেম মডিউল ব্যবহার করে। এখন কার্নেলটি সমস্ত কার্নেল মডিউলগুলি ডিস্ক থেকে লোড এবং চালাতে পারে।
  4. কার্নেল প্রারম্ভিককরণের কাজগুলি চালায়। উদাহরণস্বরূপ: পিসিআই বাসটি অতিক্রম করুন এবং সমস্ত পিসিআই ডিভাইস সন্ধান করুন, সমস্ত ডিভাইস ড্রাইভারকে সূচনা করুন।
  5. পরিশেষে কার্নেল প্রসেস 0 এবং প্রক্রিয়া 1 ( initপ্রক্রিয়া) তৈরি করে, সিপিইউ এর প্রসঙ্গটি রিং 0 থেকে রিং 3 এ পরিবর্তন করে এবং আরম্ভ প্রক্রিয়া শুরু করে (প্রক্রিয়া আইডি 1)। এখন কার্নেলের বুট শেষ!
  6. initপ্রোগ্রামটিকে সব Init স্ক্রিপ্ট চালানো হয়। সমস্ত পরিষেবা শুরু হয়। শেল বলা হয়। ব্যবহারকারীরা লগইন করতে পারেন।

mainফাংশন একটি সি ফাংশন। আসলে মূল পদ্ধতিটি সি প্রোগ্রামগুলির প্রবেশের পয়েন্ট নয়। সি রানটাইম এর আগে অনেক ফাংশন কল করে main। জিসিসির একটি বর্ধিত বৈশিষ্ট্য রয়েছে: নির্মাতারা। "কনস্ট্রাক্টর" ঘোষিত ফাংশনগুলির আগে ডাকা হয় main

উদাহরণ স্বরূপ:

/* This should not be used directly. Use block_init etc. instead. */ 
#define module_init(function, type) \
    static void _attribute__((constructor)) do_qemu_init ## function(void) { \
    register_module_init(function, type); \
} 

এই ম্যাক্রোটি কিউমু প্রকল্পের।


মেন মেথড হ'ল এসি মেথড.অ্যাক্টিউল মেইন মেথডে সি প্রোগ্রামার এন্ট্রি হয় না। সি রানটাইম মেন মেথডের আগে অনেক মেথড বলেছে।
এডওয়ার্ড শেন

ভাল, বায়োস সাধারণত বুট লোডার লোড করে এবং বুট লোডার একটি কার্নেল চিত্র (এবং সম্ভবত একটি initrd) লোড করে। কার্নেলের কোডটি কার্নেল ইমেজে রয়েছে, আরম্ভ করা হয়নি
স্টাফেন চেজেলাস

জিসিসির একটি বর্ধিত বৈশিষ্ট্য রয়েছে: কনস্ট্রাক্টর। প্রধান পদ্ধতির আগে পদ্ধতির ঘোষণাকে "কনস্ট্রাক্টর" বলা হয়। উদাহরণস্বরূপ: / * এটি সরাসরি ব্যবহার করা উচিত নয়। পরিবর্তে block_init ইত্যাদি ব্যবহার করুন। * / # ডিফাইন মডিউল_ইনিট (ফাংশন, প্রকার) \ স্ট্যাটিক শূন্য _ট্রিবিউট __ ((কনস্ট্রাক্টর)) do_qemu_init ## ফাংশন ( শূন্য ) \ \ নিবন্ধক_মডিউল_আইনিট (ফাংশন, প্রকার); }}
এডওয়ার্ড শেন

1
initrd.img কার্নেল চিত্র নয় NOT এটি বুট করার সময় কার্নেল দ্বারা লোড করা মডিউলগুলির একটি সেট। কার্নেলের চিত্রগুলিতে সাধারণত "ভিএমলিনুজ" দিয়ে শুরু হওয়া নাম থাকে তবে ডিস্ট্রো থেকে ডিস্ট্রোতে আলাদা হয়।
স্বর্ণিলকস

3
এই উত্তরটি "সবকিছুই একটি পিসি / লিনাক্স / আই 8686" এর চক-পূর্ণ এবং এটি সেভাবে বুট হয় এবং কার্নেলটি সেভাবেই হয় ... কেন সবাই মনে করে যে এটি বিশ্বের একমাত্র সম্ভাব্য উপায়?
জেনস

9

সিস্টেমটি আসল থেকে সুরক্ষিত মোডে স্যুইচ করার জন্য প্রস্তুত করার জন্য আর্চ / x86 / বুট / মেইন.সি. তে একটি প্রধান () ফাংশন রয়েছে তবে অন্যান্য আর্কিটেকচারে এরকম কোড নেই। X86 প্ল্যাটফর্মে লিনাক্স কার্নেল ২.6.x বুট করা কীভাবে একটি দুর্দান্ত ওভারভিউ রয়েছে । এটা সত্যিই এটি পড়া মূল্যবান।

HOWTO ডিনাক্স অনুযায়ী লিনাক্স কার্নেলটি বিকাশ করে , লিনাক্স কার্নেলটি হয়

একটি স্ট্রিস্ট্যান্ডিং সি পরিবেশ, স্ট্যান্ডার্ড সি লাইব্রেরির উপর নির্ভরতা নেই, সুতরাং সি স্ট্যান্ডার্ডের কিছু অংশ সমর্থিত নয়।

সি স্ট্যান্ডার্ড বিটিডাব্লু অনুসারে এর অর্থ কী

এটি বাস্তবায়ন-সংজ্ঞায়িত হয় যে কোনও ফ্রিস্ট্যান্ডিং পরিবেশে কোনও প্রোগ্রামকে 'প্রধান' ফাংশন সংজ্ঞায়িত করা প্রয়োজন কিনা।

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