ldd3_基础知识

Linux Device Drivers第三版,但一直没仔细拜读.最近决定仔细研读它以学习Linux设备驱动程序. 在这里归纳学习笔记. 不知道自己有没有恒心把它看完,总之better later than never. 就让这一系列的笔记伴随我学习ldd3的漫漫长路吧 ldd3笔记_1_基础知识 - challengezcy - challengezcy的博客

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设备可以是字符设备, 块设备, 也可以是网络接口.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值