কার্নেল ড্রাইভার এবং কার্নেল মডিউলগুলির মধ্যে পার্থক্য কী?


66

আমি যখন lspci -kআমার কুবুন্টুতে একটি 3.2.0-29-জেনেরিক কার্নেল দিয়ে করি তখন আমি এরকম কিছু দেখতে পাই:

01:00.0 VGA compatible controller: NVIDIA Corporation G86 [Quadro NVS 290] (rev a1)
    Subsystem: NVIDIA Corporation Device 0492
    Kernel driver in use: nvidia
    Kernel modules: nvidia_current, nouveau, nvidiafb

একটা কার্নেল চালক nvidiaও কার্নেল মডিউলের nvidia_current, nouveau, nvidiafb

এখন আমি ভাবলাম কার্নেল ড্রাইভার এবং কার্নেল মডিউলগুলির মধ্যে পার্থক্য কী হতে পারে?

উত্তর:


78

একটি কার্নেল মডিউল হ'ল সংকলিত কোড যা রান-টাইমে কার্নেলের মধ্যে canোকানো যেতে পারে, যেমন insmodবা সাথে modprobe

ড্রাইভার হ'ল একটি কোড যা কিছু হার্ডওয়্যার ডিভাইসে কথা বলার জন্য কার্নেলে চলে। এটি হার্ডওয়্যারটিকে "চালিত" করে। আপনার কম্পিউটারের বেশিরভাগ হার্ডওয়ারের সাথে একটি সম্পর্কিত ড্রাইভার রয়েছে a চলমান কার্নেলের একটি বড় অংশই ড্রাইভার কোড ²

ড্রাইভারটি ডিস্কের কার্নেল ফাইলে স্থিতিশীলভাবে তৈরি করা যেতে পারে ³ ড্রাইভারটি কার্নেল মডিউল হিসাবেও নির্মিত হতে পারে যাতে এটি পরে গতিশীলভাবে লোড করা যায়। (এবং তারপরে সম্ভবত আনলোড করা হবে))

স্ট্যান্ডার্ডভাবে কার্নেলের সাথে স্থিতিশীলভাবে লিঙ্ক করার পরিবর্তে যেখানে সম্ভব সেখানে কার্নেল মডিউল হিসাবে ড্রাইভারগুলি তৈরি করা স্ট্যান্ডার্ড অনুশীলন, যেহেতু এটি আরও নমনীয়তা দেয়। না করার বেশ কয়েকটি ভাল কারণ রয়েছে:

  • কখনও কখনও প্রদত্ত ড্রাইভার সিস্টেম বুট আপ করতে সহায়তা করার জন্য একেবারে প্রয়োজনীয়। এটি যতক্ষণ না আপনি কল্পনা করতে পারেন ততক্ষণ ঘটবে না, ডিআরডি বৈশিষ্ট্যের কারণে ।

  • স্ট্যাটিক্যালি নির্মিত ড্রাইভার ঠিক কি আপনি একটি সিস্টেম স্ট্যাটিক্যালি যেমন একটি হিসাবে, scoped হয় চান হতে পারে এমবেডেড সিস্টেম । এর অর্থ এটি হ'ল আপনি যদি আগে থেকেই ঠিক জানেন যে কোন ড্রাইভারের সর্বদা প্রয়োজন হবে এবং এটি কখনই পরিবর্তিত হবে না, আপনার ডায়নামিক কার্নেল মডিউলগুলি নিয়ে বিরক্ত না করার উপযুক্ত কারণ রয়েছে।

  • যদি আপনি আপনার কার্নেলটি স্থিতিশীলভাবে তৈরি করেন এবং লিনাক্সের ডায়নামিক মডিউল লোডিং বৈশিষ্ট্যটি অক্ষম করেন তবে আপনি কার্নেল কোডের রান-টাইম পরিবর্তনকে আটকাবেন। এটি নমনীয়তার ব্যয়ে অতিরিক্ত সুরক্ষা এবং স্থায়িত্ব সরবরাহ করে।

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


Asides:

  1. এই বিস্তৃত বিবৃতিটির একটি ব্যতিক্রম সিপিইউ চিপ, যা প্রতি সেয়ে কোনও "ড্রাইভার" নেই । আপনার কম্পিউটারে এমন কোনও হার্ডওয়্যার থাকতে পারে যার জন্য আপনার কোনও ড্রাইভার নেই।

  2. একটি অপারেটিং সিস্টেম কার্নেল কোড বাকি ভালো জেনেরিক পরিষেবা প্রদান করে মেমরি ব্যবস্থাপনা , আইপিসি , সিডিউলিং , ইত্যাদি এই পরিষেবাগুলি প্রাথমিকভাবে সেবা করতে পারে userland , অ্যাপ্লিকেশন মত উদাহরণ পূর্বে লিঙ্ক বা তাদের যেটি ড্রাইভার বা অন্য intra- দ্বারা ব্যবহৃত অভ্যন্তরীণ সেবা হতে পারে কার্নেল পরিকাঠামো।

  3. এক /bootদ্বারা বুট করার সময় র্যাম মধ্যে লোড বুট লোডার প্রথম দিকে বুট প্রক্রিয়া


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

1
এটি একটি ভাল সাধারণ রূপরেখা, তবে আমার ওপি-র মত একই প্রশ্ন ছিল, তারপরে এই উত্তরটি এসেছিল এবং এখনও জানিনা যে "ব্যবহৃত ড্রাইভার" "মডিউলগুলি" থেকে আলাদা কেন। বিপরীতে, @ জিম প্যারিসের উত্তরটি সঠিক। থেকে man lspci: "-ক প্রতিটি ডিভাইস পরিচালনা করছে এমন কার্নেল ড্রাইভার এবং এটি পরিচালনা করতে সক্ষম কার্নেল মডিউলগুলি দেখান " " আপনি এটি পড়তে পারেন: "ড্রাইভারটি বর্তমানে / ডিভাইসটি আসলে পরিচালনা করছে এবং সমস্ত মডিউল যা এটি পরিচালনা করতে পারে / বোঝাতে পারে " Show
বিনারুস

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

18

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


ধন্যবাদ - যে সাহায্য করেছে। যদি আমি কেবল জারি করে থাকি man lspci- এটি ঠিক যা বলেছিল তা বলে।
বিনারুস

5

এই সুন্দর টিউটোরিয়াল অনুযায়ী :

... এক ধরণের মডিউল হ'ল ডিভাইস ড্রাইভার, যা কার্নেলকে সিস্টেমের সাথে সংযুক্ত হার্ডওয়্যার অ্যাক্সেস করতে দেয়।

সুতরাং, আমরা যদি একটি গাছ আঁকার চেষ্টা করি, আমাদের কাছে "ডিভাইস ড্রাইভার" থাকবে যা মডিউলটির (বর্ধিত) উত্তরাধিকার সূত্রে প্রাপ্ত এবং এর আরও নির্দিষ্ট বৈশিষ্ট্য রয়েছে যার মধ্যে আমরা "হার্ডওয়্যার অ্যাক্সেস" পাই ...


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

4

কার্নেল মডিউলটি কোনও ডিভাইস ড্রাইভার নাও হতে পারে।

"কার্নেল ড্রাইভার" একটি ভাল সংজ্ঞায়িত শব্দ নয়, তবে আসুন এটির শট দিন।

এটি একটি কার্নেল মডিউল যা কোনও হার্ডওয়্যার চালায় না এবং সুতরাং এটি "ডিভাইস ড্রাইভার" হিসাবে যুক্তিসঙ্গত বিবেচনা করা যায় না:

#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE("GPL");

static int myinit(void)
{
    printk(KERN_INFO "hello init\n");
    return 0;
}

static void myexit(void)
{
    printk(KERN_INFO "hello exit\n");
}

module_init(myinit)
module_exit(myexit)

নির্মাণের পরে, আপনি এটি ব্যবহার করতে পারেন:

insmod hello.ko

এবং এটি ছাপে hello initকরতে dmesg

তবে, কার্নেল মডিউলগুলি ডিভাইস ড্রাইভার নয়, তবে প্রকৃতপক্ষে দরকারী, উদাহরণস্বরূপ, মডিউলগুলি যা কার্নেল ডিবাগিং / পারফরম্যান্সের তথ্য প্রকাশ করে।

ডিভাইস ড্রাইভাররা সাধারণত কার্নেল মডিউলও থাকে।

"ডিভাইস ড্রাইভার" এমন কোনও জিনিসের উদাহরণ উত্পন্ন করা কিছুটা শক্ত, কারণ এটি চালনার জন্য একটি হার্ডওয়্যার প্রয়োজন হয় এবং হার্ডওয়্যার বর্ণনা জটিল হতে থাকে।

কিউইএমইউ বা অন্যান্য এমুলেটর ব্যবহার করে তবে আমরা আসল বা সরলীকৃত হার্ডওয়্যারগুলির সফ্টওয়্যার মডেল তৈরি করতে পারি, যা হার্ডওয়ারের সাথে কীভাবে কথা বলতে হয় তা শেখার একটি দুর্দান্ত উপায়। এখানে ন্যূনতম পিসিআই ডিভাইস ড্রাইভারের একটি সাধারণ উদাহরণ: https://github.com/cirosantilli/linux-kernel-module-cheat/blob/6788a577c394a2fc512d8f3df0806d84dc09f355/kernel_module/hello.c

তারপরে আমরা দেখতে পাই যে x86 এ, হার্ডওয়্যারের সাথে কথা বলার সময় নেমে আসে:

  • inএবং outনির্দেশাবলী, উদাহরণস্বরূপ, https://stackoverflow.com/questions/3215878/ কি-are-in-out-instructions-in-x86-used-for/33444273# 33444273
  • সিপিইউতে হ্যান্ডলারগুলি নিবন্ধিত করে বাধা হ্যান্ডল করে

এই অপারেশনগুলি সাধারণভাবে ব্যবহারকারীল্যান্ড থেকে করা যায় না, যেমন এখানে ব্যাখ্যা করা হয়েছে: ব্যবহারকারীর স্থান এবং কার্নেল স্পেসের মধ্যে পার্থক্য কী? তবে কিছু ব্যাতিক্রম রয়েছে: https://stackoverflow.com/questions/7986260/linux-interrupt-handling-in-user-space

কার্নেল এর পরে এ জাতীয় হার্ডওয়্যার মিথস্ক্রিয়াটিকে আরও সহজ এবং আরও বহনযোগ্য করতে উচ্চ স্তরের এপিআই সরবরাহ করে:

  • request_irq বাধা হ্যান্ডেল করতে
  • ioreadX এবং আইও মেমরি ম্যাপিং
  • এমনকি পিসিআই এবং ইউএসবি এর মতো জনপ্রিয় প্রোটোকলের জন্য উচ্চ স্তরের ইন্টারফেস

0

আমার উত্তর জিমের সাথে যাবে। কার্নেল ড্রাইভার হ'ল একটি প্রোগ্রাম (কার্নেল মডিউল) যা হার্ডওয়ারের টুকরো চালানোর জন্য ডিজাইন করা হয়েছে। Lspci আউটপুট বলে যে ডিভিশনের loadedমডিউল হওয়ায় এনভিডিয়া হ'ল কার্নেল ড্রাইভার । এটির সাথে সাথে অন্যান্য উপলব্ধ কার্নেল মডিউলগুলি পাওয়া যায়।

আমি যে লিনাক্স কমান্ড তালিকাবদ্ধ করতে ও অপসারণ ড্রাইভার হয় যুক্ত করতে হবে lsmodএবং rmmodযথাক্রমে। যা তালিকা মডিউল এবং মডিউল সরান বলে।


0

সমস্ত ড্রাইভার মডিউল হয়। সমস্ত মডিউল ড্রাইভার হয় না।

মডিউল রানটাইমে sertedোকানো যেতে পারে। মডিউল / ড্রাইভারগুলি স্থায়ীভাবে কার্নেলের সাথে সংকলন করা যায়।

টিপিক্যাল মডিউল init রয়েছে

module_init(init_fn);
init_fn()
{
   /* some code */
}

একই মডিউলটিকে ড্রাইভার করা যায়

module_init(init_fn);
init_fn()
{
   device_register(&device);
   /* some code */
}

8
ড্রাইভারগুলি সর্বদা মডিউল হয় না, এগুলি মূল কার্নেল চিত্রের মধ্যে অন্তর্ভুক্ত করা যায়।
গিলস

3
@ প্রচারণা: "সমস্ত ড্রাইভার মডিউল। সমস্ত মডিউল ড্রাইভার নয়।" এটি পরস্পরবিরোধী। গাণিতিক ভাষায়, আপনি যা বলছেন তা হ'ল ডি -> এম এবং এম ->! ডি। এটি ডি এবং! ডি এর জন্য অনুমতি দেয়।
ফ্রান্সেস্কো টার্কো

2
আমি মনে করি তার অর্থ "সমস্ত ড্রাইভার মডিউল। সমস্ত মডিউলই ড্রাইভার নয়"।
রেনান

4
@ রেনান: এটি সঠিক হবে তবে আপনি যদি এই উত্তরের সম্পাদনার ইতিহাসের দিকে তাকান তবে ইতিমধ্যে কেউ ভুলটি সংশোধন করার চেষ্টা করেছিল এবং লেখক এটি ফিরিয়ে দিয়েছেন। সাধারণত আমি কেবল ত্রুটিটি সংশোধন করতে এবং সম্পাদনা করতে সম্পাদনা করব তবে এই ক্ষেত্রে আমি -1 করেছি কারণ এটি কেবল ভুল এবং সমস্যাটিকে বিভ্রান্ত করছে।
কালেব

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