Linux Device Drivers第三版,但一直没仔细拜读.最近决定仔细研读它以学习Linux设备驱动程序. 在这里归纳学习笔记. 不知道自己有没有恒心把它看完,总之better later than never. 就让这一系列的笔记伴随我学习ldd3的漫漫长路吧
ldd3介绍的是2.6.10版的内核
An Introduction to Devices Drivers
驱动扮演的角色
Driver is a software layer that lies between the applications and the actual device.
Mechanism & Policy
" the role of a device driver is providing mechanism, not policy".
mechanism和policy也是隐藏在unix设计背后的经典思想.
mechanism: What capabilities are provided.
policy : How these capabilities can be used.
e.g1: KDE or GNOME: 它们都的基础都是X server. KDE和GNOME属于policy. 它们所关注的是使用什么样的图形界面, 用户面板. 却无须考虑底层硬件. X server属于mechanism, 它与硬件交互, 并为用户程序提供接口. 所以不同的图形界面可以存在于同一台主机上.
e.g2: TCP/IP suite
OS提供socket接口, 应用程序则可以使用各种协议. socket就是mechanism, 应用程序则关注policy. 经典的OSI七层模型或TCP/IP四层模型也是这个思想.
Device Drivers: policy free, only provide mechanism!
but, sometimes, u may lay some policies on them.
和驱动一起发布的可能还会有一些库, 应用程序. 库和应用程序就要涉及到policies了. 开发者提供的库或应用程序中的policy即默认的policy.
Kernel可划分为下列功能单元
1, 进程管理: 进程调度, 资源分配, 进程间通信.
2, 内存管理: 其实也算是资源分配的一部分.
3, 文件系统: 管理, 组织物理媒介上数据的方法.
4, 设备控制: 设备驱动(ldd3所关注的)
5, 网络: 实质上是进程间通信. 但它不局限于一个特定的进程. 它关注收/发packets, 路由, 地址解析...
可加载模块(lodable modules)
module: 可实时加载到内核中的代码, 它可动态连接到内核(insmod, rmmod).
设备驱动就是module的代表, 但module还包括文件系统等等.
当然, 你也可以在开机后关闭模块的功能. 2.2版之后的内核支持在开机后关闭对加载module的支持.
设备, 模块的分类
针对不同的设备类型(实际上也就是文件类型, 可参考APUEv2, p88), 模块分为这些类型: character module, block module, network interface. 每种类型的模块驱动对应类型的设备.
字符设备: 以字节流的形式被访问的设备.
e.g: /dev/console : 文本控制台. /dev/ttyS0 : 串口
它通过文件系统节点被访问. e.g: /dev/tty1, /dev/lp0
字符设备与一般文件(regular file)的区别: 可以在一般文件中前后移动(lseek), 但只能顺序访问字符设备. 当然, 也有特例: frame grabbers.
块设备: 能支持文件系统的设备.
传统的UNIX: 只能以block(512B)为单位访问块设备.
Linux: 能以访问字符设备的方式访问块设备, 即以字节文单位访问块设备.
Linux中字符设备与块设备的区别:
1, 内核内部对数据的组织和管理不同, 但这对驱动开发者来说是透明的.
2, 它们与内核之间的接口不同: 使用两套不同的interface.
网络接口: 能与其他主机通信的设备.
它可以是硬件设备, 也可以是软件设备, 比如lo. (参考TCP/IP详解p26)
网络接口只管收发数据包, 而不管这些数据包被什么协议所使用.
不同于字符设备和块设备, 网络接口没有对应的文件系统节点. 虽然可以通过类似eth0这样的"文件名"来访问网络接口, 但文件系统节点中却没有针对网络接口的节点.
内核与网络接口之间的通信也不同于内核与字符/块设备之间的通信(read, write), 它们之间使用特定的传输数据包的函数调用.
另, 也有一些module不能严格地划分到上面的类型. 比如 USB module: 它工作在内核的USB子系统之上, 而实际的USB设备可以是字符设备, 块设备, 也可以是网络接口.
ldd3介绍的是2.6.10版的内核
An Introduction to Devices Drivers
驱动扮演的角色
Driver is a software layer that lies between the applications and the actual device.
Mechanism & Policy
" the role of a device driver is providing mechanism, not policy".
mechanism和policy也是隐藏在unix设计背后的经典思想.
mechanism: What capabilities are provided.
policy : How these capabilities can be used.
e.g1: KDE or GNOME: 它们都的基础都是X server. KDE和GNOME属于policy. 它们所关注的是使用什么样的图形界面, 用户面板. 却无须考虑底层硬件. X server属于mechanism, 它与硬件交互, 并为用户程序提供接口. 所以不同的图形界面可以存在于同一台主机上.
e.g2: TCP/IP suite
OS提供socket接口, 应用程序则可以使用各种协议. socket就是mechanism, 应用程序则关注policy. 经典的OSI七层模型或TCP/IP四层模型也是这个思想.
Device Drivers: policy free, only provide mechanism!
but, sometimes, u may lay some policies on them.
和驱动一起发布的可能还会有一些库, 应用程序. 库和应用程序就要涉及到policies了. 开发者提供的库或应用程序中的policy即默认的policy.
Kernel可划分为下列功能单元
1, 进程管理: 进程调度, 资源分配, 进程间通信.
2, 内存管理: 其实也算是资源分配的一部分.
3, 文件系统: 管理, 组织物理媒介上数据的方法.
4, 设备控制: 设备驱动(ldd3所关注的)
5, 网络: 实质上是进程间通信. 但它不局限于一个特定的进程. 它关注收/发packets, 路由, 地址解析...
可加载模块(lodable modules)
module: 可实时加载到内核中的代码, 它可动态连接到内核(insmod, rmmod).
设备驱动就是module的代表, 但module还包括文件系统等等.
当然, 你也可以在开机后关闭模块的功能. 2.2版之后的内核支持在开机后关闭对加载module的支持.
设备, 模块的分类
针对不同的设备类型(实际上也就是文件类型, 可参考APUEv2, p88), 模块分为这些类型: character module, block module, network interface. 每种类型的模块驱动对应类型的设备.
字符设备: 以字节流的形式被访问的设备.
e.g: /dev/console : 文本控制台. /dev/ttyS0 : 串口
它通过文件系统节点被访问. e.g: /dev/tty1, /dev/lp0
字符设备与一般文件(regular file)的区别: 可以在一般文件中前后移动(lseek), 但只能顺序访问字符设备. 当然, 也有特例: frame grabbers.
块设备: 能支持文件系统的设备.
传统的UNIX: 只能以block(512B)为单位访问块设备.
Linux: 能以访问字符设备的方式访问块设备, 即以字节文单位访问块设备.
Linux中字符设备与块设备的区别:
1, 内核内部对数据的组织和管理不同, 但这对驱动开发者来说是透明的.
2, 它们与内核之间的接口不同: 使用两套不同的interface.
网络接口: 能与其他主机通信的设备.
它可以是硬件设备, 也可以是软件设备, 比如lo. (参考TCP/IP详解p26)
网络接口只管收发数据包, 而不管这些数据包被什么协议所使用.
不同于字符设备和块设备, 网络接口没有对应的文件系统节点. 虽然可以通过类似eth0这样的"文件名"来访问网络接口, 但文件系统节点中却没有针对网络接口的节点.
内核与网络接口之间的通信也不同于内核与字符/块设备之间的通信(read, write), 它们之间使用特定的传输数据包的函数调用.
另, 也有一些module不能严格地划分到上面的类型. 比如 USB module: 它工作在内核的USB子系统之上, 而实际的USB设备可以是字符设备, 块设备, 也可以是网络接口.