Linux应用程序调用驱动的过程

Linux分为用户空间、内核空间和硬件

1.用户空间

用户空间包含了c库,c库包含很多API比如:open() read() write() fork() pthread() socket()等等,c库提供的API调用内核态,支配内核干活。(提供了app支配内核干活的接口)

我们在应用程序main函数中我们要去打开open一个文件,而它的实质是一条汇编指令swi,他会主动触发一个异常(就相当于主动触发一个中断一样),然后就会进入到内核,内核会处理swi异常

2.内核空间

 类别:

        c表示字符设备char_dev  比如iic设备 触摸屏设备 spi设备

        b表示块设备

 主次设备号:

        Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录下,称为设备文件。应用程序可以打开、关闭和读写这些设备文件,完成对设备的操作,就像操作普通的数据文件一样。为了管理这些设备,系统为设备编了号,每个设备号又分为主设备号和次设备号。主设备号用来区分不同种类的设备,而次设备号用来区分同一类型的多个设备。

open,read,write函数都会触发swi异常,但是他们的功能都不同,所以像调不同的函数干不同的事情,就要往寄存器R0里面写不同的值。然后内核的swi处理函数会根据R0不同的值去调用驱动的函数。

VFS(虚拟文件系统):向上提供设备接口,向下兼容各种设备

这个里面会有一些接口:sys_open()、sys_write()、sys_read()…
当我们在应用层调用open打开设备文件的时候,他会在内核调用sys_open()这个函数接口。
 

下图就形象的表示了App调用驱动的过程

 下面举例的就是树莓派中pin4引脚驱动函数里的file_operations结构体:

static struct file_operations pin4_fops = {
 
    .owner = THIS_MODULE,
    .open = pin4_open,
    .write = pin4_write,
    .read = pin4_read,
};

最终我们都是调用到了这些内核里面的open,read等函数,然后进行寄存器的操作。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值