तो मैं एक कर्नेल मॉड्यूल लिखने की कोशिश कर रहा हूं जो linux/timer.h फ़ाइल का उपयोग करता है। मुझे बस मॉड्यूल के अंदर काम करने के लिए मिला, और अब मैं इसे एक उपयोगकर्ता प्रोग्राम से काम करने की कोशिश कर रहा हूं।मैं अपने कर्नेल मॉड्यूल में हेरफेर करने के लिए ioctl() का उपयोग कैसे करूं?
//Necessary Includes For Device Drivers.
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>
#include <linux/timer.h>
#include <linux/ioctl.h>
#define DEVICE_NAME "mytimer"
#define DEVICE_FILE_NAME "mytimer"
#define MAJOR_NUM 61
#define MINOR_NUM 0
MODULE_LICENSE("Dual BSD/GPL");
static struct timer_list my_timer;
struct file_operations FileOps =
{
//No File Operations for this timer.
};
//Function to perform when timer expires.
void TimerExpire(int data)
{
printk("Timer Data: %d\n", data);
}
//Function to set up timers.
void TimerSetup(void)
{
setup_timer(&my_timer, TimerExpire, 5678);
mod_timer(&my_timer, jiffies + msecs_to_jiffies(5000));
}
//Module Init and Exit Functions.
int init_module(void)
{
int initResult = register_chrdev(MAJOR_NUM, "mytimer", &FileOps);
if (initResult < 0)
{
printk("Cannot obtain major number %d\n", MAJOR_NUM);
return initResult;
}
printk("Loading MyTimer Kernel Module...\n");
return 0;
}
void cleanup_module(void)
{
unregister_chrdev(MAJOR_NUM, "mytimer");
printk("Unloading MyTimer Kernel Module...\n");
}
अधिक विशेष रूप से, मैं TimerSetup() फ़ंक्शन कॉल करने के लिए मेरे उपयोगकर्ता कार्यक्रम हैं:
यहाँ मेरी कर्नेल मॉड्यूल है। मुझे पता है कि मुझे ioctl() का उपयोग करने की आवश्यकता होगी, लेकिन मुझे यकीन नहीं है कि मेरे मॉड्यूल फ़ाइल में निर्दिष्ट कैसे करें कि TimerSetup() को ioctl() के माध्यम से कॉल करने योग्य होना चाहिए।
इसके अलावा, मेरा दूसरा प्रश्न: मैं अपने मॉड्यूल को इन्सोडोड करने और सही प्रमुख संख्या के साथ/dev/mytimer में mknod करने में सक्षम था। लेकिन जब मैंने इसे खोलने की कोशिश की() ताकि मैं इसे फाइल डिस्क्रिप्टर प्राप्त कर सकूं, यह लौटने वाला -1 रखता है, जो मुझे लगता है कि गलत है। मैंने सुनिश्चित किया कि अनुमतियां ठीक थीं (असल में, मैंने इसे सुनिश्चित करने के लिए इसे 777 बना दिया) ... यह अभी भी काम नहीं करता है ... क्या मुझे कुछ याद आ रही है?
यहाँ सिर्फ मामले में उपयोगकर्ता कार्यक्रम है:
#include <stdio.h>
int main(int argc, char* argv[])
{
int fd = open("/dev/mytimer", "r");
printf("fd: %d\n", fd);
return 0;
}
मैंने वास्तव में उस पर ध्यान दिया, लेकिन इसे समझ में नहीं आया ... मैंने फ़ंक्शन स्थिर लंबे softdog_ioctl (स्ट्रक्चर फ़ाइल * फ़ाइल, हस्ताक्षरित int cmd, हस्ताक्षरित लंबे तर्क) लेकिन यह समझ में नहीं आया कि इसमें क्या है .. क्या यह एकमात्र ioctl कार्य है? – hahuang65
बहुत बढ़िया, ऐसा लगता है कि आपने अपनी पोस्ट में इंटरफेस को समझाते हुए एक अच्छी नौकरी की है :) धन्यवाद। – hahuang65
हालांकि यह उत्तर अब 5 साल से अधिक पुराना है, मेरे पास एक सवाल था। यदि 'ioctl' के आगे कार्यान्वयन पर फंसे हुए हैं, तो पसंदीदा विकल्प क्या है? – sherrellbc