অক্ষর ডিভাইস বা চরিত্রের বিশেষ ফাইলগুলি কীভাবে কাজ করে?


22

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

উত্তর:


19

এগুলি আসলে কেবল - ইন্টারফেস। একটি "মেজর" এবং "অপ্রাপ্তবয়স্ক" নম্বর দ্বারা এনকোড করা তারা কার্নেলের কাছে একটি হুক সরবরাহ করে।

এগুলি দুটি স্বাদে আসে (ভাল, তিনটি, তবে নামযুক্ত পাইপগুলি এই মুহূর্তে এই ব্যাখ্যার আওতার বাইরে): চরিত্র ডিভাইস এবং ব্লক ডিভাইসগুলি।

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

অক্ষর ডিভাইসগুলি অডিও বা গ্রাফিক্স কার্ডের মতো জিনিস, বা কিবোর্ড এবং মাউসের মতো ইনপুট ডিভাইস।

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

(উদাহরণস্বরূপ, আপনার সিস্টেমে পাওয়া প্রথম অডিও কার্ডের ডিজিটাল সিগন্যাল প্রসেসরটি 14/3 এর প্রধান / অপ্রাপ্ত সংখ্যার জোড় পায়; দ্বিতীয়টি 14,35 ইত্যাদি পায়)

এটা একটি এন্ট্রি তৈরি করতে udev দ্বারা আপ /devনামে dspযেমন একটি অক্ষর ডিভাইস প্রধান 14 ছোটখাট 3 চিহ্নিত করা হয়েছে।

(লিনাক্সের উল্লেখযোগ্যভাবে পুরানো বা ন্যূনতম-পদচিহ্নগুলির সংস্করণগুলিতে /dev/গতিশীলভাবে লোড করা যায় না তবে কেবল স্থিতিযুক্ত সমস্ত ডিভাইস ফাইল থাকতে পারে))

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


1
১. এত বড় / গৌণ সংখ্যা বন্দরগুলির সাথে সাদৃশ্যপূর্ণ?
bernie2436

২. সুতরাং প্রোগ্রামগুলি যখন কোনও ফাইলে অ্যাক্সেস করে, কার্নেল এই বিশেষ ইন্টারফেসগুলি পড়ে তা জানতে কোনও বিশেষ ডিভাইস থেকে প্রোগ্রামটি বিঘ্নিত হওয়া উচিত? উদাহরণস্বরূপ: যদি কোনও প্রোগ্রাম কোনও ওয়ার্ড ফাইল খোলায়, এটি ক্যারেক্টার ডিভাইসটি পড়বে বিশেষ ফাইলটি জানতে প্রোগ্রামটি কীবোর্ডের ইনপুটটিতে সাড়া দেবে?
bernie2436

1) কিছুটা । এটি একটি দরিদ্র মানুষের উপমা কিন্তু তা করবে।
শাদুর

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

1
এও নোট করুন যে, ইউএন * এক্স এর কিছু স্বাদে স্টোরেজ ডিভাইসের জন্য অক্ষর বিশেষ ফাইল রয়েছে; বিশেষ ফাইলে একটি পঠন বা একটি লিখন ডিভাইসে ব্লকগুলির ক্রমতে পাঠ্য বা লেখায় পরিণত হয়। (FreeBSD 'র সাম্প্রতিক সংস্করণে, যারা শুধুমাত্র স্টোরেজ ডিভাইসের জন্য বিশেষ ফাইল, সেখানে হয় কোন ব্লক বিশেষ ফাইল।)

10

প্রতিটি ফাইল, ডিভাইস বা অন্যথায় ভিএফএসের মধ্যে 6 টি প্রাথমিক ক্রিয়াকলাপ সমর্থন করে:

  1. খোলা
  2. ঘনিষ্ঠ
  3. পড়ুন
  4. লিখন
  5. খোঁজ
  6. বলা

তদ্ব্যতীত, ডিভাইস ফাইলগুলি I / O নিয়ন্ত্রণ সমর্থন করে, যা প্রথম 6 দ্বারা আওতাধীন অন্যান্য বিবিধ ক্রিয়াকলাপগুলিকে মঞ্জুরি দেয়।

কোনও চরিত্রের বিশেষের ক্ষেত্রে, অনুসন্ধান এবং বলুন কার্যকর করা হয় না কারণ তারা স্ট্রিমিং ইন্টারফেসটিকে সমর্থন করে । এটি হ'ল সরাসরি পড়া বা লেখা যেমন শেলের পুনর্নির্দেশ দিয়ে করা হয়:

echo 'foo' > /dev/some/char
sed ... < /dev/some/char

6

ন্যূনতম চলমান file_operationsউদাহরণ

আপনি যখন ন্যূনতম উদাহরণটি দেখেন, তখন এটি সমস্ত স্পষ্ট হয়।

মূল ধারণাগুলি হ'ল:

  • file_operations প্রতিটি ফাইল সম্পর্কিত সিস্টেমের কলব্যাক রয়েছে
  • mknod <path> c <major> <minor> একটি অক্ষর ডিভাইস তৈরি করে যা সেগুলি ব্যবহার করে file_operations
  • অক্ষরযুক্ত ডিভাইসের জন্য যা গতিশীলভাবে ডিভাইস নম্বর বরাদ্দ করে (বিরোধগুলি এড়ানোর আদর্শ), এর সাথে নম্বরটি সন্ধান করুন cat /proc/devices

character_device.ko কার্নেল মডিউল:

#include <asm/uaccess.h> /* copy_from_user, copy_to_user */
#include <linux/errno.h> /* EFAULT */
#include <linux/fs.h> /* register_chrdev, unregister_chrdev */
#include <linux/jiffies.h>
#include <linux/module.h>
#include <linux/printk.h> /* printk */
#include <uapi/linux/stat.h> /* S_IRUSR */

#define NAME "lkmc_character_device"

MODULE_LICENSE("GPL");

static int major;

static ssize_t read(struct file *filp, char __user *buf, size_t len, loff_t *off)
{
    size_t ret;
    char kbuf[] = {'a', 'b', 'c', 'd'};

    ret = 0;
    if (*off == 0) {
        if (copy_to_user(buf, kbuf, sizeof(kbuf))) {
            ret = -EFAULT;
        } else {
            ret = sizeof(kbuf);
            *off = 1;
        }
    }
    return ret;
}

static const struct file_operations fops = {
    .owner = THIS_MODULE,
    .read = read,
};

static int myinit(void)
{
    major = register_chrdev(0, NAME, &fops);
    return 0;
}

static void myexit(void)
{
    unregister_chrdev(major, NAME);
}

module_init(myinit)
module_exit(myexit)

ইউজারল্যান্ড পরীক্ষা প্রোগ্রাম:

insmod /character_device.ko
dev="lkmc_character_device"
major="$(grep "$dev" /proc/devices | cut -d ' ' -f 1)"
mknod "/dev/$dev" c "$major" 0
cat /dev/lkmc_character_device
# => abcd
rm /dev/lkmc_character_device
rmmod character_device

গিটিহাব কিউইএমইউ + বোল্ডারপ্লেট সহ বিল্ড্রুট মূল প্রবাহটি এটি চালানোর জন্য:

আরও জটিল উদাহরণ:


এটি সুপার সহায়ক ছিল! কেবল একটি প্রশ্ন, এটি ঠিক কী করে *off = 1;এবং কেন সেট করা আছে 1?
সিলভারস্ল্যাশ

1
@ সিলভারস্ল্যাশ যে মানটি একাধিক readকল একই open(ফাইল বর্ণনাকারীর কাছে পৌঁছে যায় । ড্রাইভার এটি দিয়ে যা করতে পারে তা করতে পারে। সাধারন শব্দার্থক শব্দটি হ'ল পঠিত বাইট সংখ্যা contain তবে এই উদাহরণে, আমাদের কেবল একটি সহজ অর্থশাস্ত্র রয়েছে: 0প্রথম পড়ার 1পরে, প্রথম পড়ার পরে। এটি চালানোর চেষ্টা করুন এবং একটি প্রিন্টক বা জিডিবি পদক্ষেপ এটি ডিবাগ করুন।
সিরো সান্তিলি 新疆 改造 中心 法轮功 六四

4

"একবারে চরিত্র" হ'ল এক গুমোটিক (ধারণাটি অনুসারে যে চরিত্রের ডিভাইসগুলি প্রয়োজনীয়ভাবে সন্ধান এবং বলা সমর্থন করে না)। আসলে, "এক সময় ব্লক করুন" (যেমন কঠোর রেকর্ড-ওরিয়েন্টেড, যেমন টেপ ড্রাইভ *) ডিভাইসগুলি অবশ্যই অক্ষরের ডিভাইস হতে হবে । চরিত্র ডিভাইস ড্রাইভারগুলি একটি সম্পূর্ণ file_operationsকাঠামো সংজ্ঞায়িত করে যা ডিভাইসটি অপারেশন সমর্থন করে কিনা সেই অনুযায়ী নয় এমন একটি সম্পূর্ণ কাঠামো সংজ্ঞায়িত করে এমন ধারণাও তাই So যে চরিত্রের ডিভাইসগুলি বেশিরভাগ লোকেরা উদাহরণ হিসাবে মনে করেন তা হ'ল নাল, ইউরেনডম, টিটিওয়াই ডিভাইস, সাউন্ড কার্ড, মাউস ইত্যাদি ... যা সমস্ত ডিভাইসগুলি কী তা নির্দিষ্টকরণের কারণে অদৃশ্য, তবে / dev / vcs, / dev / fb0 , এবং / dev / kmem এছাড়াও অক্ষর ডিভাইস এবং সেগুলি সব অনুসন্ধানযোগ্য।

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

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

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


1

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

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