代碼含義
static const struct file_operations mem_fops = {
.llseek = mem_llseek,
.read = mem_read,
.write = mem_write,
.open = mem_open,
.release = mem_release,
};
逐詞拆解
| 關鍵字 | 作用 |
static | 限制符號作用域僅在**當前編譯單元(.c 文件)**可見,防止符號衝突,相當於文件級 private |
const | 聲明該變量**不可修改**,編譯器會放入 .rodata 段,運行時嘗試寫入觸發 SIGSEGV |
struct file_operations | 類型名,內核定義的函數指針結構體(VFS 操作向量表) |
mem_fops | **變量名**(實例名),非類型名 |
= { ... } | **初始化列表**(C99 指定初始化器語法),按字段名賦值函數指針 |
等價舊寫法(C89)
static const struct file_operations mem_fops = {
mem_llseek, // llseek
mem_read, // read
mem_write, // write
mem_open, // open
mem_release // release
};
新寫法優勢:字段順序可變、可選字段、可讀性強。
內核中如何使用
// 字符設備註冊
struct cdev my_cdev;
cdev_init(&my_cdev, &mem_fops); // 將 mem_fops 複製到 cdev->ops
cdev_add(&my_cdev, dev_num, 1);
當用戶態調用 read(fd, ...) → 內核 vfs_read → file->f_op->read → mem_read。
總結
mem_fops 後的 = 表示**定義並初始化一個 `struct file_operations` 類型的常量變量**,供後續字符設備註冊使用。這是 Linux 設備驅動編程的標準模式。
- 上一篇文章: JavaScript 導航選單切換程式碼逐行解析與邏輯圖解
- 下一篇文章: Android 文字識別(OCR)算法推薦:Tesseract / ML Kit / PaddleOCR 移動端部署指南
Copyright ©
程式碼之家 All Rights Reserved