linux设备文件和驱动程序,linux-kernel – open如何为普通文件和设备驱动程序工作...

目前,我正在学习Linux设备驱动程序.并坚持打开设备文件的工作原理?

我到现在为止……

考虑一个打开普通文件的简单代码.

#incldue

int main() {

FILE fp;

char buffer[20];

fp = fopen(/home/yoggi/foo.txt, "r");

fread(buffer, 5, 1, fp);

}

在上面的程序中,fopen(),c-library函数是系统调用open()的包装函数,该实体在VFS层函数中调用sys_open()或file_open().由于linux支持多个文件系统,因此虚拟文件系统将控件转移到实际的文件系统处理程序,以打开该文件.

1) How does virtual file system(VFS) get to know on which file system the

underline file resides?

2) How does it then calls the file_open or open function of that particular

filesystem to open file.

如果设备驱动程序发生类似的事情.假设一个简单的设备驱动程序.

#include

// othher includes...

static dev_t first; // Global variable for the first device number

static struct cdev c_dev; // Global variable for the character device structure

static struct class *cl; // Global variable for the device class

static int my_open(struct inode *i, struct file *f)

{

printk(KERN_INFO "Driver: open()\n");

return 0;

}

static ssize_t my_read(struct file *f, char __user *buf, size_t len, loff_t *off)

{

printk(KERN_INFO "Driver: read()\n");

return 0;

}

struct file_operations pugs_fops =

{

.owner = THIS_MODULE,

.open = my_open,

.read = my_read,

};

static int __init ofcd_init(void) /* Constructor */

{

printk(KERN_INFO "Namaskar: ofcd registered");

if (alloc_chrdev_region(&first, 0, 1, "Shweta") < 0)

{

return -1;

}

if ((cl = class_create(THIS_MODULE, "chardrv")) == NULL)

{

unregister_chrdev_region(first, 1);

return -1;

}

if (device_create(cl, NULL, first, NULL, "mynull") == NULL)

{

class_destroy(cl);

unregister_chrdev_region(first, 1);

return -1;

}

cdev_init(&c_dev, &pugs_fops);

if (cdev_add(&c_dev, first, 1) == -1)

{

device_destroy(cl, first);

class_destroy(cl);

unregister_chrdev_region(first, 1);

return -1;

}

return 0;

}

static void __exit ofcd_exit(void) /* Destructor */

{

cdev_del(&c_dev);

device_destroy(cl, first);

class_destroy(cl);

unregister_chrdev_region(first, 1);

printk(KERN_INFO "Alvida: ofcd unregistered");

}

module_init(ofcd_init);

module_exit(ofcd_exit);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("Anil Kumar Pugalia ");

MODULE_DESCRIPTION("Our First Character Driver");

首先,我们为设备分配主要次要编号.注册设备文件范围并将设备文件操作链接到设备驱动程序功能.

我没有得到的一些术语是……

1) What does actually cdev_add() do? in terms of registering a device to the

kernel.

2) Registering a device to the kernel means?

3) How does a open(/dev/mynull, O_RONLY); called on a device file actually calls

the open function of driver which is mapped while initializing the device

by calling routine cdev_init(&c_dev, &pugs_fops); ?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值