<aside> 💡
UFS围绕一个核心理念:
***「一切皆是文件」(Everything is a File)*它强行规定,不管你是什么硬件(鼠标、键盘、LED灯),在用户程序(User App)眼里,你就是一个文件。
因此,用户只懂4个标准操作(System Calls):
open():打开文件read():从文件读数据write():向文件写数据close():关闭文件
</aside>👆先回顾 Unix File System 里讲的核心哲学:「Everything is a File (一切皆是文件)」
既然用户只懂4个标准操作,那么驱动的角色就是「做填空题」,把这四个基操的内容填上
static ssize_t zili_demo_char1_read(struct file *fp, char *buf, size_t count, loff_t *position){
int num;
if (count < strlen(msg)) num = count;
else num = strlen(msg);
copy_to_user(buf, msg, num);
return num;
}
核心痛点:内核空间(Kernel Space)和用户空间(User Space)的内存是隔离的。
关键逻辑:你不能直接用 memcpy 或指针赋值。
zili_demo_char1_read **就是在做这件事:把内核里的字符串 **msg **搬运到用户的 **buf **里。**直观理解:**内核要求所有驱动填一张 标准合同(Struct file_operations),里面填 函数指针
static struct file_operations zili_demo_fops = {
owner: THIS_MODULE,
open: zili_demo_char1_open,
read: zili_demo_char1_read,
release: zili_demo_char1_release,
};
**作用:**比如,当用户对驱动文件喊 read():
/dev/lab1,我查了一下表,发现这个设备对应的主设备号(Major Number)是 251