linux驱动学习

linux驱动学习

字符设备驱动、块设备驱动、网络设备驱动

linux中一切皆文件,我们在linux中打开一个窗口(字符设备文件),在dev目录下也对应了一个文件,例如我打开了两个窗口,对应两个文件/dev/pts/0和/dev/pts/1,现在在0窗口中向1窗口对应的文件中发送hello world,在1窗口会显示收到的hello world。

linux驱动学习

linux驱动学习 

linux通过一个文件去操作一个字符设备,字符设备对应的文件都在dev目录下,dev目录下每一个文件都对应一个硬件,linux通过文件去访问设备。

网络设备没有体现一切皆文件的思想,网络设备驱动在/dev下没有对应的文件。

设备驱动模型:

总线,设备,驱动。总线是总线,设备是设备,驱动是驱动。

linux驱动学习

linux驱动学习

每一个设备在注册的时候会寻找匹配的驱动,每一个驱动在注册的时候会寻找匹配的设备。

总线帮忙完成匹配,每一种总线匹配的原则不一样,platform总线根据命名字匹配驱动和设备,注册的设备和驱动的名字相同就匹配上了,驱动就进入到运行周期。

linux驱动学习

驱动分层

linux内核模块

模块本身不编译进内核,这控制了内核的大小;模块一旦被加载,它就和内核中的其他部分完全一样。

.ko文件是一个ELF可执行文件

linux驱动学习

modinfo查看模块信息

 linux驱动学习

vermagic:version magic版本魔数,模块对应的内核版本。