开源之夏-6(ext)
这份笔记关注Linux file System与SDF接口实现的对比。
由此可以联系所学,理解SDF的位置。
无论是业务逻辑,还是代码实现,它们非常相似的。
下面把“多态接口表”这个概念拆成 Linux 的 file_operations 和 你眼前的 SDF_METHOD 两条线,对照着说清“它是什么、为什么、怎么用”。
一、Linux file_operations
——内核里最经典的“手动虚表”
定义(精简版)
1
2
3
4
5
6
7
8struct file_operations {
loff_t (*llseek) (struct file *, loff_t, int);
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
int (*open) (struct inode *, struct file *);
int (*release)(struct inode *, struct file *);
/* … 省略几十项 … */
};驱动如何“多态”
每个驱动在自己的.c
文件里填一张 只读全局常量表:1
2
3
4
5
6const struct file_operations fops_mydev = {
.open = my_open,
.read = my_read,
.write = my_write,
/* 没实现的填 NULL 即可 */
};内核怎么用
当用户态调read(fd, buf, len)
时,VFS 里最终会走到1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18ret = file->f_op->read(file, buf, len, &pos);
```
不同的 `fd` 背后挂着不同的 `file->f_op`,于是同一条系统调用就能表现出 **磁盘、管道、socket、字符设备** 等多种行为——典型的 **运行时多态**。
4. 总结一句话
`file_operations` 就是 **C 语言手写的虚函数表**,让 **同一套接口** (`read/write/open/...`) 在 **不同对象** 上表现出 **不同实现**。
------------------------------------------------
二、SDF_METHOD ——用户态密码设备里的“file_operations 翻版”
1. 定义
```c
typedef struct sdf_method_st SDF_METHOD;
struct sdf_method_st {
SDF_OpenDevice_fn OpenDevice;
SDF_CloseDevice_fn CloseDevice;
...
SDF_Encrypt_fn Encrypt;
};谁提供实现
- 每家密码设备厂商编译一个
libsdfXXX.so
; .so
里定义并导出一张 全局常量表1
2
3
4
5const SDF_METHOD ts_sdf_meth = {
.OpenDevice = ts_OpenDevice,
.Encrypt = ts_Encrypt,
...
};
- 每家密码设备厂商编译一个
上层怎么用
1
2
3const SDF_METHOD *m = &ts_sdf_meth; /* 通过 DSO_bind_func 拿到 */
m->OpenDevice(...);
m->Encrypt(...);换一家厂商,只要换一张表,业务代码一行不改——又是 运行时多态。
对照速记
维度 | Linux file_operations |
SDF_METHOD |
---|---|---|
所在空间 | 内核空间 | 用户空间 |
代表对象 | 文件/设备 | 密码设备 |
虚表创建者 | 驱动开发者 | 设备厂商 |
被谁统一调度 | VFS 层 | 上层安全中间件 |
多态方式 | 函数指针表 | 函数指针表 |
动态替换 | 重新 insmod 驱动 | 换 .so 插件 |
结论
无论是内核的 file_operations
还是用户态的 SDF_METHOD
,本质都是 “把一组函数指针收进结构体”,靠 运行时填表 实现 C 语言下的多态接口。
开源之夏-6(ext)
https://43.242.201.154/2025/08/18/开源之夏-6/