1.用户空间调用open()函数,如open("/dev/pin4",O_RDWR);会触发一次软中断,中断号为0x80,由用户态进入到内核态,0x80代表发生了一次系统调用,会来到sys_call()函数,sys_call()函数会调用虚拟文件系统里的sys_open()函数,sys_open()函数会去内核里的驱动链表根据设备名和设备号找到相关的驱动函数,去调用驱动函数里的open()函数,驱动函数里的open()函数去设置了IO口引脚的电平。
2.驱动代码编写的作用:
- 添加驱动:设备名,设备号(包括主设备号和次设备号),设备驱动函数(操作寄存器来驱动IO口
- 调用驱动
3.主设备号和次设备号
- Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录下,称为设备文件。应用程序可以打开、关闭和读写这些设备文件,完成对设备的操作,就像操作普通的数据文件一样。为了管理这些设备,系统为设备编了号,每个设备号又分为主设备号和次设备号。主设备号用来区分不同种类的设备(可以理解为不同品牌的手机,如:苹果手机和华为手机), 次设备号用来区分同一类型的多个设备(可以理解为同款手机的不同型号,如:inphone8和inphone11)。 对于常用设备,Linux有约定俗成的编号,如硬盘的主设备号是3。
- 设备文件通常都在 /dev 目录下。如:
如上,前面第一个字符为c 的表示字符设备。在字符设备里,有主设备号和次设备号。如上10,5,29,1,254,248分别是主设备号,
235,234,63…都是次设备号。现在的 Linux 内核允许多个驱动共享一个主设备号,但更多的设备都遵循一个驱动对一个主设备号的原则。