একটি লিনাক্স কার্নেল মডিউল মধ্যে ফাইল পড়ুন / লিখুন


101

কার্নেল থেকে ফাইল কেন / পড়তে হবে না তার পরিবর্তে কীভাবে / প্রোক বা নেটলিঙ্ক ব্যবহার করতে হয় সে সম্পর্কে আমি সমস্ত আলোচনা জানি । আমি যাই হোক না কেন পড়তে / লিখতে চাই আমি ড্রাইভিং মি বাদামগুলিও পড়েছি - যে জিনিসগুলি আপনার কখনও কর্নেলের মধ্যে করা উচিত নয়

তবে, সমস্যাটি হল যে 2.6.30 রফতানি করে না sys_read()। বরং এটি জড়িয়ে আছে SYSCALL_DEFINE3। সুতরাং আমি যদি এটি আমার মডিউলে ব্যবহার করি তবে আমি নিম্নলিখিত সতর্কতাগুলি পেয়েছি:

WARNING: "sys_read" [xxx.ko] undefined!
WARNING: "sys_open" [xxx.ko] undefined!

স্পষ্টতই insmodমডিউলটি লোড করতে পারে না কারণ সংযোগটি সঠিকভাবে ঘটে না।

প্রশ্নসমূহ:

  • ২.6.২২ (যেখানে sys_read()/ sys_open()রফতানি হয় না) তার পরে কার্নেলের মধ্যে কীভাবে পড়তে / লিখতে হয়?
  • সাধারণভাবে, SYSCALL_DEFINEn()কার্নেলের মধ্যে থেকে ম্যাক্রোতে মোড়ানো সিস্টেম কলগুলি কীভাবে ব্যবহার করবেন ?

উত্তর:


124

আপনার সচেতন হওয়া উচিত যে আপনার যখন সম্ভব সম্ভব লিনাক্স কার্নেল থেকে ফাইল I / O এড়ানো উচিত। মূল ধারণাটি হ'ল "এক স্তর আরও গভীর" এবং সরাসরি সিসকল হ্যান্ডলারের পরিবর্তে ভিএফএস স্তর ফাংশনগুলি কল করা:

অন্তর্ভুক্ত:

#include <linux/fs.h>
#include <asm/segment.h>
#include <asm/uaccess.h>
#include <linux/buffer_head.h>

একটি ফাইল খোলার (খোলার অনুরূপ):

struct file *file_open(const char *path, int flags, int rights) 
{
    struct file *filp = NULL;
    mm_segment_t oldfs;
    int err = 0;

    oldfs = get_fs();
    set_fs(get_ds());
    filp = filp_open(path, flags, rights);
    set_fs(oldfs);
    if (IS_ERR(filp)) {
        err = PTR_ERR(filp);
        return NULL;
    }
    return filp;
}

একটি ফাইল বন্ধ করুন (বন্ধের সমান):

void file_close(struct file *file) 
{
    filp_close(file, NULL);
}

কোনও ফাইল থেকে ডেটা পড়া (প্রিডের সমান):

int file_read(struct file *file, unsigned long long offset, unsigned char *data, unsigned int size) 
{
    mm_segment_t oldfs;
    int ret;

    oldfs = get_fs();
    set_fs(get_ds());

    ret = vfs_read(file, data, size, &offset);

    set_fs(oldfs);
    return ret;
}   

কোনও ফাইলে ডেটা লিখন (প্যারাইটের অনুরূপ):

int file_write(struct file *file, unsigned long long offset, unsigned char *data, unsigned int size) 
{
    mm_segment_t oldfs;
    int ret;

    oldfs = get_fs();
    set_fs(get_ds());

    ret = vfs_write(file, data, size, &offset);

    set_fs(oldfs);
    return ret;
}

সিঙ্ক করার ফলে একটি ফাইল পরিবর্তন হয় (ফাইএনসিঙ্কের অনুরূপ):

int file_sync(struct file *file) 
{
    vfs_fsync(file, 0);
    return 0;
}

[সম্পাদনা] মূলত, আমি file_fsync ব্যবহার করার প্রস্তাব দিয়েছিলাম, যা নতুন কার্নেল সংস্করণে রয়েছে। দরিদ্র লোকটিকে পরিবর্তনের প্রস্তাব দেওয়ার জন্য ধন্যবাদ, তবে যার পরিবর্তনটি প্রত্যাখ্যান করা হয়েছিল। সম্পাদনাটি আমি পর্যালোচনা করার আগেই তা প্রত্যাখ্যান করা হয়েছিল।


4
ধন্যবাদ. Sys_read / sys_open কার্যকারিতা প্রতিলিপি করে অনুরূপ কিছু করার জন্য আমি ভাবছিলাম। তবে এটি দুর্দান্ত সাহায্য। একটি কৌতূহল, SYSCALL_DEFINE ব্যবহার করে ঘোষিত সিস্টেম কলগুলি ব্যবহার করার কোনও উপায় আছে কি?
Methos

5
আমি এই কোডটি কার্নেল ২.6.৩০ (উবুন্টু 9.04) এ চেষ্টা করেছি এবং ফাইলটি পড়ে সিস্টেমটি ক্র্যাশ হয়ে গেছে। কেউ একই সমস্যা অভিজ্ঞ?
এনরিকো ডিটোমা

@ এ্যারিকো ডিটোমা? কি শান্তি. এই যে কোনও উপায়ে আপনি আমাকে যে মডিউলটি ব্যবহার করেছিলেন তা দিতে পারেন? এর আগে কখনও দেখিনি?

4
এটি তাত্ক্ষণিকভাবে "আপনি কেন এফএস নাচ, বিটিডব্লিউ" করছেন এমন প্রশ্ন উত্থাপন করেছে, যার উত্তর এখানে বেশ সুন্দরভাবে দেওয়া হয়েছে: "ঠিকানা স্থান ঠিক করা" বিভাগের অধীনে লিনাক্সজার্নাল.নোড / ৮১১০ / প্রিন্ট int
পাইপব্রোস

@dmeister, আপনার লিঙ্ক ভিএফএস স্তর ফাংশনের জন্য বস্তুটি পাওয়া যায় নি
শ্রী

24

লিনাক্স কার্নেলের 4.14 সংস্করণ vfs_readএবং vfs_writeফাংশনগুলি মডিউলগুলিতে ব্যবহারের জন্য আর রফতানি করা হয় না । পরিবর্তে, কার্নেলের ফাইল অ্যাক্সেসের জন্য একচেটিয়াভাবে ফাংশন সরবরাহ করা হয়:

# Read the file from the kernel space.
ssize_t kernel_read(struct file *file, void *buf, size_t count, loff_t *pos);

# Write the file from the kernel space.
ssize_t kernel_write(struct file *file, const void *buf, size_t count,
            loff_t *pos);

এছাড়াও, filp_openআর ব্যবহারকারীর স্পেস স্ট্রিং গ্রহণ করে না, তাই এটি সরাসরি কার্নেল অ্যাক্সেসের জন্য ব্যবহার করা যেতে পারে (সাথে নাচ ছাড়া set_fs)।

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