-
linux 阻塞 open 作为对 EBUSY 的替代
所属栏目:[Linux] 日期:2020-12-13 热度:196
当设备不可存取,返回一个错误常常是最合理的方法,但是有些情况用户可能更愿意等待 设备. ? 例如,如果一个数据通讯通道既用于规律地预期地传送报告(使用 crontab),也用于根据 用户的需要偶尔地使用,对于被安排的操作最好是稍微延迟,而不是只是因为通道当前忙[详细]
-
linux llseek 实现
所属栏目:[Linux] 日期:2020-12-13 热度:115
llseek 方法实现了 lseek 和 llseek 系统调用. 我们已经说了如果 llseek 方法从设备 的操作中缺失,内核中的缺省的实现进行移位通过修改 filp-f_pos,这是文件中的当前 读写位置. 请注意对于 lseek 系统调用要正确工作,读和写方法必须配合,通过使用和 更新它们[详细]
-
linux 共享队列
所属栏目:[Linux] 日期:2020-12-13 热度:102
一个设备驱动,在许多情况下,不需要它自己的工作队列. 如果你只偶尔提交任务给队列,简单地使用内核提供的共享的,缺省的队列可能更有效. 如果你使用这个队列,但是,你 必须明白你将和别的在共享它. 从另一个方面说,这意味着你不应当长时间独占队列(无 长睡眠),[详细]
-
linux 内核协助的探测
所属栏目:[Linux] 日期:2020-12-13 热度:113
Linux 内核提供了一个低级设施来探测中断号. 它只为非共享中断,但是大部分能够在共 享中断状态工作的硬件提供了更好的方法来尽量发现配置的中断号.这个设施包括 2 个函 数,在linux/interrupt.h 中声明( 也描述了探测机制 ). ? unsigned long probe_irq_on(vo[详细]
-
linux alloc_pages 接口
所属栏目:[Linux] 日期:2020-12-13 热度:73
为完整起见,我们介绍另一个内存分配的接口,尽管我们不会准备使用它直到 15 章. 现 在,能够说 struct page 是一个描述一个内存页的内部内核结构. 如同我们将见到的,在内核中有许多地方有必要使用页结构; 它们是特别有用的,在任何你可能处理高端内存 的情况下,[详细]
-
linux 安装一个中断处理
所属栏目:[Linux] 日期:2020-12-13 热度:93
如果你想实际地"看到"产生的中断,向硬件设备写不足够; 一个软件处理必须在系统中配 置. 如果 Linux 内核还没有被告知来期待你的中断,它简单地确认并忽略它. ? 中断线是一个宝贵且常常有限的资源,特别当它们只有 15 或者 16 个时. 内核保持了中 断线的一个注[详细]
-
linux 在启动时获得专用的缓冲
所属栏目:[Linux] 日期:2020-12-13 热度:124
如果你真的需要一个大的物理上连续的缓冲,最好的方法是在启动时请求内存来分配它. 在启动时分配是获得连续内存页而避开 get_free_pages 施加的对缓冲大小限制的唯一 方法,不但最大允许大小还有限制的大小选择. 在启动时分配内存是一个"脏"技术,因为 它绕开了[详细]
-
linux 自动检测 IRQ 号
所属栏目:[Linux] 日期:2020-12-13 热度:77
驱动在初始化时最有挑战性的问题中的一个是如何决定设备要使用哪个 IRQ 线. 驱动需 要信息来正确安装处理. 尽管程序员可用请求用户在加载时指定中断号,这是个坏做法,因为大部分时间用户不知道这个号,要么因为他不配置跳线要么因为设备是无跳线的. 大 ? 部分[详细]
-
linux 从用户空间的 I/O 存取
所属栏目:[Linux] 日期:2020-12-13 热度:89
刚刚描述的这些函数主要打算被设备驱动使用,但它们也可从用户空间使用,至少在 PC- 类 的计算机. GNU C 库在 sys/io.h 中定义它们. 下列条件应当应用来对于 inb 及其 友在用户空间代码中使用: ? 程序必须使用 -O 选项编译来强制扩展内联函数. ioperm 和 iopl[详细]
-
linux并口纵览
所属栏目:[Linux] 日期:2020-12-13 热度:134
因为我们期望大部分读者以所谓的"个人计算机"的形式使用一个 x86 平台,我们觉得值 得解释一下 PC 并口如何设计的. 并口是在个人计算机上运行数字 I/O 例子代码的外设 接口选择. 尽管大部分读者可能有并口规范用,为你的方便,我们在这里总结一下它们. ? 并口,[详细]
-
linux 每-CPU 的变量
所属栏目:[Linux] 日期:2020-12-13 热度:123
每-CPU 变量是一个有趣的 2.6 内核的特性. 当你创建一个每-CPU 变量,系统中每个处理 器获得它自己的这个变量拷贝. 这个可能象一个想做的奇怪的事情,但是它有自己的优点. 存取每-CPU 变量不需要(几乎)加锁,因为每个处理器使用它自己的拷贝. 每-CPU 变量也 可[详细]
-
linux Do-it-yourself 探测
所属栏目:[Linux] 日期:2020-12-13 热度:174
探测也可以在驱动自身实现没有太大麻烦. 它是一个少有的驱动必须实现它自己的探测,但是看它是如何工作的能够给出对这个过程的内部认识. 为此目的,short 模块进行 do- it-yourself 的 IRQ 线探测,如果它使用 probe=2 加载. ? 这个机制与前面描述的相同: 使能[详细]
-
linux I/O 内存分配和映射
所属栏目:[Linux] 日期:2020-12-13 热度:185
I/O 内存区必须在使用前分配. 分配内存区的接口是( 在 linux/ioport.h 定义): ? struct resource *request_mem_region(unsigned long start,unsigned long len,char *name); ? 这个函数分配一个 len 字节的内存区,从 start 开始. 如果一切顺利,一个 非 NULL[详细]
-
linux 快速和慢速处理
所属栏目:[Linux] 日期:2020-12-13 热度:84
老版本的 Linux 内核尽了很大努力来区分"快速"和"慢速"中断. 快速中断是那些能够很 快处理的,而处理慢速中断要特别地长一些. 慢速中断可能十分苛求处理器,并且它值得 在处理的时候重新使能中断. 否则,需要快速注意的任务可能被延时太长. ? 在现代内核中,快速[详细]
-
linux内存池
所属栏目:[Linux] 日期:2020-12-13 热度:183
在内核中有不少地方内存分配不允许失败. 作为一个在这些情况下确保分配的方式,内核 开发者创建了一个已知为内存池(或者是 "mempool" )的抽象. 一个内存池真实地只是一 类后备缓存,它尽力一直保持一个空闲内存列表给紧急时使用. ? 一个内存池有一个类型 mempo[详细]
-
linux 后备缓存
所属栏目:[Linux] 日期:2020-12-13 热度:127
一个设备驱动常常以反复分配许多相同大小的对象而结束. 如果内核已经维护了一套相同 大小对象的内存池,为什么不增加一些特殊的内存池给这些高容量的对象? 实际上,内核 确实实现了一个设施来创建这类内存池,它常常被称为一个后备缓存. 设备驱动常常不展 示这[详细]
-
linux vmalloc 和 其友
所属栏目:[Linux] 日期:2020-12-13 热度:187
我们展示给你的下一个内存分配函数是 vmlloc,它在虚拟内存空间分配一块连续的内存 区. 尽管这些页在物理内存中不连续 (使用一个单独的对 alloc_page 的调用来获得每个 页),内核看它们作为一个一个连续的地址范围. vmalloc 返回 0 ( NULL 地址 ) 如果发 生一[详细]
-
paramiko:实现ssh协议,对linux服务器资源的访问
所属栏目:[Linux] 日期:2020-12-13 热度:149
介绍 网络传输是遵循协议的,比如SSH,paramiko则是实现了SSHv2协议的一个python库(底层使用的是cryptography)。有了paramiko之后,我们便可以通过python使用ssh协议来连接远程服务器执行操作,不用再通过xshell等工具。安装也很简单,直接pip install param[详细]
-
linux I/O 端口分配
所属栏目:[Linux] 日期:2020-12-13 热度:109
如同你可能希望的,你不应当离开并开始抨击 I/O 端口而没有首先确认你对这些端口有 唯一的权限. 内核提供了一个注册接口以允许你的驱动来声明它需要的端口. 这个接口中 的核心的函数是 request_region: ? #include linux/ioport.h struct resource *request_r[详细]
-
linux 一个使用整页的 scull: scullp
所属栏目:[Linux] 日期:2020-12-13 热度:78
为了真实地测试页分配,我们已随其他例子代码发布了 scullp 模块. 它是一个简化的 scull,就像前面介绍过的 scullc. ? scullp 分配的内存量子是整页或者页集合: scullp_order 变量缺省是 0,但是可以在编 译或加载时改变. ? 下列代码行显示了它如何分配内存: ?[详细]
-
linux 禁止单个中断
所属栏目:[Linux] 日期:2020-12-13 热度:127
有时(但是很少!)一个驱动需要禁止一个特定中断线的中断递交. 内核提供了 3 个函数为 此目的,所有都声明在 asm/irq.h. 这些函数是内核 API 的一部分,因此我们描述它 们,但是它们的使用在大部分驱动中不鼓励. 在其他的中,你不能禁止共享的中断线,并 且,在现代[详细]
-
linux一个例子驱动
所属栏目:[Linux] 日期:2020-12-13 热度:103
我们介绍的驱动称为 short (Simple Hardware Operations and Raw Tests). 所有它做 的是读和写几个 8-位 端口,从你在加载时选择的开始. 缺省地,它使用分配给 PC 并口 的端口范围. 每个设备节点(有一个独特的次编号)存取一个不同的端口. short 驱动不做 任何[详细]
-
linux /proc 接口
所属栏目:[Linux] 日期:2020-12-13 热度:60
无论何时一个硬件中断到达处理器,一个内部的计数器递增,提供了一个方法来检查设备 是否如希望地工作. 报告的中断显示在 /proc/interrupts. 下面的快照取自一个双处理 器 Pentium 系统: ? [email?protected]:/bike/corbet/write/ldd3/src/short# m /proc/inte[详细]
-
linux 禁止所有中断
所属栏目:[Linux] 日期:2020-12-13 热度:132
如果你需要禁止所有中断如何? 在 2.6 内核,可能关闭在当前处理器上所有中断处理,使用任一个下面 2 个函数(定义在 asm/system.h): ? ? void local_irq_save(unsigned long flags); void local_irq_disable(void); ? 一个对 local_irq_save 的调用在当前处理器[详细]
-
linux 一个写缓存例子
所属栏目:[Linux] 日期:2020-12-13 热度:159
我们已经几次提及 shortprint 驱动; 现在是时候真正看看. 这个模块为并口实现一个非 常简单,面向输出的驱动; 它是足够的,但是,来使能文件打印. 如果你选择来测试这个 驱动,记住你必须传递给打印机一个文件以它理解的格式; 不是所有的打印机在给 一个任意数据[详细]