⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 index.html

📁 驱动程序在 Linux 内核里扮演着特殊的角色. 它们是截然不同的"黑盒子", 使硬件的特殊的一部分响应定义好的内部编程接口. 它们完全隐藏了设备工作的细节. 用户的活动通过一套标准化的调用来进行,
💻 HTML
📖 第 1 页 / 共 3 页
字号:
<div class="toc">
<p><b>目录</b></p>
<dl>
<dt><span class="chapter"><a href="ch01.html">1. 第一章 设备驱动简介</a></span></dt>
<dd><dl>
<dt><span class="sect1"><a href="ch01.html#TheRoleoftheDeviceDriver.sect1">1.1. 驱动程序的角色</a></span></dt>
<dt><span class="sect1"><a href="ch01s02.html">1.2. 划分内核</a></span></dt>
<dd><dl><dt><span class="sect2"><a href="ch01s02.html#LoadableModules.sect2">1.2.1. 可加载模块</a></span></dt></dl></dd>
<dt><span class="sect1"><a href="ch01s03.html">1.3. 设备和模块的分类</a></span></dt>
<dt><span class="sect1"><a href="ch01s04.html">1.4. 安全问题</a></span></dt>
<dt><span class="sect1"><a href="ch01s05.html">1.5. 版本编号</a></span></dt>
<dt><span class="sect1"><a href="ch01s06.html">1.6. 版权条款</a></span></dt>
<dt><span class="sect1"><a href="ch01s07.html">1.7. 加入内核开发社团</a></span></dt>
<dt><span class="sect1"><a href="ch01s08.html">1.8. 本书的内容</a></span></dt>
</dl></dd>
<dt><span class="chapter"><a href="ch02.html">2. 建立和运行模块</a></span></dt>
<dd><dl>
<dt><span class="sect1"><a href="ch02.html#SettingUpYourTestSystem.sect1">2.1. 设置你的测试系统</a></span></dt>
<dt><span class="sect1"><a href="ch02s02.html">2.2. Hello World 模块</a></span></dt>
<dt><span class="sect1"><a href="ch02s03.html">2.3. 内核模块相比于应用程序</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="ch02s03.html#UserSpaceandKernelSpace.sect2">2.3.1. 用户空间和内核空间</a></span></dt>
<dt><span class="sect2"><a href="ch02s03.html#ConcurrencyintheKernel.sect2">2.3.2. 内核的并发</a></span></dt>
<dt><span class="sect2"><a href="ch02s03.html#TheCurrentProcess.sect2">2.3.3. 当前进程</a></span></dt>
<dt><span class="sect2"><a href="ch02s03.html#AFewOtherDetails.sect2">2.3.4. 几个别的细节</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="ch02s04.html">2.4. 编译和加载</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="ch02s04.html#CompilingModules.sect2">2.4.1. 编译模块</a></span></dt>
<dt><span class="sect2"><a href="ch02s04.html#LoadingandUnloadingModules.sect2">2.4.2. 加载和卸载模块</a></span></dt>
<dt><span class="sect2"><a href="ch02s04.html#VersionDependency.sect2">2.4.3. 版本依赖</a></span></dt>
<dt><span class="sect2"><a href="ch02s04.html#PlatformDependency.sect2">2.4.4. 平台依赖性</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="ch02s05.html">2.5. 内核符号表</a></span></dt>
<dt><span class="sect1"><a href="ch02s06.html">2.6. 预备知识</a></span></dt>
<dt><span class="sect1"><a href="ch02s07.html">2.7. 初始化和关停</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="ch02s07.html#TheCleanupFunction.sect2">2.7.1. 清理函数</a></span></dt>
<dt><span class="sect2"><a href="ch02s07.html#ErrorHandlingDuringInitialization.sect2">2.7.2. 初始化中的错误处理</a></span></dt>
<dt><span class="sect2"><a href="ch02s07.html#ModuleLoadingRaces.sect2">2.7.3. 模块加载竞争</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="ch02s08.html">2.8. 模块参数</a></span></dt>
<dt><span class="sect1"><a href="ch02s09.html">2.9. 在用户空间做</a></span></dt>
<dt><span class="sect1"><a href="ch02s10.html">2.10. 快速参考</a></span></dt>
</dl></dd>
<dt><span class="chapter"><a href="ch03.html">3. 字符驱动</a></span></dt>
<dd><dl>
<dt><span class="sect1"><a href="ch03.html#TheDesignofscull.sect">3.1. scull 的设计</a></span></dt>
<dt><span class="sect1"><a href="ch03s02.html">3.2. 主次编号</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="ch03s02.html#TheInternalRepresentationofDeviceNumber.sect">3.2.1. 设备编号的内部表示</a></span></dt>
<dt><span class="sect2"><a href="ch03s02.html#AllocatingandFreeingDeviceNumbers.sect">3.2.2. 分配和释放设备编号</a></span></dt>
<dt><span class="sect2"><a href="ch03s02.html#DynamicAllocaionofMajorNumbers.sect">3.2.3. 主编号的动态分配</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="ch03s03.html">3.3. 一些重要数据结构</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="ch03s03.html#FileOperation.sect">3.3.1. 文件操作</a></span></dt>
<dt><span class="sect2"><a href="ch03s03.html#ThefileStructure.sect">3.3.2. 文件结构</a></span></dt>
<dt><span class="sect2"><a href="ch03s03.html#TheinodeStructure.sect">3.3.3. inode 结构</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="ch03s04.html">3.4. 字符设备注册</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="ch03s04.html#DeviceRegistrationinscull.sect">3.4.1. scull 中的设备注册</a></span></dt>
<dt><span class="sect2"><a href="ch03s04.html#TheOlderWay.sect">3.4.2. 老方法</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="ch03s05.html">3.5. open 和 release</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="ch03s05.html#TheopenMethod.sect">3.5.1. open 方法</a></span></dt>
<dt><span class="sect2"><a href="ch03s05.html#ThereleaseMethod.sect">3.5.2. release 方法</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="ch03s06.html">3.6. scull 的内存使用</a></span></dt>
<dt><span class="sect1"><a href="ch03s07.html">3.7. 读和写</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="ch03s07.html#ThereadMethod.sect">3.7.1. read 方法</a></span></dt>
<dt><span class="sect2"><a href="ch03s07.html#ThewriteMethod.sect">3.7.2. write 方法</a></span></dt>
<dt><span class="sect2"><a href="ch03s07.html#readvandwritev.sect">3.7.3. readv 和 writev</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="ch03s08.html">3.8. 使用新设备</a></span></dt>
<dt><span class="sect1"><a href="ch03s09.html">3.9. 快速参考</a></span></dt>
</dl></dd>
<dt><span class="chapter"><a href="ch04.html">4. 调试技术</a></span></dt>
<dd><dl>
<dt><span class="sect1"><a href="ch04.html#DebuggingSupportintheKernel.sect">4.1. 内核中的调试支持</a></span></dt>
<dt><span class="sect1"><a href="ch04s02.html">4.2. 用打印调试</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="ch04s02.html#printk">4.2.1. printk</a></span></dt>
<dt><span class="sect2"><a href="ch04s02.html#RedirectingConsoleMessages">4.2.2. 重定向控制台消息</a></span></dt>
<dt><span class="sect2"><a href="ch04s02.html#HowMessageGetLogged">4.2.3. 消息是如何记录的</a></span></dt>
<dt><span class="sect2"><a href="ch04s02.html#TurningtheMessagesOnandOff">4.2.4. 打开和关闭消息</a></span></dt>
<dt><span class="sect2"><a href="ch04s02.html#RateLimiting">4.2.5. 速率限制</a></span></dt>
<dt><span class="sect2"><a href="ch04s02.html#PrintingDeviceNumbers">4.2.6. 打印设备编号</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="ch04s03.html">4.3. 用查询来调试</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="ch04s03.html#UsingtheprocFilesystem">4.3.1. 使用 /proc 文件系统</a></span></dt>
<dt><span class="sect2"><a href="ch04s03.html#TheioctlMethod.sect">4.3.2. ioctl 方法</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="ch04s04.html">4.4. 使用观察来调试</a></span></dt>
<dt><span class="sect1"><a href="ch04s05.html">4.5. 调试系统故障</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="ch04s05.html#OopsMessages.scet">4.5.1. oops 消息</a></span></dt>
<dt><span class="sect2"><a href="ch04s05.html#SystemHange.sect">4.5.2. 系统挂起</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="ch04s06.html">4.6. 调试器和相关工具</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="ch04s06.html#Usinggdb.sect">4.6.1. 使用 gdb</a></span></dt>
<dt><span class="sect2"><a href="ch04s06.html#ThekdbKernelDebugger.sect">4.6.2. kdb 内核调试器</a></span></dt>
<dt><span class="sect2"><a href="ch04s06.html#ThekgdbPatches.sect">4.6.3. kgdb 补丁</a></span></dt>
<dt><span class="sect2"><a href="ch04s06.html#TheUserModeLinuxPort.sect">4.6.4. 用户模式 Linux 移植</a></span></dt>
<dt><span class="sect2"><a href="ch04s06.html#TheLinuxTraceToolkit.sect">4.6.5. Linux 追踪工具</a></span></dt>
<dt><span class="sect2"><a href="ch04s06.html#DynamicProbes.sect">4.6.6. 动态探针</a></span></dt>
</dl></dd>
</dl></dd>
<dt><span class="chapter"><a href="ch05.html">5. 并发和竞争情况</a></span></dt>
<dd><dl>
<dt><span class="sect1"><a href="ch05.html#Pitfallsinscull.sect">5.1. scull 中的缺陷</a></span></dt>
<dt><span class="sect1"><a href="ch05s02.html">5.2. 并发和它的管理</a></span></dt>
<dt><span class="sect1"><a href="ch05s03.html">5.3. 旗标和互斥体</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="ch05s03.html#TheLinuxSemaphoreImplementation.sect">5.3.1. Linux 旗标实现</a></span></dt>
<dt><span class="sect2"><a href="ch05s03.html#UsingSemaphoresinscull.sect">5.3.2. 在 scull 中使用旗标</a></span></dt>
<dt><span class="sect2"><a href="ch05s03.html#ReaderWriterSemphores.sect">5.3.3. 读者/写者旗标</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="ch05s04.html">5.4. Completions 机制</a></span></dt>
<dt><span class="sect1"><a href="ch05s05.html">5.5. 自旋锁</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="ch05s05.html#IntroductiontotheSpinlockAPI.sect">5.5.1. 自旋锁 API 简介</a></span></dt>
<dt><span class="sect2"><a href="ch05s05.html#SpinlocksandAtomicContext.sect">5.5.2. 自旋锁和原子上下文</a></span></dt>
<dt><span class="sect2"><a href="ch05s05.html#TheSpinlockFunctions.sect">5.5.3. 自旋锁函数</a></span></dt>
<dt><span class="sect2"><a href="ch05s05.html#ReaderWriterSpinlocks.sect">5.5.4. 读者/写者自旋锁</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="ch05s06.html">5.6. 锁陷阱</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="ch05s06.html#AmbiguousRules.sect">5.6.1. 模糊的规则</a></span></dt>
<dt><span class="sect2"><a href="ch05s06.html#LockOrderingRules.sect">5.6.2. 加锁顺序规则</a></span></dt>
<dt><span class="sect2"><a href="ch05s06.html#FineVersusCoarseGrainedLocking.sect">5.6.3. 细 -粗- 粒度加锁</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="ch05s07.html">5.7. 加锁的各种选择</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="ch05s07.html#LockFreeAlgorithms.sect">5.7.1. 不加锁算法</a></span></dt>
<dt><span class="sect2"><a href="ch05s07.html#AtomicVariables.sect">5.7.2. 原子变量</a></span></dt>
<dt><span class="sect2"><a href="ch05s07.html#BitOperations.sect">5.7.3. 位操作</a></span></dt>
<dt><span class="sect2"><a href="ch05s07.html#seqlocks.sect">5.7.4. seqlock 锁</a></span></dt>
<dt><span class="sect2"><a href="ch05s07.html#ReadCopyUpdate.sect">5.7.5. 读取-拷贝-更新</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="ch05s08.html">5.8. 快速参考</a></span></dt>
</dl></dd>
<dt><span class="chapter"><a href="ch06.html">6. 高级字符驱动操作</a></span></dt>
<dd><dl>
<dt><span class="sect1"><a href="ch06.html#ioctl.sect1">6.1. ioctl 接口</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="ch06.html#ChoosingtheioctlCommands.sect2">6.1.1. 选择 ioctl 命令</a></span></dt>
<dt><span class="sect2"><a href="ch06.html#TheReturnValue.sect2">6.1.2. 返回值</a></span></dt>
<dt><span class="sect2"><a href="ch06.html#ThePredefinedCommands.sect2">6.1.3. 预定义的命令</a></span></dt>
<dt><span class="sect2"><a href="ch06.html#UsingtheioctlArgument.sect2">6.1.4. 使用 ioctl 参数</a></span></dt>
<dt><span class="sect2"><a href="ch06.html#CapabilitiesandRestrictedOperations.sect2">6.1.5. 兼容性和受限操作</a></span></dt>
<dt><span class="sect2"><a href="ch06.html#TheImplementationoftheioctl.sect2">6.1.6. ioctl 命令的实现</a></span></dt>
<dt><span class="sect2"><a href="ch06.html#DeviceControlWithoutioctl.sect2">6.1.7. 不用 ioctl 的设备控制</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="ch06s02.html">6.2. 阻塞 I/O</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="ch06s02.html#IntroductiontoSleeping.sect2">6.2.1. 睡眠的介绍</a></span></dt>
<dt><span class="sect2"><a href="ch06s02.html#SimpleSleeping.sect2">6.2.2. 简单睡眠</a></span></dt>
<dt><span class="sect2"><a href="ch06s02.html#BlockingandNonblockingOperations.sect2">6.2.3. 阻塞和非阻塞操作 </a></span></dt>
<dt><span class="sect2"><a href="ch06s02.html#ABlockingIOExample.sect2">6.2.4. 一个阻塞 I/O 的例子</a></span></dt>
<dt><span class="sect2"><a href="ch06s02.html#AdvancedSleeping.sect2">6.2.5. 高级睡眠</a></span></dt>
<dt><span class="sect2"><a href="ch06s02.html#TestingtheScullpipeDriver.sect2">6.2.6. 测试 scullpipe 驱动</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="ch06s03.html">6.3. poll 和 select</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="ch06s03.html#Interactionwithreadandwrite.sect2">6.3.1. 与 read 和 write 的交互</a></span></dt>
<dt><span class="sect2"><a href="ch06s03.html#TheUnderlyingDataStructure.sect2">6.3.2. 底层的数据结构</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="ch06s04.html">6.4. 异步通知</a></span></dt>
<dd><dl><dt><span class="sect2"><a href="ch06s04.html#TheDriversPointofView.sect2">6.4.1. 驱动的观点</a></span></dt></dl></dd>
<dt><span class="sect1"><a href="ch06s05.html">6.5. 移位一个设备</a></span></dt>
<dd><dl><dt><span class="sect2"><a href="ch06s05.html#ThellseekImplementation.sect2">6.5.1. llseek 实现</a></span></dt></dl></dd>
<dt><span class="sect1"><a href="ch06s06.html">6.6. 在一个设备文件上的存取控制</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="ch06s06.html#SingleOpenDevices.sect2">6.6.1. 单 open 设备</a></span></dt>
<dt><span class="sect2"><a href="ch06s06.html#RestrictingAccesstoaSingleUserataTime.sect2">6.6.2. 一次对一个用户限制存取</a></span></dt>
<dt><span class="sect2"><a href="ch06s06.html#BlockingopenasanAlternativetoEBUSY.sect2">6.6.3. 阻塞 open 作为对 EBUSY 的替代</a></span></dt>
<dt><span class="sect2"><a href="ch06s06.html#CloningtheDeviceonopen.sect2">6.6.4. 在 open 时复制设备</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="ch06s07.html">6.7. 快速参考</a></span></dt>
</dl></dd>
<dt><span class="chapter"><a href="ch07.html">7. 时间, 延时, 和延后工作</a></span></dt>
<dd><dl>
<dt><span class="sect1"><a href="ch07.html#MeasuringTimeLapes.sect">7.1. 测量时间流失</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="ch07.html#UsingthejiffesCounter.sect">7.1.1. 使用 jiffies 计数器</a></span></dt>
<dt><span class="sect2"><a href="ch07.html#PorcessorSpecificRegisters.sect">7.1.2. 处理器特定的寄存器</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="ch07s02.html">7.2. 获知当前时间</a></span></dt>
<dt><span class="sect1"><a href="ch07s03.html">7.3. 延后执行</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="ch07s03.html#LongDelays.sect">7.3.1. 长延时</a></span></dt>
<dt><span class="sect2"><a href="ch07s03.html#ShortDelays.sect">7.3.2. 短延时</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="ch07s04.html">7.4. 内核定时器</a></span></dt>
<dd><dl>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -