1

我正在学习字符设备驱动程序编程。我有一些疑问,希望在这里澄清它们:-

(a) “设备文件与主设备号和次设备号相关联。同样在我们的驱动程序模块中,我们定义了一个 cdev 对象,其 fops 字段根据我们的功能定义,主设备号和次设备号相同。”

1. I want to know what exactly happens when a function is called on the device file. 
Here is what I think. Suppose, I make a file called mydevfile using mknod(). Now 
when I call open(mydevfile, O_RDWR), the kernel is searched for a cdev object with
same minor and major number. When found, the cdev 's fops is searched for function
for open() (say dev_open()). It is written that the dev_open() should have first 
argument inode* and second argument file*. My question is how are these parameters 
passed to the dev_open() function?

2. I learnt that inode is associated with a file on disk. Which file is it associated
with here? Also inode has a pointer to corresponding cdev. Now if we have already
got the cdev  by searching major and minor number from mydevfile, why do we need 
inode? W

3. What does the file*(i.e. the second argument) point to in this case?

你可以自由地以你喜欢的方式解释这一点,但如果你能用一个例子来解释它,我更愿意。谢谢!

4

1 回答 1

0

我是字符驱动程序的新手。这只是我可以为您的问题所做的一个小总结。欢迎提出建议和修改。

这些是编写字符驱动程序需要了解的主要结构:

1)文件操作结构体:该结构体中的每个字段都指向驱动程序中实现open、read、write、ioctl的函数。每个打开的文件都通过包含一个名为 f_op 的字段与一些函数相关联,该字段将指向文件操作结构。

2) 文件结构:它代表一个打开的文件。它不是特定于驱动程序的,每个打开的文件在内核空间中都有一个文件结构。它由内核在打开时创建并传递给对文件进行操作的任何函数,直到最后一次关闭。结构文件操作 *f_op;

3) Inode 结构:内核用来在内部表示文件。这里只有两个参数很重要,即 a。struct cdev *i_cdev 和 b.dev_t i_rdev

a. struct cdev *i_cdev: kernel's internal structure to represent the char devices.
b. dev_t i_rdev: contains the actual device numbers.

这就是我的解释:

从磁盘读取 inode 并初始化 inode 对象。

ext2_readinode()----> init_special_inode()----> 这会将 inode 对象的 i_rdev 字段初始化为设备文件的次要和主要编号。

于 2013-05-22T13:26:54.960 回答