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

📄 ch06s07.html

📁 介绍Linux内核驱动编程的一本书 最主要的是有源代码,都是可用的 学习操作系统很好
💻 HTML
字号:
<html xmlns:cf="http://docbook.sourceforge.net/xmlns/chunkfast/1.0"><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>6.7.&#160;快速参考-Linux设备驱动第三版(中文版)- - </title><meta name="description" content="驱动开发- - " /><meta name="keywords" content="Linux设备驱动,中文版,第三版,ldd,linux device driver,驱动开发,电子版,程序设计,软件开发, " /><meta name="author" content="  www.21cstar.com QQ:610061171" /> <meta name="verify-v1" content="5asbXwkS/Vv5OdJbK3Ix0X8osxBUX9hutPyUxoubhes=" /><link rel="stylesheet" href="docbook.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.69.0"><link rel="start" href="index.html" title="Linux 设备驱动 Edition 3"><link rel="up" href="ch06.html" title="第&#160;6&#160;章&#160;高级字符驱动操作"><link rel="prev" href="ch06s06.html" title="6.6.&#160;在一个设备文件上的存取控制"><link rel="next" href="ch07.html" title="第&#160;7&#160;章&#160;时间, 延时, 和延后工作"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">6.7.&#160;快速参考</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch06s06.html">上一页</a>&#160;</td><th width="60%" align="center">第&#160;6&#160;章&#160;高级字符驱动操作</th><td width="20%" align="right">&#160;<a accesskey="n" href="ch07.html">下一页</a></td></tr></table><hr></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="AdvancedCharDriverOperationsqr.sect1"></a>6.7.&#160;快速参考</h2></div></div></div><p>本章介绍了下面的符号和头文件:</p><div class="variablelist"><dl><dt><span class="term"><span>#include &lt;linux/ioctl.h&gt;</span></span></dt><dd><p>声明用来定义 ioctl 命令的宏定义. 当前被 &lt;linux/fs.h&gt; 包含.</p></dd><dt><span class="term"><span>_IOC_NRBITS</span></span></dt><dd></dd><dt><span class="term"><span>_IOC_TYPEBITS</span></span></dt><dd></dd><dt><span class="term"><span>_IOC_SIZEBITS</span></span></dt><dd></dd><dt><span class="term"><span>_IOC_DIRBITS </span></span></dt><dd><p>ioctl 命令的不同位段所使用的位数. 还有 4 个宏来指定 MASK 和 4 个指定 SHIFT, 但是它们主要是给内部使用. _IOC_SIZEBIT 是一个要检查的重要的值, 因为它跨体系改变.</p></dd><dt><span class="term"><span>_IOC_NONE</span></span></dt><dd></dd><dt><span class="term"><span>_IOC_READ</span></span></dt><dd></dd><dt><span class="term"><span>_IOC_WRITE </span></span></dt><dd><p>"方向"位段可能的值. "read" 和 "write" 是不同的位并且可相或来指定 read/write. 这些值是基于 0 的.</p></dd><dt><span class="term"><span>_IOC(dir,type,nr,size)</span></span></dt><dd></dd><dt><span class="term"><span>_IO(type,nr)</span></span></dt><dd></dd><dt><span class="term"><span>_IOR(type,nr,size)</span></span></dt><dd></dd><dt><span class="term"><span>_IOW(type,nr,size)</span></span></dt><dd></dd><dt><span class="term"><span>_IOWR(type,nr,size)</span></span></dt><dd><p>用来创建 ioclt 命令的宏定义.</p></dd><dt><span class="term"><span>_IOC_DIR(nr)</span></span></dt><dd></dd><dt><span class="term"><span>_IOC_TYPE(nr)</span></span></dt><dd></dd><dt><span class="term"><span>_IOC_NR(nr)</span></span></dt><dd></dd><dt><span class="term"><span>_IOC_SIZE(nr)</span></span></dt><dd><p>用来解码一个命令的宏定义. 特别地, _IOC_TYPE(nr) 是 _IOC_READ 和  _IOC_WRITE 的 OR 结合.</p></dd><dt><span class="term"><span>#include &lt;asm/uaccess.h&gt;</span></span></dt><dd></dd><dt><span class="term"><span>int access_ok(int type, const void *addr, unsigned long size);</span></span></dt><dd><p>检查一个用户空间的指针是可用的. access_ok 返回一个非零值, 如果应当允许存取.</p></dd><dt><span class="term"><span>VERIFY_READ </span></span></dt><dd></dd><dt><span class="term">VERIFY_WRITE <span></span></span></dt><dd><p>access_ok 中 type 参数的可能取值. VERIFY_WRITE 是 VERIFY_READ 的超集.</p></dd><dt><span class="term"><span>#include &lt;asm/uaccess.h&gt;</span></span></dt><dd></dd><dt><span class="term"><span>int put_user(datum,ptr);</span></span></dt><dd></dd><dt><span class="term"><span>int get_user(local,ptr);</span></span></dt><dd></dd><dt><span class="term"><span>int __put_user(datum,ptr);</span></span></dt><dd></dd><dt><span class="term"><span>int __get_user(local,ptr);</span></span></dt><dd><p>用来存储或获取一个数据到或从用户空间的宏. 传送的字节数依赖 sizeof(*ptr). 常规的版本调用 access_ok , 而常规版本( __put_user 和 __get_user ) 假定 access_ok 已经被调用了.</p></dd><dt><span class="term"><span>#include &lt;linux/capability.h&gt;</span></span></dt><dd><p>定义各种 CAP_ 符号, 描述一个用户空间进程可有的能力.</p></dd><dt><span class="term"><span>int capable(int capability);</span></span></dt><dd><p>返回非零值如果进程有给定的能力.</p></dd><dt><span class="term"><span>#include &lt;linux/wait.h&gt;</span></span></dt><dd></dd><dt><span class="term"><span>typedef struct { /* ... */ } wait_queue_head_t;</span></span></dt><dd></dd><dt><span class="term"><span>void init_waitqueue_head(wait_queue_head_t *queue);</span></span></dt><dd></dd><dt><span class="term"><span>DECLARE_WAIT_QUEUE_HEAD(queue);</span></span></dt><dd><p>Linux 等待队列的定义类型. 一个 wait_queue_head_t 必须被明确在运行时使用 init_waitqueue_head 或者编译时使用 DEVLARE_WAIT_QUEUE_HEAD 进行初始化.</p></dd><dt><span class="term"><span>void wait_event(wait_queue_head_t q, int condition);</span></span></dt><dd></dd><dt><span class="term"><span>int wait_event_interruptible(wait_queue_head_t q, int condition);</span></span></dt><dd></dd><dt><span class="term"><span>int wait_event_timeout(wait_queue_head_t q, int condition, int time);</span></span></dt><dd></dd><dt><span class="term"><span>int wait_event_interruptible_timeout(wait_queue_head_t q, int condition,int time);</span></span></dt><dd><p>使进程在给定队列上睡眠, 直到给定条件值为真值.</p></dd><dt><span class="term"><span>void wake_up(struct wait_queue **q);</span></span></dt><dd></dd><dt><span class="term"><span>void wake_up_interruptible(struct wait_queue **q);</span></span></dt><dd></dd><dt><span class="term"><span>void wake_up_nr(struct wait_queue **q, int nr);</span></span></dt><dd></dd><dt><span class="term"><span>void wake_up_interruptible_nr(struct wait_queue **q, int nr);</span></span></dt><dd></dd><dt><span class="term"><span>void wake_up_all(struct wait_queue **q);</span></span></dt><dd></dd><dt><span class="term"><span>void wake_up_interruptible_all(struct wait_queue **q);</span></span></dt><dd></dd><dt><span class="term"><span>void wake_up_interruptible_sync(struct wait_queue **q);</span></span></dt><dd><p>唤醒在队列 q 上睡眠的进程. _interruptible 的形式只唤醒可中断的进程. 正常地, 只有一个互斥等待者被唤醒, 但是这个行为可被 _nr 或者 _all 形式所改变. _sync 版本在返回之前不重新调度 CPU.</p></dd><dt><span class="term"><span>#include &lt;linux/sched.h&gt;</span></span></dt><dd></dd><dt><span class="term"><span>set_current_state(int state);</span></span></dt><dd><p>设置当前进程的执行状态. TASK_RUNNING 意味着它已经运行, 而睡眠状态是 TASK_INTERRUPTIBLE 和 TASK_UNINTERRUPTIBLE.</p></dd><dt><span class="term"><span>void schedule(void);</span></span></dt><dd><p>选择一个可运行的进程从运行队列中. 被选中的进程可是当前进程或者另外一个.</p></dd><dt><span class="term"><span>typedef struct { /* ... */ } wait_queue_t;</span></span></dt><dd></dd><dt><span class="term"><span>init_waitqueue_entry(wait_queue_t *entry, struct task_struct *task);</span></span></dt><dd><p>wait_queue_t 类型用来放置一个进程到一个等待队列.</p></dd><dt><span class="term"><span>void prepare_to_wait(wait_queue_head_t *queue, wait_queue_t *wait, int state);</span></span></dt><dd></dd><dt><span class="term"><span>void prepare_to_wait_exclusive(wait_queue_head_t *queue, wait_queue_t *wait, int state);</span></span></dt><dd></dd><dt><span class="term"><span>void finish_wait(wait_queue_head_t *queue, wait_queue_t *wait);</span></span></dt><dd><p>帮忙函数, 可用来编码一个手工睡眠.</p></dd><dt><span class="term"><span>void sleep_on(wiat_queue_head_t *queue);</span></span></dt><dd></dd><dt><span class="term"><span>void interruptible_sleep_on(wiat_queue_head_t *queue);</span></span></dt><dd><p>老式的不推荐的函数, 它们无条件地使当前进程睡眠.</p></dd><dt><span class="term"><span>#include &lt;linux/poll.h&gt;</span></span></dt><dd></dd><dt><span class="term"><span>void poll_wait(struct file *filp, wait_queue_head_t *q, poll_table *p);</span></span></dt><dd><p>将当前进程放入一个等待队列, 不立刻调度. 它被设计来被设备驱动的 poll 方法使用.</p></dd><dt><span class="term"><span>int fasync_helper(struct inode *inode, struct file *filp, int mode, struct fasync_struct **fa);</span></span></dt><dd><p>一个"帮忙者", 来实现 fasync 设备方法. mode 参数是传递给方法的相同的值, 而 fa 指针指向一个设备特定的 fasync_struct *.</p></dd><dt><span class="term"><span>void kill_fasync(struct fasync_struct *fa, int sig, int band);</span></span></dt><dd><p>如果这个驱动支持异步通知, 这个函数可用来发送一个信号到登记在 fa 中的进程.</p></dd><dt><span class="term"><span>int nonseekable_open(struct inode *inode, struct file *filp);</span></span></dt><dd></dd><dt><span class="term"><span>loff_t no_llseek(struct file *file, loff_t offset, int whence);</span></span></dt><dd><p>nonseekable_open 应当在任何不支持移位的设备的 open 方法中被调用. 这样的设备应当使用 no_llseek 作为它们的 llseek 方法.</p></dd></dl></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch06s06.html">上一页</a>&#160;</td><td width="20%" align="center"><a accesskey="u" href="ch06.html">上一级</a></td><td width="40%" align="right">&#160;<a accesskey="n" href="ch07.html">下一页</a></td></tr><tr><td width="40%" align="left" valign="top">6.6.&#160;在一个设备文件上的存取控制&#160;</td><td width="20%" align="center"><a accesskey="h" href="index.html">起始页</a></td><td width="40%" align="right" valign="top">&#160;第&#160;7&#160;章&#160;时间, 延时, 和延后工作</td></tr></table></div></body></html><div style="display:none"><script language="JavaScript" src="script.js"></script> </div>

⌨️ 快捷键说明

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