u-boot的任务是启动内核. 内核的任务是启动应用程序. 该应用程序将涉及许多文件和硬件操作,但不会直接操作硬件. 设备驱动程序将完成硬件特定的操作;归档,点亮,获取键值.
Linux系统将设备分为三类:
是指一次只能读取和写入一个字节的设备. 它无法随机读取设备内存中的某些数据. 读取数据必须有序. 字符设备是面向流的设备. 常见的字符设备包括鼠标,键盘,串行端口,控制台和LED设备.
是指可以从设备上任何位置读取一定长度的数据的设备. 块设备包括硬盘,磁盘,U盘和SD卡.
[每个字符设备或块设备都对应/ dev目录中的设备文件. Linux用户程序使用驱动程序文件来操作字符设备并通过设备文件(或设备节点)阻止设备. )
网络设备可以是硬件设备,例如网卡;但它也可以是纯软件设备,例如回送接口(lo). 网络接口负责发送和接收数据包.
设备分类
以led操作为例进行描述.
如果需要在应用程序中打开指示灯,则需要打开功能. 内核中的驱动程序中还有一个相应的led_open函数. led_open函数用于初始化led的pin功能. 要读取led灯的状态,内核中的驱动程序还具有led_read函数. 这是内核中应用程序和驱动程序之间最简单的(并非唯一)对应.
那么应用程序中的打开和读取功能最终如何在驱动程序中调用led_open和led_readlinux 驱动,中间是什么?
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);
}
上面的应用程序主要实现用于打开和打开文本文件的相同功能. 但是,打开和打开文本文件的行为明显不同. 那么谁来实现这些不同的行为呢?
对于LED灯,有一个led_open驱动器. 对于闪存设备上存在的文本文件,也有针对它们的驱动程序. system_open和system_read最终将基于不同的打开文件找到不同的基础驱动程序,然后调用驱动程序中的硬件操作功能(例如led_open)以在特定的硬件设备上实现操作.
关于如何在system_open中找到led_openlinux 驱动,您可以参考: 解释如何在底层驱动程序中调用应用程序层的open函数到xxx_open函数.
开放系统调用过程
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-203724-1.html