字符设备驱动程序之概念介绍(一)
一、
Uboot目的是启动内核。
内核目的是启动应用程序。
二、
应用程序:读写文件、点灯、获取按键
三、
1、框架:
应用 | open,read,write | |
C库 | ||
系统调用接口 | sytem call interface | |
内核 | VFS virtual file system | sys_open,sys_read,sys_write |
驱动 | Led_open,led_read,led_write |
2、简单的应用程序
int main()
{
int fd1,fd2;
int val = 1;
fd1=open(“/dev/led”, O_RDWR); //打开一个led程序
write(fd1, &val,4);
fd2=open(“hello.txt”, O_RDWR); //打开一个文本文件
write(fd2, &val, 4);
}
3、驱动也属于内核的一部分。
4、C库是怎么进入内核呢?open,read,write实现的实质是什么?
执行swi val(汇编指令),引发一个异常,相当于中断一样。当发生这个异常的时候,就会进入内核的异常处理函数里面。
5、系统调用接口的作用(system call interface):
在异常处理函数里面,根据发生异常的原因,调用不同的处理函数。
例如:使用open函数,则传进来的值为val1(swi val1);使用read函数,则传进来的值为val2(swi val2);使用write函数,则传进来的值为val3(write val3)。内核里的系统调用接口(system callinterface),会根据传进来不同的值,去调用sys_open、sys_read和sys_write。
6、上面1简单的应用程序中,fd1和fd2打开的行为不同。sys_open、sys_read和sys_write,最终根据打开不同的文件,找到不同的驱动程序,从而调用驱动程序open、read、write来实现这些功能。
四、
1、总结框架:
APP1应用程序调用open、read、write函数等调用,open、read、write函数在c库里实现的。执行指令swi val,这条指令会触发一个异常,这个异常就会进入内核空间,在内核空间异常处理函数里面,会根据传进不同的值val,去调用sys_open,sys_read,sys_write函数,这些函数根据打开不同的文件,文件有不同的属性,根据这些属性来找到底层的驱动程序。比如,led灯,就会找到led灯的驱动程序,如果是某些文件,就会找到Storage drivers存储驱动里面的open,read,write函数。
2、
应用程序app:open,read,write(标准接口)
这个过程怎么转换?
怎么通过open找到led_open?
这就依赖于驱动程序框架
驱动程序:led_open,led_read,led_write
(操作硬件)
3、
4、
总的来说,
Sytem call interface系统调用接口是 决定 使用哪一个函数(read(),write(),open()……)
VFS虚拟文件系统 是 决定 调用哪一个驱动程序的open()函数(led_open()、memdev_open()……)
https://blog.csdn.net/Pris_oner/article/details/51594934