内核是一个很厉害的超级逻辑,把硬件底层的东西抽象化,对用户来说只需要调API就好了,根本不需要管寄存器,协议,总线…(单片机会去直接操作),这些全部由操作系统做好。动不动写个操作系统是不现实的。
最内层是硬件,最外层是用户应用,比如浏览器等等。硬件是物质基础,而应用提供服务。
为了方便调用内核,Linux将内核的功能接口制作成系统调用(system call)。用户不需要了解内核的复杂结构,就可以使用内核。系统调用是操作系统的最小功能单位。一个操作系统,以及基于操作系统的应用,都不可能实现超越系统调用的功能。
系统调用提供的功能非常基础,所以使用起来很麻烦。一个简单的给变量分配内存空间的操作,就需要动用多个系统调用。Linux定义一些库函数(library routine)来将系统调用组合成某些常用的功能。上面的分配内存的操作,可以定义成一个库函数,比如常用的malloc。
为什么要学习驱动呢?
树莓派开发可以使用厂家自带的wiringPi库开发比较简单,但是在未来的开发不一定厂家会自带这种wiriPi库,但是只要是能运行的Linux就一定有标准的c库, 学会根据标准C库编写驱动,只要能拿到linux内核源码,拿到芯片手册,电路图…就能做开发。
Linux驱动程序的作用是在操作系统内核与硬件设备之间建立一个接口,使得内核能够通过驱动程序来控制硬件设备。驱动程序负责将内核的指令翻译成硬件设备能够理解的指令,并将硬件设备的状态信息反馈给内核。这样,用户就可以通过操作系统来间接地控制硬件设备,而不需要直接与硬件设备打交道
Linux一切皆文件!!
对文件的操作都是:open、read、wrie
linux一切皆为文件,其设备管理同样是和文件系统紧密结合。在目录/dev
下都能看到鼠标,键盘,屏幕,串口等设备文件,硬件要有相对应的驱动,那么open怎样区分这些硬件呢?