用户态
App:cp指令,ftp的项目等等这就是App的开发。
App开发需要C的基础和C库,C库讲到文件,进程,进程间通信,线程,网络,界面(GTk)。
C库(是linux标准库一定有):就是Clibary,提供了APP支配内核干活的接口,调用的open,read,write,fork,pthread,socket由此处封装实现,由写的应用程序调用,C库中的各种API调用的是内核态,支配内核干活
内核态
进程,内存,线程,网络,设备驱动不需要上层应用开发者关心,驱动在前面的学习是调用wringpi库实现,接下来的学习就是要自己实现wringpi库,因为wringpi库由厂家提供,可能有可能没有,这样当我们拿到另一种类型的板子时,同样也可以完成开发。
驱动链表:管理所有设备的驱动,添加或查找,添加是发生在我们编写完驱动程序,加载到内核。查找发生在调用驱动程序,由应用层用户空间去open。
驱动插入链表的顺序由设备号检索,就是说主设备号和次设备号除了除了能区分不同种类的设备和不同类型的设备,还能起到将驱动程序创到链表的某个位置。
硬件
linux经典的一句话一切皆文件:包括文件,设备(鼠标,键盘,LED,屏幕,flash,内存,网卡等),普通的IO口,串口等等。
对于文件,学习到对文件的操作有open ,read,write这几个API,对于这些API是如何区分操作对象是文件还是一些设备,这些设备需不需要有驱动,驱动又在哪个位置这都是我们需要了解的。驱动肯定是要有的。
假设:现在的硬件有pin4,pin5,pin6,这些引脚分别对应于4驱动,5驱动,6驱动,这些驱动需要由我们来开发。
open(“/dev/pin4”,权限)用来调用引脚4的驱动,那么如何找到相关的驱动,有两个东西供我们查找,一是文件名,二是设备号(包含主设备号和次设备号)。
Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录下,称为设备文件。应用程序可以打开、关闭和读写这些设备文件,完成对设备的操作,就像操作普通的数据文件一样。为了管理这些设备,系统为设备编了号,每个设备号又分为主设备号和次设备号。主设备号用来区分不同种类的设备,而次设备号用来区分同一类型的多个设备。
ls -l 查看设备号
驱动代码的开发无非就是添加驱动和调用驱动。
例如:
用户态调用引脚四open(“/de/pin4”,O_RDWR), 这个open会调用System call interface(这个函数是在内核中的),这个函数会根据设备名找到设备号,然后会调用VFS中的sys_open,sys_open会找到引脚4中的open函数,引脚4中的open函数是对寄存器的操作。用户态进入内核态会发生一次软中断 ,中断号是0x80。
以上是对下图的解释: