开源之夏-6(ext)

这份笔记关注Linux file System与SDF接口实现的对比。
由此可以联系所学,理解SDF的位置。

无论是业务逻辑,还是代码实现,它们非常相似的。

下面把“多态接口表”这个概念拆成 Linux 的 file_operations你眼前的 SDF_METHOD 两条线,对照着说清“它是什么、为什么、怎么用”。


一、Linux file_operations ——内核里最经典的“手动虚表”

  1. 定义(精简版)

    1
    2
    3
    4
    5
    6
    7
    8
    struct 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 *);
    /* … 省略几十项 … */
    };
  2. 驱动如何“多态”
    每个驱动在自己的 .c 文件里填一张 只读全局常量表

    1
    2
    3
    4
    5
    6
    const struct file_operations fops_mydev = {
    .open = my_open,
    .read = my_read,
    .write = my_write,
    /* 没实现的填 NULL 即可 */
    };
  3. 内核怎么用
    当用户态调 read(fd, buf, len) 时,VFS 里最终会走到

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
       ret = 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;
    };
  4. 谁提供实现

    • 每家密码设备厂商编译一个 libsdfXXX.so
    • .so 里定义并导出一张 全局常量表
      1
      2
      3
      4
      5
      const SDF_METHOD ts_sdf_meth = {
      .OpenDevice = ts_OpenDevice,
      .Encrypt = ts_Encrypt,
      ...
      };
  5. 上层怎么用

    1
    2
    3
    const 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/
Author
Dong
Posted on
August 18, 2025
Licensed under