历史上的今天
今天是:2025年08月21日(星期四)
2021年08月21日 | 1_5.5.1_字符设备驱动程序之概念介绍_P
2021-08-21 来源:eefocus
之前讲了uboot,它的任务是启动内核;
内核的任务是启动应用程序;
应用程序,里面肯定会涉及很多文件操作,比如读写文件,还有很多硬件操作,比如点灯,获取按键值等。
对于写应用程序的人,他们通常不会去查看芯片手册看这些硬件要怎么操作,而是直接调用open,read,write这些接口来调用底层驱动。
最简单的一种对应方法就是,open函数,read函数,write函数分别会来调用底层驱动的led_open函数,led_read函数,led_write函数。

现在我们来看一下,应用程序的open,read这些函数,是怎么最终调用我们底层驱动的led_open,led_read这些函数的,中间有哪些东西。
假如我们写一个应用程序如下:
int main(void)
{
int fd1, fd2;
int val = 1;
fd1 = open("/dev/led", O_RDWR);
write(fd1, &val, 4);
fd2 = open("hello.txt", O_RDWR);
write(fd2, &val, 4);
}
这里面的open,write这些函数,都不是我们实现的,那是谁实现的吗?
答:C库。它一样属于应用层,当我们的应用程序调用这些open,read,write这些系统调用接口的时候就会进入到内核,驱动也属于内核的一部分。

那么C库是怎么进入内核的呢?
答:open,read,write这些系统调用,实质上都是执行一条swi指令,后面加上某个值val(swi val),这样就会进入到内核的异常处理函数。
有一个system call interface系统调用接口,它会根据发生中断的原因调用不同的处理函数(sys_open,sys_read,sys_write等),这一层叫做VFS(virtual file system虚拟文件系统)。

我们点灯和写文件都使用了open,write函数,但是这两个行为显然不一样,那么,谁来实现这些不同的操作呢?
显然,LED灯有一套它自己的驱动程序,Flash文件也有另一套它自己的驱动程序。
sys_xxx函数就会根据打开的不同文件,找到不同的底层驱动程序,然后调用这些驱动程序来实现底层的write,read,open功能。

app里面的open,read,write这些函数怎么找到底层驱动的对应的xxx_open,xxx_read这些函数,就是通过驱动框架,怎么对应起来的,这个就是下一节的内容。
史海拾趣
|
我是想分别利用串口通信和IC总线向8个LED灯进行控制,为什么串口的时候,有些数据发送的时候可以,有些就不行,还有我用IC总线的时候没有什么反应,我的程序应该没有什么问题的,串口用的虚拟的com口,调试助手,应该怎么做呢???file:///C:/DOCU ...… 查看全部问答> |
|
EVC 要如何关闭其它正在执行程序. 目前使用 FindWindow 来做,但因窗口名称可能会改变,所以不太适用,有否直接针对该执行文件的文件名称关闭程序 … 查看全部问答> |
|
前几天,朋友跟我说要做一系列智能家居,其中涉及到一款人体移动传感器;当时我说这种传感器不是多的是啊,后补充说需要识别人的运动方向,比如;“人从东边往西边走,可以识别,但反方向不反应”,那怕是有微弱的信号识别也行;希望大家提供相关信 ...… 查看全部问答> |




