📄 index.html
字号:
</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><dt><span class="sect2"><a href="ch07s04.html#TheTimerAPI.sect">7.4.1. 定时器 API</a></span></dt><dt><span class="sect2"><a href="ch07s04.html#TheImplementaionofKernelTimers.sect">7.4.2. 内核定时器的实现</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch07s05.html">7.5. Tasklets 机制</a></span></dt><dt><span class="sect1"><a href="ch07s06.html">7.6. 工作队列</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch07s06.html#TheSharedQueue.sect">7.6.1. 共享队列</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch07s07.html">7.7. 快速参考</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch07s07.html#Timekeeping.sect">7.7.1. 时间管理</a></span></dt><dt><span class="sect2"><a href="ch07s07.html#Delays.sect">7.7.2. 延迟</a></span></dt><dt><span class="sect2"><a href="ch07s07.html#KernelTimers.sect">7.7.3. 内核定时器</a></span></dt><dt><span class="sect2"><a href="ch07s07.html#Taskletsqr.sect">7.7.4. Tasklets 机制</a></span></dt><dt><span class="sect2"><a href="ch07s07.html#workqueueskr.sect">7.7.5. 工作队列</a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="ch08.html">8. 分配内存</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch08.html#TheRealStoryofkmalloc.sect">8.1. kmalloc 的真实故事</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch08.html#TheFlagsArgument.sect">8.1.1. flags 参数</a></span></dt><dt><span class="sect2"><a href="ch08.html#TheSizeArgument.sect">8.1.2. size 参数</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch08s02.html">8.2. 后备缓存</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch08s02.html#AscullBasedontheSlabCachesscullc.sect">8.2.1. 一个基于 Slab 缓存的 scull: scullc</a></span></dt><dt><span class="sect2"><a href="ch08s02.html#MemoryPools.sect">8.2.2. 内存池</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch08s03.html">8.3. get_free_page 和其友</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch08s03.html#AscullUsingWholePagesscullp.sect">8.3.1. 一个使用整页的 scull: scullp</a></span></dt><dt><span class="sect2"><a href="ch08s03.html#TheallocpagesInterface.sect">8.3.2. alloc_pages 接口</a></span></dt><dt><span class="sect2"><a href="ch08s03.html#vallocandFriends.sect">8.3.3. vmalloc 和 其友</a></span></dt><dt><span class="sect2"><a href="ch08s03.html#AscullUsingVirtualAddressesscullv.sect">8.3.4. 一个使用虚拟地址的 scull : scullv</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch08s04.html">8.4. 每-CPU 的变量</a></span></dt><dt><span class="sect1"><a href="ch08s05.html">8.5. 获得大量缓冲</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch08s05.html#AcquiringaDedicatedBufferatBootTime.sect">8.5.1. 在启动时获得专用的缓冲</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch08s06.html">8.6. 快速参考</a></span></dt></dl></dd><dt><span class="chapter"><a href="ch09.html">9. 与硬件通讯</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch09.html#IOPortsandIOMemor.sect">9.1. I/O 端口和 I/O 内存</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch09.html#IORegistersandConventionalMemory.sect">9.1.1. I/O 寄存器和常规内存</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch09s02.html">9.2. 使用 I/O 端口</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch09s02.html#IOPortAllocation.sect">9.2.1. I/O 端口分配</a></span></dt><dt><span class="sect2"><a href="ch09s02.html#ManipulatingIOports.sect">9.2.2. 操作 I/O 端口</a></span></dt><dt><span class="sect2"><a href="ch09s02.html#IOPortAccessfromUserSpace.sect">9.2.3. 从用户空间的 I/O 存取</a></span></dt><dt><span class="sect2"><a href="ch09s02.html#StringOperations.sect">9.2.4. 字串操作</a></span></dt><dt><span class="sect2"><a href="ch09s02.html#PausingIO.sect">9.2.5. 暂停 I/O</a></span></dt><dt><span class="sect2"><a href="ch09s02.html#PlatformDependencies.sect">9.2.6. 平台依赖性</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch09s03.html">9.3. 一个 I/O 端口例子</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch09s03.html#AnOverviewoftheParallelPort.sect">9.3.1. 并口纵览</a></span></dt><dt><span class="sect2"><a href="ch09s03.html#ASampleDriver.sect">9.3.2. 一个例子驱动</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch09s04.html">9.4. 使用 I/O 内存</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch09s04.html#IOMemoryAllocationandMapping.sect">9.4.1. I/O 内存分配和映射</a></span></dt><dt><span class="sect2"><a href="ch09s04.html#AccessingIOMemory.sect">9.4.2. 存取 I/O 内存</a></span></dt><dt><span class="sect2"><a href="ch09s04.html#PortsasIOMemory.sect">9.4.3. 作为 I/O 内存的端口</a></span></dt><dt><span class="sect2"><a href="ch09s04.html#ReusingshortforIOMemory.sect">9.4.4. 重用 short 为 I/O 内存</a></span></dt><dt><span class="sect2"><a href="ch09s04.html#ISAMemoryBelow1MB.sect">9.4.5. 在 1 MB 之下的 ISA 内存</a></span></dt><dt><span class="sect2"><a href="ch09s04.html#isareadbandFriends.sect">9.4.6. isa_readb 和其友</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch09s05.html">9.5. 快速参考</a></span></dt></dl></dd><dt><span class="chapter"><a href="ch10.html">10. 中断处理</a></span></dt>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -