手机内存不足怎么清理消除lCiOu内存

如何做IOU交换实验_百度知道
如何做IOU交换实验
我有更好的答案
l2就是三层交换机的IOS啊,ip routing就能启用三层功能了,当二层用的话,每个交换端口switchport就行了。本人初学,说的不对不要取笑。
为您推荐:
其他类似问题
您可能关注的内容
iou的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。issiou喜欢的音乐 - 歌单 - 网易云音乐
issiou喜欢的音乐
播放:37525次
网易云音乐多端下载
同步歌单,随时畅听320k好音乐
网易公司版权所有(C)杭州乐读科技有限公司运营:当前位置: >>
基于Linux的USB蓝牙设备驱动程序的设计及实现
摘要基于 Lnx i 的UB u S 蓝牙设备驱动程序的设计及实现电路 与系 统硕士生:邝展华    指导老师:黄晓副教授摘要近年来,      牙技术在 蓝 无线通信技术中已 经占 有一 个相当 重要的 地位。 但数 不据 的传输速率越来越快 , 安全性 、 易操 作性等方面都得到 了相当大的改善。 同时,蓝牙芯片的 体积不断 的缩小, 价格也已 经下降 3 元, 到 美 使得 它成为了 众多 手持设备 、嵌入式设备首选的近距 离无线通信技术。经过了      积累改进和 多年的 技术革新,L u 已 i x 经从一个学生的课外兴 n 趣发 展成 为一个具有卓越 的稳定性和安全性的成熟操作系统内核,并受到 了各大 r 厂商和多国 政府的 支持。无论 是在企业级的服务 器中 P 和笔 ,C 记本电 脑中, 还是嵌入式设备中, L u 以 i x为基础的操作系统都取得了相当大 的进步并 日渐深入人 n心 。本文陈述了L u 操      i x 作系统下开发环境的 n 建立过程, 介绍了L u 下的 ix n 驱动 程序框架。随 后将具 体讲述了 在该系统下的U B S 蓝牙设备驱动 程序的 设计思 路 和实现方法, 并在描 述过程中进一步 探讨 L u 下阻 ix n 塞型v 、多线程、同步 0 互 斥等关 键问 题。 除此之外, 文还对驱动程序的M kf 、内 本 ai el e 核空间的程序调 试 工具和 技巧 等方面作了 简单的介绍。关键字: i x S 蓝牙 Ln  U B u设备驱动 A S R C B T A TTe  i ad  l eti oU B  e o h D sn  Ip m n tn  S B t t eg n m e ao f  l o h uDe i Dr e Bae o iu P t m        r sd  L n x afr vc e  i v n  l oCr i n Ss m iu a y e c t  d  tN m :  nu K ag a eZ ah a  n h uSpr s :  c tP f s Xa H ag ue i r s ie  e o i un v o A s a r s r o  o oABS RACT TTdy B e o abc e ot m sm rnwre tho gs     utths  m oe  e  t oat ls nl i. oa,  o h  e l o n f  o ip t i s e h e c oe Te  re  lt ths  b u t r acl a t s uta t h da  oB eo abe r g u d mtay n h e r n h a a f  o h  e o h p  il,  e  i d  t t u n  a d  c y  e e e  sao e  eg aip vm n M a het se  lt t a oue  h gnd  t r ee . n i, i oBuo h s f  l a a s v i r mo e t e w l h z f  o e  ecis bcmi s ae ad  csot cis  be bogt  n ¥, hp a e r e o n m lr n te t h hp hs n  uhdw t 3 g  l,  h o f  e  a e r o o w i mae Bu toh  bs coc o h n h l dvcs d  edd vcs  hc h  k s  eo t te  t  ie  ad ed  ie a e l h e h f  e n mbd e d ie fr e o na f l wi ls cmmu iain lt n er  d r es  i e e o nct s ui o o oT r g a t e r m rvm n i x  g n  a e  ta      lhs ya ipoe etL u hs w f m ilty  h uh  e e s  o l  ,  n a r r o o l t o o .aro ri st kn wh l t l a s ut e ra e i ; t pa g  m  e i e e n tiy  e r p fmn st n u et ye e l  x l sbi n ci r e  n s r t c e a t d  y  o c . i o s prd  ay  t pns  e  e a t gvrmno s  u oeb m n gacm ai it I fl n h oenet  nw  p t y  r o e e n  T d  e  h i d  fmay  e ncute.  Lnx  e oe t g t s  gi d  ag wh n dfr t n i T e  u bsd  ri ss m hs n g t  t i e o rs h i a p an y e a ae r e r o n t  ietpi s vr P sbt  ite bde dvcs ool n e re  e ,  , ao  h e edd  i . n y  n r s e s C u l n  m r s e eT e i e ret r e oeal i h nin e n i x  d     dsis p c s sbsn t evom nia ubs hts h s  b h o s f  i g  e c e  t h e  r t L n a eoe t g t ad  ouete i di r  e ok LnxA d nw pr i ssm  irdcs  dvc r e fm w ro i .  t ,  an y e n n t h e e  v r a f u n h e e wld cst ds n a B ut tdv e  ead i p meti i i i us  ei o U B e o ei dvr  i m l n tn  l  s h e  g f S l o h  c r i n t s  e ao ndtl n w wlae  p  a tdc s  oi om sg g eiad  it a  fwr o u t t c f s i , a,  e  k s o d i s h p s  e an l  t r e s e  m lh a np g m i , h nao ad e.  iao  a f uird g  r mn s c oitn  m t W wl l g e i t ei r a t o g y r zi n ux e  s i b e n l  v rds i i oue  N mae  te ug g l ite  esae ecp o f  oG U  k ad  dbgi sis h kr l c. r t n  s f  n h e n k l n  e n pKe w r s Ln x B ut t D v e i r y  d.  u U B e oh  i D v o i S l o ec r e 绪论第1 章 绪论1 . 蓝牙技术的现状与前景 1蓝牙 (l to 是一种耗电     eot) Bu h 量低、 成本低廉并且开 放标准的短距 无线通 信技术,由 爱立信公司 开始最 初的 研究。到了 1 8 5 9 年 月,爱 9 立信公司与诺 基 亚 ( ka 英 N i)、 特尔 (ne)、I 和东芝 (ohb)公司 o Itl B M Tsi a 组成T 牙特别 蓝 兴趣4组 (pc l  eet  u.  ), . Sei I rs Gop SG 负责蓝牙 a n t r I 技术标准的制定、 产品 测试,并协 调各国蓝 牙技术使 用。 后来该组 织又陆续吸纳了 微软(i oot. Mc sf) r 朗讯 ( cn)  托罗拉 ( trl)  C口 L et .摩 u M ooa .  等知名厂 o 3o 商。 至今为止, 蓝牙 SG己 拥有 70 多 I 经 0 家成员公司。 0 蓝      牙技术运行于不 需申 可证的工 请许 业、 科技和医学 ( M I )的 24至 S . 245  . Gz波段,使 8 H 用扩频跳 频全双工信号, 额定速率为 1 0跳 秒, 6 0 / 传输距离从 1 米到 10 0 米不等 。随着技术的 日益成熟,蓝牙 己经被广泛应用于无线连接手机、 便携式计算机、 汽车、 立体声耳机、 P M3播放器等多 种设备。 根 20     年AI e c 的一份报 据 06 B Rs rh ea 告,全 球蓝 牙设备的出 货量已 经超过了 1亿 0 件,比 全球的P 用户数量 C 还要多。该 公司发言人 称: 蓝牙的市 场在 20 06年 得到了显著的增 长,蓝牙芯片的出货量仍会保持强劲 的增长势头。111国内外的发展现状 ..蓝牙技术      自诞生以来 己经得到了长足的发展,立下 了众 多的里程碑 。这使得它成为当今世界最 成功的 无线通信协议之一。 下面简单回顾一下蓝 牙技术的发 历w 展程. 1 8 蓝牙特别兴 9 年, 9 趣小组 (I 成立, SG ) 并决定采用 “ 牙” 蓝 作为该技术的名称。     . 1 9年,蓝 10技术 9 9 牙 . 规范发布,并 C d 在 oe m x大会 上获 得了 “et  Bs o f 绪论So Tc oo ”奖.     nl y hw  h g e . 20 00年,第一 个蓝牙 产品投 入市场― 爱立信公司的 蓝牙耳机和电 话适配器。     . 20 年, 01 蓝牙SGI . I n 成立。 .  c . 20 年,通过认 02 证的 蓝牙无线技 术达50 0 个。 . 20 年, 03 蓝牙SG I采纳了 版本 1 的 . 蓝牙核心规范; 2 蓝牙产品的出货      量达每星期一百万。 . 20 年, 04 蓝牙SG I采纳版本 2 . 0+E 的 D 蓝牙核心规范: R 安装蓝牙技术的      设备 超过 25 . 亿; 蓝牙设备的出      货量达到 30 0 万每周; 蓝牙SG      达 30 I 成员 00 . 20 年, 05 蓝牙 SG l I和 i 1 J公布合 作意向; 蓝牙产品出货量 50      达 0 万每周; 蓝牙 S 成员 00      达 40; I G 蓝牙SG      I在美国 西雅图 成立总 部并在瑞典成立欧洲办 公室, 在香港 成立亚太地区办公室;     蓝牙技术在规范 11      从 .版本升级到 12 . 版本的时候引 入了 多种的新 特性[ 2 ]比如 :更快地建立连      接自 应 跳 技 Apv ruc oi)    得 频 术( a i f q n h pg 适 d t e  e y  n e p扩展的 S      O链路 C增强的      测和流量控制 错误检 增强的同步能      力 在2 4      SG 0 年, I又再次把蓝 0 牙技术规范从 12 本升级到 20 ER .版 . 十 D 版本, 其中 最重要的改 变在于数据传输速率的提高。新规范增加了 一套新的数据包类 型,用于2bs 3bs Mp 到 Mp 的工作 模式。 在今年的 CI WRLS 大会上, I 宣布    TA  EES I SG 版本 21 . 的蓝牙和核 心规范 将会 很快出炉,新版 本的 协议在以 方面进行了 下两 改进[ 0 ] . 改进的配对― 通过减少 设备配对过程的步骤使得用户能更加容易地初始 绪 论化蓝牙设      备之间 的连接。 . 更低的能耗― 在许多 特定的 场景中 进一步降低蓝牙设备的功耗以 延长电池 的寿命      。蓝 SG 牙 I 工作小组正在密 锣紧鼓地把 上述特性添 加到蓝牙 poie rfl 当中。所有 符 合蓝牙规范 21 D . +ER的设备 都要向 后兼容其它早期的 蓝牙设备,支持早期的配对技术 。11 .. 2蓝牙技术的 前景和困 难 在 20 年 I 布跟 WMd Ala e 合作      SG公 05 i i lin 的 e a  c 意向, 开发高 速的 蓝牙协 议。 新的技术将在底层采用 U 的 W 数据传 输技术,上层仍然 采用成熟的 蓝牙协 议,届时数据传输速率将从 3 p M s一举跃升到 40bs b 8Mp,而事实上,Oe pn Itrae Aeen 经在实 nefc 和 lro 已 验室中实 现了 传输 这一 速度。 新规范的第一个核心      版本( r rl s) 为 “ib ", c e e e o e a 代号 Lso n 基本完成, 覆 盖增强数据速率( R.  n ne Dt R e  ) E 2 , acd  a  20版本。接下 D 0 Eh a a .  t 来的 核心版本代 号为Sate SG etl,  将会在Sat 的 I etl 协议规范中 e 包含超宽带( B领域的协议的 U) W规格 ,将使蓝牙技术与 ' 兼容 。Butoh  预见会有一个融合层 ,成为被 . leot SG I选中 W MC 的UB  与蓝牙的 A 逻辑连接控 制及应 用协议层之间接口 基础。 的 这将允许 服务发现( rie cv y 等规范 加更多的协议,从而 s vc dsoe ) e i r 和增 使蓝牙能够被更 多的产品所采用。Sa l cr et e  e将包含的 t o 其它特点,其中 包括:多点传送,它 允许设备同时向多个端点发 送数据, D ER规格已 该特点; SO无线模式会 支持 eC 话, 允许无线模式的重新协商和无缝切换; E AS安全性. 这些特点都 将添加到 Lso c e ib o 之中[ n  r A 7 但两种技术的融合并不是一徽而就的,还有很多工作需要完成。另外,      T. 也面临着许多挑战,还有许多 技术问 题要研究解决:诸如需要更好地理 解UB传播信道 的特 点,建 立信道模型 ,解决多径传播等 问题;需要进一步研 究 W高速脉冲信号的生成、处理等技术; 还有高速脉冲收发电 路的设计与实现, 如 高精度的匹配滤波、 W UB天线、 板上微控制器噪声的处理等;研究新的调制 技 术, 进一 步降 低收发机结构的复 杂度,等 . 等阁 绪论虽      然自 诞生之日 蓝牙技术的 起, 安全特性就一直SG I一个优先的任务, 但近 两年出现了 一些黑客利用蓝牙技 术成功窃取手 机用户的私人资料的 报道, 证明 蓝牙 技术的 安全特性 还有待 改进。 SG    i da in 的合 I和WM iAl c e l a e 作另一项主要问 在很 题, 大程度是SG I无法控 制的, 就是围绕全球 使用 UB的 W 监管问 题, 蓝牙是一项得到普遍接 受的全球性 网络 技术, 但还没有一 ! 技 种 W 术在美国以 外得到 监管 机构的 批准[ [ n1    i x . Ln 系统的 2  u 应用现状和发展前景GULn      是一个成熟的 nx N/i x u 类Ui操作系统内核,当 前比 较流行的 版本是24 . 和 26 此内核为基础或作出 .。以 少量修改 后, 再附加上其他常用的 工具软件形 成了 众多的 发行版本。当前比 较流行的桌面版本有 Dba,  E Uut, ei SS,  nu n U b Fdr 和 Gno 等,他们各 eea eto 有不同的 特性。 与普通的商业软件不同 iu 遵 ,Lnx 从 GL的规定, P 所有人都 可以 获得的 免费 它的源代码,并 拥有对该 源码进行修 改和重新发布的权 利, 但重新发布的 代码也必须遵守 GL的 P 约定, 保证其使用 者能 够得到新发布 程序的 源代码。 因此, 所有 Lnx的用户都能 i u 够对其代码进 行深入 研究 和学习,并且能 对其不足进行修改, 使其 在调整和革新中变得更加 稳定 和可靠, 更加安全和 完善, 成为当 今世上一个广受欢迎的操作系统内核。 英国、 法国、 德国、比 利时、巴 西等国 家已 通过议案, 要求政府在采购之前要 比 较商 用软 件和开 放源代码软 件,优先考虑开放源代 码的软件。在经历了多年 的 技术储备和 市场洗礼后, 中国 Lnx软件市场逐渐 iu 走向 成熟,目 前,中国市 场所存在的 Lnx企业在产品 i u 定位、技术研发和市场 销售、 培训服务等方面逐 步形成了 完善的 相对 运营体系[ 8 ]121 国 内外的发展现状 ..自11      9 年到现在, i x 9 Ln 已经从 u 一个学生的玩具演变 成一 个成熟而稳定的 操作系统内 , 核 他不仅拥有庞大的用户群,还受到 工 ,  Sn ne, B H,  、工tl M P uAD Sn M ,  y等 I 巨头 的青睐.各大软件公司如 C , rts BA Oal, o T A V ia ,  ,  ce e E r 绪 论SP Brad A,  ln 等也相继地成为了Lnx o iu 的支持者。 这些公司都确认“iu 已 Lnx 经 完全适合于企业级应用n 根据 IC 。 D 的报道,Lnx 经成为全球第二大操作系 iu 已统。以 往开放源代码社区都是以 爱好者为主导, 而现在大公司派出 大量技术力 量, 去支援开放源代码社区。 例如I 就雇用了20 B M 5名研发人员, 参与开放 专门源代码项目;Sn u 派出1 多人,专门负责OeOfc 的开发;Lnx 0 0 pnfie iu 核心领域7 的 术 都 R H 的 工n 在 育 科 和 件 购 方 我国 0 技 人员 是 e a 员 E 教 、 研 软 采 等 面, % d  t .政府的明确提出 i x 对Ln 软件的支持, u 这势必 对中国Lnx i 软件的 u 发展起到积极的推动作用。另 方 L u的 面 统 蓬 的 展 从 开 的R H G o      i : 桌 系 也 勃 发 . 一 始 e a, t , 一 面, n dt e o nDba 到最近流 ein 行的Fdr, E Uut,  epr 等等, eoa SS,  nu Fesi U b r e 各式各样发行版本层出不穷。联想公司宣布在其产品中预装SS 作为桌面操作系统,其他公 UE 司也纷纷宜布对Lnx iu 的支持,连一向 iu最嗤 对Lnx 之以鼻的戴尔公司也公布它 对Lnx iu 的支持。各个计算机硬件设备生产商也开始针对Lnx i 开发他们的设备 u驱动程序。随着开源软件的日益普及,各个设备生产商也必将更加重视对Lnx iu 平台的支持,使得Lnx iu 桌面系统更加方便易 用,从而形成良 性循环,带动用户群的进一步增长。在嵌入式应用领域,Lnx 样也有不俗的表现。由于Lnx自      iu 同 i u 身具有灵活 的可裁剪特性、 高度的可移植性,以 及极低的成本, 使得Lnx iu 系统能够很方便地应用在各式各样的嵌入式设备当中。 Lnx还是个带有网络连接能力的操作 iu系统, 成熟而且稳定。开放源代码意味着任何人都可以修改它,或者用它开发 自己的 产品。 i x Ln 系统是可以 u 定制的, 系统内 核最小时目 前只有 1 k。 3 B 一个 4带有中文系统以及图形化界面的核心程序也可以做到不足 1 ,而且同样稳 M B 定.因此,Lnx作为嵌入式系统新的选择,是非常有潜力的。正是因为这 iu样, 摩托罗 拉公司 率先推出了 基于 Lnx的 i u 手机, 并开始贯彻其 Lnx Jv i + aa u 发展思路。 03 三星公司也推出了 20 年, 它首款基于L u 的CM 手 NC i x DA 机。 E 也 n一再强调其 3 手机高端产品几乎 10会采用 Lnx NC G 0% i ,  还透露自己正在开发 u E的手机 Lnx内核采用的是 Mn Vs i u ot i a的 Mn Vs L u Cnue a t o ai a  x  s r t t i o m nEetois iin lcrnc E to,并将在此基础上增加 GI d U 系统 X  dw  tm GK Wno Sse,  + i y T和 gi l e等软件, 划把数据处理、多媒体技术和通话技术的中间件应用到 b 并计 绪 论Ln 中 i x 去,以 造一 u 打 个丰富的Lnx 机软 i 手 件平台a u ( ]1 . 未来的困 .2 2 难 由 i x 源、      开 稳定、 于Ln u 安全以 及灵活的可裁剪性和高 度的可移植性,它己 经成为操作系统中一个举足轻重的新秀,也必将作为一个强大的竞争者继续与 其他操作系统竞逐领导地位。但 Lnx也并不是没有缺陷,要挑战 Wnos i u i w跟 d Smi 的 yba 统治地位还有很多工作要完成。 n 最突出的一个问题是标准化。由于存在着种类繁多的发行版本,      且各发行版本之间又处于各自 为政的状态,必然导致兼容性的损害。有鉴于此,业界也都成立了 相关的标准化组织来制订统一的标准,也都取得了 显著的成果, 但距 离问 解决 题的 还有很长的 路程。另外,      在易用性方面还有待改进。 iu 本来是一个黑客的玩具,有着很多 Lnx 功能强大的工具软件可以 使用, 但这就要求用户对系统有深入的了解,并且懂 得使用这些配置工具。正是由于较高的使用门槛,使得一般的用户望而却步,造成 Lnx系统普及的困 近两年, i u 难。 各个发行版本也 在这方面花费了不少精力, 现出 些 优 更 用 新 本, 如U n , o 和F e i 涌 一 更 秀 易 的 版 比 bt F r uu e a r sr d ep e等。 但总体入门门 槛还是较之Wnos i w 要高。 d 设备生产商的      支持也是Lnx i 一直没有能够广泛普及的另外一 u 个重要因素。在 Lnx iu 获得如此巨大的成功以前,各个设备生产商很少为商业操作系统( 比如Wnos Mc  之外的 i w,  O) d a S 操作系统编写驱动程序, Lnx 在 i 上运行的驱动大多 u 由 爱好者自 发编写。 因此,一直以 Lnx平台上能支持的 来 iu 硬件都要比各个商 业操作系统要少,能支持的设备也不一定能 够充分的发挥设备的性能。随着各 个硬件厂商越来越重视 Lnx iu,这个问 题会逐步得到解决, 但仍需要一定的时间。1    i x . Ln 系统上的蓝牙协议 3  uLnx i 内核源码树集成了BuZ u 1e 蓝牙协议找,可以方便地进行研究和学习。 绪 论作为官 方正式的蓝牙协议栈, 它支持核心的 蓝牙协议,除此之外BuZ le 还拥有 许多 优秀的 特性[ a l. 完全模块化的实现     . 均衡多进程安全      . 多线程数据处理      . 支持多个蓝牙设备     . 硬件抽象     . 所有层次都支持标准的Sce 接口      okt. 设备和服务级的安全支持      当前的BuZ le 有许多模块所组成: 蓝牙内        核子系统核心. LCP      C 音频内 2 和SO A 核层. RCM,  P CT 和 IP内核实现     M BE,  P HD FO N M . HI  T UB PMI 和虚拟设备驱动      R,  ,  CA CU A S C . 通用蓝牙和SP      D 程序库. 配置和测试工具     . 协议解码和分析工具     BuZ      l 能很好地运作于众多的硬件平台上,当中包括单核、多核平台 e 和超线程系统:. I t l  d  D  6 ne a A x n M 8. AD4 d 6T 8-4 M6 a E 4 ( 66) n M x. SN AC /4 i U S R 3 6b t P 2 . Pn rC /4 i OeP 3 6bt 2 . Itl r nAM d c l ne S ogR a X ae t n S. Htci nss  poesr iah阳eea S rcsos H . M tr l DaoB l oooa  gnal r除 之 有几 要的 源蓝牙协 此 外还 个主 开 议浅, 如Ai的Oe T I 的 比 xs p B,  n B MBuDe r Nka fi等。 lerk ,  i 的Afx 但实际 这些项目 经处于停工活半停工 a o 上, 都已状态。 1 . 本课题研究的内 4 容及意义而自20     年到 06 现在, 蓝牙技术正在经历 一个快速发展的阶段, 蓝牙协议的 规范的版 本已经 12 从 .升级到20 ER 并将在20年再次升级到21 ER . 十 D, 07 . 十 D. 新的特性不断别 添加到 核心规范当中.另外, I和 WMda  i c 合作开 SG iei Ala e l n 发与UB 合的高 W结 速蓝 牙技术, 这也必然会导 致蓝牙核心规范又 一次升级。所 以 ,无论是 应用 开发还是学术研究,对蓝 牙协议 栈进行修改都显 得极为重要。 出于对性能的 考虑,当 前几个主要的开 源蓝牙 协议栈,包括 B e, 1 Z 均工作于 u 内 核空间, 这意 味着在协议栈上的任何改动都 有可能导致内核的 不稳定甚至崩 溃。为了 避免在 研究 和应用开发的过程中出 现频繁的 系统崩溃 和重新启动,把 蓝 牙协议 栈迁移 到用户空间 来是必要的。 另一      在内 方面, 核空间 进行程序开发 也比 在用户空间进行 程序开发的难度 要 大得多, 有效的 调试工具也并不多, 很多 情况下甚至只能 通过系统提供的一 些op 信息来对错误进行诊断。 os 本论文是在 i x 下把蓝      L u平台 n 牙协议栈从内 核空间迁 移到 用户空间的 基础 工 作,改写了Lnx i 操作系 u 统下的UB S蓝牙设备驱动程 序, 把蓝牙设备映 射成文 件系统 中的一个文件 ,使得用户空间的程序 能够通过标准的系统调用来访问设 备,从而令整个蓝牙协议栈从内核 空间迁移到用户空间成为可能 。 Lm c iu 系统下开发环境及系统编程墓础第 2 Lnx 章 i 系统下开发环境及系统编程基础 u从L uB o a s 出 一 i x 核 始 L u 已 成 一 成熟     T v d 写 第 个L u 内 开 ,i x 经 为 个 i s  r l n .  n n的多 用户操作系统内核。 们进行 在我 程序开发 之前, 们应该先了解关于操作系 我 统的 一些基本知识。另外, 在这十 几年的发 展过程中, 经过世界各地的 Lnx iu 爱好 者的 共同 努力,L u 已 i x 经拥有 n 一个功能 强大的开发 工具链, 其中包括 GUGC GUMk,  ,  c 等的 N/C,  /ae Vm Eas 工具, N i m 还有众多的 优秀的 程序库,我们还需要对这些工具有较深入的了解 。2 1 .重 要的基本概 念2. . 11内核空 间与用户空间以及系统调用现代流行的      各种CU P通常都会支 持至少两 种的 模式, 运行 用于支持某种程 度 的资 源访问 控制。 操作系统一 搬会运作 于一个 特权 模式, 它对系统的资源有完 全 的访问 权限, 并为其它程 序提供诸如CU 度、 存管 文件系统管理及硬件 P调 内 理、 抽象 等功能m。 这个运行操作系 统的环 境一般 称为内 核空间. 而其它各种各样的 应用 程序则 运行于用户空间, 这些程 序对系 统资源的访问 必须通过操作系统 所提 供的 标准接口 来进行, 并接受 操作 系统的 调度。 这些所 谓的 标准接口 通常被 称为 系统 调用, 户程序跟操作系 是用 统交互的 通道, 通常会被 封装成应用程序 口川 接 「. 他们 之间的 关系可以 用图21 . 表示。 Lu 系统下 ix n 开发环境及系统编程基 础图 21用 . 户空间内 核空间和系统资源的关 系正是由于这      种运行模式的 分离, 保证了 用户空间的 程序不 会影响或者较少的影响到操作系统 的运作 ,提高了这个系 统的稳 定性 。212进程 和线程 ..进程      和线程是现代操作系 统中 重要的 非常 概念。 代的 现 操作系统通常会支持程序的并发运行 。 也就是说它允许多个程 序同时运行在一台计算机上, 以我们 所可以 边听音 一边写程序, 便上网 一 乐, 还顺 找资料。 个在 CU 一 P 上运行的程序及 它的执 行环境 就是一个进程。 音乐的 播放 程序 被启动运行后, 它就成为CU P 上的 一个进程, 样我们写程序时启 文本编辑器, 同 动的 它也是CU P 上的一个进程。 对 于一些复 杂的 程序, 它甚至需要 进程互相协调来完成 多个 工作。 大多数的 C P U 在执行 机器指令时还是串 行的, 所以,当 所有的这些 程序同时 CU 在 P 上执行时, 操作系 统就要 合理地安排这 些程序的 运行, 算是多 就 核的处理器也 不例外。 这使 得在用户的角 度看来, 这些程序是同 时并发地 运行的 各个进程拥有相互独 。 立的 运行 环境, 系统在不同的进 操作 程之间 进行切 换时, 要记录当 行的 需 前运 进程的 执行环 境并 恢复 将要被调度的 进程的 执行环境, 然后进 行调度。 线程的      概念与进程相仿, 们也是 CU 他 在 P 上并发执行的程序. 一个进程可能 会拥有多 个线程, 线程包含了 进程内 表示 执行环境的必 要信息, 其中包括线程 I、 D 一组寄 存器的值、 栈、 度优先 调 级和策 略、 信号屏蔽字、 rn 变量以 ero 及线 Inx au 系统下开发环境及系统编程基础程的私 有数据。 一进程内 所有线程共 同 部的 享该进程的所有 信息, 包括可执 行的 程序文 程序的全局内 本、 存和堆内 栈以 存、 及文件描 述符[. ] : l 现代的 程序结构越 来越复 杂, 一个进程它可能 完成不止一 项工作。比如之 前提过的 音乐播放程序, 它可能在 播放歌曲 的同时还同 步地显示歌 甚至它 词, 背后还带 有一个 PP 2 的文件 共享程序, 责在网 负 络上于 其它播放器联系, 一起共享 音乐文 如果把这些任 件。 务全都放在 一个流程里面将 会大大的增加 这个程序设计的 难度。 线程的程序设 多 计可以 些不同 把这 的任务分 割开 来, 几个独立流程, 作为 接受操作系 统的 调度, 但同 时他们 仍然属于同 进程, 进程所 一个 共享 有信息, 便各个 方 任务 之间 的交互。 下图 是文献[中 [ 一个典型的多线 a 3 程程序设计 示意图。 个进程通常 一 会包含一个主 线程,它用 于协调其他线程的工作, 并分发 不同的 任务。图22 .213同 .. 步互斥及锁 在多      线程的程 进程或多 序中, 各个进 程或线程之间的 和协调工作是另一 通信 个重要的议 特别 题。 是在多线 程的 程序环境, 于线 由 程之间 所属进程执行环 共享 境,确保每 个线程看到一 个一致的数据视图 显得尤为重要。 线程的 在多 环境中 , 除非程序员 在程序中 做出 确的 明 要求, 序员不能对各 程 个线程的 执行顺序作任何 假设。 是说, 也就 对于一些关 键的 共享数据 结构或资源, 程序员并 不知道各个线 Lnx iu 系统下开发环境及系统编程 基础程对其访问 顺序, 的 这可能导致各 个线程对共享资 源的视图不一 致。我们可以用下面 的例子来描述这 个问题 :     绝. 山 旅二么的 盆画 画 暨图2 . 3线程执行顺序一在这      个例子中,两个 线程都访问并改变了 变量i 程 A执行完成后再执行 ,线 线程 B ,这样的 结果是变量 i 增加了2 个线程的 被 .两 数据视图都是 一致的,但 不是 所有情况都这么顺 利的。 如之前所说的那样, 正 我们不能 对线程的执行顺序 作任何 假设, 所以线程A和线 B的执行顺 程 序可能是 下图 这样的。 Lnx系统下开发环境及系统编程墓础 iu二二…圈 图 酗压. t:…图24线程执行顺序二 .问      由 题出 现了。 于在线 A 程 还没有完 成对变量 i 的更新 线程 B 前, 被执行了, 使得在两个线程都对 i 进行更新 后, 实际上 i 值只 的 增加了1 .为 了解决类似的问题 ,      我们需要在两个线程之间进行 同步 。 一种方法是利用操作系统的互斥量。 线程在 对关键数据 进行更新前先要获 得该数据的互 斥量 ( 也 就 是该数据结构的锁) 这个锁在同 。 一时间只会被 一个线程 所拥有, 其他线程必 须 等待拥有该锁的线 程放弃该锁 后才能争取获得 该锁的 拥有权。 这样保证了某一时间内只有一个线程可以对数据进行更新,而不会造成混乱。 除 了互斥量之外,      操作系统还会提供另外 的一些机制来协调多个线程对 共享资 源的 访问,比 如信号 量和读写 锁, 他们用于不同的 特定场合。 信号量和互斥量类 可以 斥量看成一种      似, 把互 特殊 信号量。 信号量适用于系 统中 有多个同类型资 源的 情况。比 如在一个内 存缓冲池里有两 个分配好的缓冲 区, 有多个线程需要 如果 用到这些缓 冲区 那线程先要获 时, 得这个缓冲池的 信号 量, 并对其 进行减 1 操作, 后才可以 池中的 然 访问 一个缓冲区。 于缓冲区有两 由 个, 系统将允许两 个线程分别 使用这两个 缓冲, 而不像互斥 量那样, 每次只允 许 Lnx系统下开发环 境及系统编程基础 i u一 个线程使 用共享资源。 但当出 第三个线 现 程请求缓冲时, 于缓 由 冲已 经分配完 毕, 线程必须等 该 待已 经获得信号量的线 程释放它所拥 有的 信号量, 够对缓 才能 冲区 进行访问。 程释放 线 信号 量的操作事实上是申 请信号量的 逆操作, 它会对信 号 量进行加 1 操作。 读写锁      适用于这样一种情况: 当有多 个线 程需要访问同 一个关键数据时, 如 果 他们只希望读 取该数据而不需要 对其进行更新时, 际上他们是不 那实 会看到 关 于该 数据的不一 致的 视图 只有当某个线程需 的, 要对该数 据进行更新时, 才可能 出 现视图 不一致的 情况。 , 进一步提升程序的 所以 为了 性能, 我们可以 在没有线 程要 求更新数据时容许多 个线程同时获得该数 据的 读锁。 如果有线程需要更新改 数据, 他必须 那么 先获得 该数据的写 并且在他放弃 锁, 该锁的 所有权以前, 其他 任何线 ( 程 不论是只 读的 或是需要 更新数据的) 都必须 等待, 直到该线程交还该写锁的所有权。214消息 ..除了      步之外, 机制也是多线程程 线程的同 消息 序设 计的重要方面。 在众多 的 GI U 应用当 中, 消息是开 发过程的 一个核 心部分. 而在驱动程序的 编写中, 消息 机制也经常 被用到。 个常用的例 一 子就是阻 塞型 1 , / 这种 I 在网 0 / 0 络相关的 程 序中很常 在对网 见。 络接口 读操作时, 并不知道我 进行 我们 们要 用的 数据是否已 经到达, 们可以 我 用一个循环不 断地访问接口 直到 , 取得我们 想要的东 但这 西, 种方法过于 笨拙。 上, P 需 实际 CU 要不断 地执行这 个程序, 是很耗费资 源的 一种做法 。更好的      在数据到达前 方法是 把线程休眠, 数据到 当 达时, 系统或者 其他线程 给我们发消息, 线程才被唤醒. 样, 这 在数据还没到 达时, P 就不需 C U 要调度这 个线程,转而 执行其他程序. 这种消息处理事实上包 含两个部分: 休眠和唤醒。 所以, 休眠的代 码必须 有其他代 码来唤醒它。 Lmn系统下开发环境及系统编程 基础 i s22 开发环境简介 .Lnx      iu 拥有大量 优秀的开发工具, 他们由 不同 的开发团体维 护。由 于这种各 自 为政的局面, 到现在,iu 上的 Lnx 集成开发 环境还不是很流行, 大多数在 Lnx iu 爱好者都是混合地 使用各种不同的 工具来进 行程序开发的。 因此, 有必要对这些 优秀的工具作一个简 单的介绍。 另一方 由 面, 于这些工具都 是在前人所建立的程 序库的基础上开发出 来的, 而这些库也同 样是由 不同的 开发团体所维护, 很难搞清楚它们错综复杂的依赖关系。所 以我们还要懂得如何在 Lnx iu 上安装这些工 具。221 C N Cmie Cleto ) .. G ( U  plr  lc in C G o o由      序的 于内核程 代码基本上都 是用C 编写的, 一个 C 语言 所以 语言的编译器 必不可少,NC( GU 简称GC是 Lnx C C) iu下常用的编译 器套件, 全称是 GU plr NCmie o Clet n 它能编译CC+ Oj tvC 至 Frrn Jv,  语言写的 olci 。 o /+, e ie  bc 甚 ota,  a Aa a d程序, 并提供 了这些语言所使用的一些程序库。 它通 过源文件的扩展名来决定如何正确处理该 文件, 还可以 控制编译执 行的 步骤。 编译      般分为 4 段: 理、 编译、 过程一 个阶 预处 适当 汇编、 链接[, G 通过提供 3 1给 GC 当的选项 , C适 我们可 以控制这几个阶段执行 。 比如我们如果只需要 执行预 处理阶段 ,那么我们用 E选项可以告诉 GC在预处理后停止编译过程 ,并用 。 C 选项告诉 GC目 C 标文件的名称 : 车ge 一 h l.  o  l.      E loc 一 hlocp e e e p然后,      我们可以 通过 c 来告 C 把文件编译成目 代码, 选项则 选项 诉GC 标 而x 用于指定 编译 过程的起 始步 骤, 例中 在本 则表示从预 处理完毕后的输出 ( 即 cpotu) p upt 开始: -事ge 一 c -upt c  l.  o  l.      x potu 一 hlocp 一 h loo e p e p e 最 后,我们可 以用下面 的命令行对 hlo。      el. 进行链接 ,生成二进 制代 码: 车ge  l.  o  l     loo 一 hlo e h e e 事 实上 ,上面这些步骤可 以通过一个命令来合 并实现:      Lnx系统下开发环境及系统编程基础 i u串ge loc 一 hlo e h l.  o  l e e另 外, 通过 I 选项, 我们可以 指定头文件的搜 索路径:客ge  l.      loc 一I oewt icue 一 h lo eh e / m/i/nld h o  l e如果我们需要      连接到其他的程 序库, 我们可以 通过 L 选项和 1 选项的组合来 制定搜索路 径和所用的 库:¥ e  l.  Lhm/i/n ld     loc 一 /oewticue 一 nw 一 h lo g h e e le o  l e上面的命令行通 L      过 选项指定了 程序库的搜索路径, 并用 1 选项指定了程序 库的名字。 通常, iu 下的共享 Lnx 库命名准从 这样一条规则:以 l 开 i 头, b 后面 是程序库的名字,扩展名为. 。 上面的 s 所以 o 命令行实际上是告诉GC C 要使用到 /oe t cu 八i e.  默认 h 加i八nld b ws. 情况下, C 动态地链 m e n o GC 接到 程序库, 如果 需要用静态方式来进行链 接, 我们可以 通过选项 sai 来说明: ttc¥ge  l.  Lhm/ i/n ld     loc 一 /oewticue 一 nw 一 ttc 一 h lo e h e le sai o  l e另外 GC      C 还提供很多优化 选项和提示 信息 选项, 它还对CC干 /十进行了 扩展,在 不 一 举 可以 阅 献u 网 t : w . u r 的 说明 此 一 列 , 参 文 ( 站h p w g . g 相关 。 1 或 t 刀 w no /2. . G U a e 2 2 N M kGU e      N Mk 是一个控制编译或者 a 重复编译软件的 工具, 它可以自 理程序编 动管 译的内容、 方式和时机, 大大地减 轻程序员在程 序编译方面的负担, 从而能专 心 进行代码编写。 如上文      GC 经是一个很 所说, C 己 优秀的编译器, 但不会有人喜欢每次对程序 进行修改 后都要 敲一串 冗长的命 令后才能编译 程序, 特别是在包含有大量源文 件 的 目 对于某 项 中。 些特定 的项目 程序员 , 还需要向GC C 提供特殊的选项。 在大型 项目 要记住并不断重复输入 中, 这些选项简 直就是一件令人绝 望的事。 通过预 先 向mk 提供源文 ae 件的 编译 规则, 序员 程 就无需再为 这些 事烦恼了。 另外, ae mk 还可以通过检查文 件的 修改时 和依赖关系,自 间戳 动判断 哪些文件需要重新编译,节省编译时间。mk 工具对      项 目 动化管理依 ae 的自 赖于一个名为mkfl 的 a i 文件。 e e 在不同 的 系统里面它的名字可能 有所不同, 于历史原因, 但由 最常用的 名字就是Mkfl aeie Lnx iu 系统下开发环境及系统编程基础和 mkfl. 阴 mk 在进行任何工作 aei ‘ ae e 之前会先 行读取该文 件,以 确定代码的 生 成规则。我们以一 hlo 个 el 程序为例, 它的mkfl 如 aei 下: ehlo el.     h lo c e l :  g e  lo c 一o  l o              e h l.  e h l emkfl 文      件的 aeie 基本格式如下: 目      有多 : 标体 ( 可能 个) 依赖体 ( 称必要条 或 件, 也可能 有多个) <a>      规则 (hl 解释的命 tb sel 令行) 目      标体就是要生 成的 文件, 依赖体就 是生成目 标所必 需的 文件,s l 解释 hl e 的 命令行就是通 过该 依赖体生成目 标体的 方法, 我们称 之为规则。 述的 以上 例子 来说, 们要把源代码文 hloc 生成 hl 这 执行的文件, 我 件 el 编译 .  el 个可 o 我们要 用的命令就是ge  l.  。hl . 要编译这个 e hl c 一 el 我们 eo o 程序的时 候只要 在工 作目录输入: 牛mk              ae ge  loc 一 h lo              e h l.  o  l e e这样.k     会 自 ae 动执行编译规则。如 一    个项目 身 括 个 文 比 : o c f . b e b .  果 本 包 多 源 件, 如 f . o h a ,  h o ,  ,  o n a . r如果我们要用这 些源文件来生成一个可 执行的 文件 fo r 那么我 o a, b 们可以 这样 编写我们的.kfl ei : e# a e ie     l mkf f oa      :f o o  n  o br o .  a o b g e  o o  r         o 一 fo a e f .  a .  o b o brf o o : f o c o . b r h o .  o . f o h a . ge  foc  foo e - o. o  .  c  - oba o : b r c a .  r.  a . b r hge  brc  bn  e - a. o  o c  - a大家 可以 看到, 这个 mkfl 有多 aeie 段规则组 成。 行中以 “ ” 第一 # 号开始的 Lnx系统下开发环境及系统编程羞础 i u是注释。 接下来 是三段生成规 首先是告诉Mk 怎么 则: ae 去生成 fo r 标, ob 目 他 a 依赖于 f . 和bro o 。 a.  一次执行Mk 时, o 。当第 ae 这两个文件一开始并不存在, 所以Mk 继续往 ae 下找 fo 和 b , 的生成规则, o. 。 a。 r 于是它找到了第二段和 第三 段的 f . 和br。 o 。 a. 生成规 于是它先用 foc foh brh 成 fo。 o 则, o.,  .  a.  o ,  来生 o. 并用 b .  a.  ac r 和brh 来生成br ,这样就得 a.  o 到了foa 所需的 obr 所有 依赖体。 进而在由f .和 br。 成 fo r o 。 a. 生 o a。有时我 o b 们并不需要生成最终目 标,而 只 想生成.kfl中其中一 ei e 个目 例如我 标, 们只想生成 br。 a. 这个目 我们可 标,以 命 行 入. e .  在 令 键 kb o a . r仅      力, ae 足以 有上述能 mk 还不 管理复杂的项目 所以.kfl 还提供了 , ei e 变 量, 方便程序员以 更灵活的 方式管理他的程序。 ae中 Mk 所有的 变量被引用时都 以¥ 始, 号开 其中 7 较为 有 个 重要的 预先定义 好的内 部变量: ¥ 工作目     标的文件 ( @ 名 代表目 标体) ¥ 档案      % 文件成员结 构中的 件名元素 文 S 依      < 赖体列表中第 一个文件 名 串 时间      ? 戮在目 标体时间 后的 戳之 所有依赖体的列表, 空格隔开 ( 并以 就是 在编 译出目 标体后, 被修改 依赖体的 过的 列表) f 依      赖体列表中所 有的 名, 文件 用空格隔开 ( 重复的依 赖体会被合并,所 以 依赖体的 列表不会重复) 本 与      + f类似, 但会包含有重 复的依赖体 牛 工      标的主文 * 作目 件名部分 ( 不包括文件的扩展名) 用户可以自      行定义 所需要的 用户变量, 定义的方法如下:优 二g     e e下面的      例子可以更 准确的 解变量的使用方式: 了O7     o. a. BS二foo r。 b戊 二ge e C G =  a l   g RA S  - l - - W 0mpo :¥OJ) yrg ( S B 事C)布      (C ’一 ¥ 0f o o : f o. f o h a .  o .  o c o . b r h Lnx系统下开发环境及系统编程基础 iu; C ¥ F G c¥       )- <一 方 ( )  L S C ( A C @b r o :b r c  r h      a .  a .  a .  b¥C) CLG)         S - <一 ¥ ( ¥ FA C ( c¥ 0对于每一      标都把它的 个目 规则写出来也 是一件很麻烦的 工作, 避免对一 为了 个大型项目 所有目 件都重复编写规 的 标文 则, aei 提供了 mkfl e 一个简 化的办 法― 模式规则。对于一个      较大的项目 如果他们的 , 编译过程都 遵从同 一个规则, 我们可 那么 以 创建一条规 则来产生所 有的目 比如说 标, 我们对所 有的c 代码都 用一种方式来 编 译生 成目 代码: 标% o:氮      c 。¥ ) 一       <一 ¥ ( C C c¥ .这样, 们就定义了用. 文      我 c 件生成. 文件的 。 规则。我们 不必再为每一 个目标定义 一条相同的规则 。上述介绍的      只是 mk 和mkfl 的一些 ae a ie e 基本用法, 除此之外,ae mk还支持 函数、 宏等多 种特性, 并可以 atmk 和atcn 协同工作, 跟 uoae uoof 在不同的开 发 环境构 建可移植的mkf1 , aei砂 。 ]223其他资源 ..要进行软件开发,      文本编辑器当 然是另一 个必 备工具。 i x Ln 下也有很多 u 功能强大的文本编辑器 ,比如 Vm Eas i,  c 。只要适 当的进行配置,这些编辑器能 m让你轻而易 举地设 定文本的显示 风格、 本进行自 对文 动的格式化以 及大量代 码中进行定位和跳转。文      档也是另外一 个重要资源。 程序员经常 要查 看系统AI P或者某个程 序库所 提供的接口 的定义, 如果每次都要 打开浏览器然 后在众多的 超链 接中寻找 所要的 接口 那也是 , 一件很浪费时间的 事情。 幸好, i x Ln 提供了一 u 个另外的解决 途径 一 - n  e。 一M Pgs 只要 a a 你在机器上安 装了 相应的文 档, 只要通过一 个简单的mn a 命令 加上你需要找的AI P 所属章节 AI 和 P 的名字 就可以 看到该AI P 的说明文档。 Ln 上的Mn  e 一共分9 外加一章n iu x a Pgs a 章, : Lm 系统下开发环境及系统编程基础 io1      .可执行 程序和 se 命令 hl l 2     用 .系统调 3     调用 .程序库 4     件 .特殊文 5     式和约定 .文件格6      .游戏7     样的 .格式各 说明8      .系统管理9 核      .内 例程N T lT     k .  / c当 这      不一定 然, 个也 保证你能够找到全部需 要的 东西, 几乎所有Lnx i 应用 u 的开 发人员 都不能没有开源社区的帮 各大开 助。 源社区 也是 Ln 系统开 iu x 发的 重要 资源。224  nu 开发环境的建立 .. Uut 下的 b前面一      节简单地介绍了 Lnx 在 i 下做软件开发的 u 一些常用 工具, 在本节中 我们 讨 下 么 b t下 装 些 具 U n 是 个 探 一 怎 在U n 安 这 工 。 ut 一 基于D i 的L u uu b u ea ix bn n操作系统发 行版. 他跟 D i 一样, d g p 作为软件 ea bn 用 p 和at k 包的管 理工具, 他 们可以自 动识别所安装的软 件包的依赖关系, 执行相应的 措施, 使用起来非常方 便。 p 在默 At 认情况下已 经安装在 Uu u bn 系统下, t 要使用它先要配置 好它。 p At主 的 置 件 /t a / 录 有 个: p c f o c l t 在 要 配 文 在 e / t目 下, 两 a .  和s r . s。 cp to n ueiatc f p.  文件中, o n 我们可以指 定代理 服务器等环境变 suc.it 量,orels 则用于 存 放软件包 的来源 地址 ( 数的开源软件都是 大多 通过网 络下载的) . 要在 Uut 下安装开发      u b n 工具, 我们需要 一个名为 bi -seta 的包。 ul esnil d 它并不是 一个真正的软 件包, 事实上, 只包括一个列 说明 他 表, 需要安装的各 种 软件, 其中包括dk dv g ,  ,  c-e 或者 l cdv mk. pg e,  gc l 6dv - + c i + b i -e,  e b a 配置好上 p 所需的      at 述 两个文件后, 在命令行敲入下 面命令再提供管理员 密 码( 只有管理员 才对某 些目 录有写访问 权限) 安装过程就 会自 动执行: Lmo系统下开发环境及系统编程基础 S :字sd a tgt  tl b l-seta     p-e isa l idesnil uo  n u同      样其他 工具也 可以 述方法安装, 用上 例如 Mn  e: aP s a g 车sd a - t  al  pgs e     t e i tl mnae dv uo  g n p s a - 通常情况      Uut 系统 下, bnu 也自 V , 带 i 不需要额外安 m 装。 另外,      我们还需要 对内 进行配置 核 和重新 编译, 我们安装以 所以 下额外的 工 具― kr l akg, nuss dv fkro,  t z 2 en - cae l cre5 e,  e t we 及bi : ep i b - a o g p¥sd a -e i tl kre-akg l nuss-e f eot  t      tgt sal  nlpcae bcre5dv kro we uo  p n e i a gb i2 zp23 内核 .231内核源码树 ..开发 L u 驱动程序需      的 ix n 要用到 L u 内 i x 核的头文 这 n 件, 样才能 使用系统定 义好的编程 接口以 及各种内 数据结构 另外, i x 核带 核的 。 Ln 内 有蓝 u 牙的 支持模 块, 在默认情况下编 译的Ln 内 iu 核都支持 x 蓝牙协议栈, 我们还需要重新编 因此译 内核,去掉内核对蓝牙的支持 , 所以我们需要 内核的源码树 ( 源码树 内已经包 含有内核的头文件 ) 。内核的源码树及相应补丁都可以从 Lnx内核的官方网站 iuht: wwkre.r/ tp/ w.enlog得到。 / 除了Ln 官方的内 码以 各个发型版也 ix u 核源 外,会提供各 自的内核源码 , 他们都是在官方的内核源码上做一定的修改得到的。 为了 在取得最 大的 兼容性, 所使用的内核 本文 源码来源于 L u 的官方网站。 ix n 我们 可以 gt 用,e 直接从网 络得到 这个内 源码包,并放置 核 于系统适当的 位置, 通常 是/s s / 录下, / rr 目 u/ c 注意,一 般只有管 理员才拥有对 u / c目 写权限 /s s / 录的 rr , 下面的 命令要用管理员身份 执行。 如果没有 特别说明, 本文其 他的 命令也需要管理员身份 。 c /s/r     sc d  r u we ht : w.enlogpblnxkre/26 lnx     p刀wwkre.r/u/iu/ enlv./ iu\ g t  t- .  0 4 t r g     .  a .  2 6 2 .  z . 
x u n i L驻动程序框架第 3 L u 驱动程序框架 章 ix n设备驱动程序在 Lnx      i 中扮演一个非常重要的角色, u 几乎所有系统可用的设备都需要各自 的驱动程序来协助访问。 这些驱动程序隐 关于设备操作的实际 藏了细节和复杂性, 对外提供一个定义良 好的内部编程接口, 使得用户可以通过一组 标准化的调用来操作设备, 而不需要关心设备实际的 操作细节。 设备驱动程序将 这些标准化的调用影射成实际作用于设备的 特有操作。Lnx      i 还提供了 u 一个非常重要 而灵活的 特性来方便程序员 进行内 核空间的 程序开发一一运行时的内核特性扩展。 就是说我们能在内核运行时向内核添加功能(. 核 I 向内 添加功能 通过 ? ] 是 在运行时向内 添加“ 块” 现的, 核 模 来实 每个模 块实际上是没有连接成完整可执行程序的目 标代码,我们可以 通过 iso 命令在运 nmd 行时把模块连接到内 或者用 rmd 核, mo 命令动态的移除一个模块。 这使得驱动程 序的开发者能在不重新编译内核, 甚至不重启系统的情况下测试程序, 大大地降低了驱动开发的复杂性。31  iu 的设备驱动程序 .  LnxLnx      i 系统把设备分成三类:字符设备、 u 块设备 和网 络设备。 字符设备在行为上与文件相似, 可以看成是一种能像字节流一样被访问的设备; 而块设备在进 行 1 操作时, / 0 只能传输一个或多个完整的块, 每个块至少为52 1 字节。 这两种设备通常都会在/e/ 录下建立一个影射节点。网 l v目 d 络设备 通常与一个网 络接口 相关联, 核的网 由内 络子系统驱动, 但它不是一个面向 流的设 因此将网络接 备, 口 影射到文件系统中的节点比 难n, 较困 n它通过另 外一套完 全不同于字符设备 和块设备的接口 进行访问。 本文正是要将原来被挂接到Lnx 络子系统的蓝牙网 iu 网 络设备影射到文件系统中。对于由      总线连接的设备, 我们另外一种以 总线类型的为 标准的 分类方式。 这些设备通常与 Lnx iu 下已实现相关总线驱动模块协调工作来实现对设备的访问, L u 驱动程序框架 ix n比 C 设备、 CI 如PI SS 设备和UB S 设备等. 这些设备被实现为隶属于某个总线子 系统的模块并与该子系统一同 工作, 但设备本身可以 表现为不同 类型的设备 ( 字 符设备、 块设备或网 络设备) 。而本文所实现的 蓝牙设备驱动则工作于UB S 子系 统下。由 于各个总线子系统隐 藏了 具体总线的实 现逻辑并提供了相关的 编程接 口, 驱动开发人员就可以 专心实现面向设备的各种操作逻辑, 大大简化了驱动开 发的过程并减少代码的重复u o e} m32 模块 .Lnx 设备驱动程序几乎都以      i 的 u 模块的 方式来实 现,我们现在先来了 解一下 Lnx i 模块的编写方式和编译技巧. u 编写Lnx      模块至少需要用到两个内 i u 核头文件:ii.  oueh 它们 nt 和mdl.  h ,被放置于源码树的icuelnx 目 nld/i / 录下,他们包含了对宏.dl ii 和 u ue  t nmdl ei 的定义。 oue xt - 在程序中需要通过mdl ii和.dl i这两个宏 oue  t n ue  t ex向系统注册模块的初始化函数和退出 清理函数。 通过这两个宏所注册的函数会在 我们使用 iso 和rmd nmd mo 命令时自 动地被调用,完成相关的模块初始化和清理 工作。下面例子可以 简单的说明模块的编写方法:#n ld lnx ii.>      <iu/nth icu e  #n ld lnxmd l.>      <iu/ou eh icu e sai i _   el ii( d { un      t  i hlo  tvi)  tr 0} ttc  i t  n n n o r e ; sai v d-  t  l ei( d     i  i hl extvi } ttc  o e x e o   o ){mdl i th l ii)      i( lo  t: oue  n e n mdl- th l_xt;      i( loei) ouee x eMDLe ES (  L )      CNE "P " : OUEL sI G本例    演示T 么 册 块的 始化( l i t 清 hl -  ) 数, 怎 注 模 初 h l n ) 理( l ei 函 e o  和 i eox t 而实际 这两 数 上, 个函 什么也不 另外, O L  CN 用于指 模块代 做. 宏MD EL E E U 一I S 定码的许可证, 如果不声明,内 核在装载模块时 会发出 抱怨。 由      核代码的一部分,它的 于模块是内 编译需要用到编译内 核许多 特殊选项, L u I动程序框架 i x  n F我们不能 通过简单的gc c 命令来生成目 标代码, 我们要借助内核源码树上的 所以 Mkfl。 aei 这样做的原因是我们能够在不了 核编译的 选项的意义的 e 解内 众多 情况 下也能正 确地把模块编译出 所以 来。 我们如下 编写我们的.kfl": ei 1 e'inq¥KRERLAE,     ENLEES)) fe ((ojm=c u .      i bo b- : h ses leKI: ursckre-edr- ( el  m 一 ) DR二 s/r/enlhaes¥s l uae r / h nBIA  hl pd DR ( el  ) s wdfut eal:¥ K) 一 ¥KI) ¥B I) dls ( E C  DR M ( R m ue M A ( = D o. H N :  e n POY c a lc en la :¥  E 一 ¥KI)  ( I)c e n ( K) C  DR M¥B R l a M A ( = Dr 一 f*0* oe.eed..m .o*m dc.m_ esos m r .  ̄cr dpn *cd*k .o. tpvr inedf nioj : c s. 一      ub。 句是2 内 b m= i  - h . 核对m e 一 扩展, 6 a 的 个 k 他指明 要编译的 模块: DR KI 是包含有内核顶层 Mkfl 文件的路径; DR aeie BI 则表示模块代码所在的目 录。¥  E C  DR M¥BI mdls ( K)一 ¥KI)  ( R oue 一句用于说明在编译时先要找 M A ( = D ) 到内核的顶层Mkfl, aeie 然后回到模块代码所在路径进行编译, oue 指向由 mdlsoj 变量设定的 b一 模块。以 我们只需要把Mkfl和模块代码放到同 后, aei e 一个目 录下,简单键入 mk 就可以 ae 编译模块了。33 i x .  n 下字符设备的驱动程序框架  L uLnx iu 下的字符设备通常会影 /e/ 录下的一个文 这些文件被 射为 dv目 件, 称为 Lnx  i M动程序框架 u特殊文件或者设 备文件。 如果用 i 1 s一 命令查 看输出 字符设备的第一列用“" , c 来识别。 同时, 输出 该 在关于文件最后 修改日 期前有两 列数字, 我们称之为主设 备号和从设备号。 通常, 主设备号用于 识别该设备对应的驱 动程序, 而次设备号 则用于区分具体的设备 一般只会由内 用。 , 核使 如果我 们事先能 够确定我们所用 的设备号,可以 通过函 rgse re rgo 进行申 数 eitr  dv  in ch e 请, 但如果我们需要 动态地取得设备号, 则需要另一个函 alc ei , 数 lo rgo 它们声明 lnxf.> _ n 在<i /sh u 中。 使用完这些设备号以 我们应该 当 后, 把它们交还给内核, 这时我们需要另外一 核 数u e s r d r i . 个内 函 n g t c e e o r i e h v  n r gLnx 文件都由 个 fl结构体来描述,      i 的 u 一 i e 该结构体包括了 对文件打开方式 的、 文件当 前偏移量以及 文件的 私有数 据等 属性, 但对于驱动 程序来说, 重 最为 要的是一个描述对文件 可用操作进行描述的结 构体的 指针。这个结 构叫 做f e p a o, 中 义了 文 可 的 种操 的 数 针 包 p , i -  t n 当 定 对 件 用 各 作 函 指 , 括。 n lori e era,  t,  es 等I 事实 ed wie rlae t r e 1 7 上这几个操作 , 会被映 射为 Lnx  模型中的 iu 1 / 0o n r d w t和c sE 驱 程 最 要 工 就 要 这 函 影 p ,  ,  e l e . 动 序 重 的 作 是 把 些 数 射 e e r a i o "并实 现成 对设 备的 特有操作,使得用 户能够简单地以 操作 文件的方式来操作设备。对于每      备驱动, 一个设 我们还应该建立 一个描述该设备的数 据结 构, 当中保存该设备需要的资源 、 状态描述等属性。 这样可以便于跟踪设备的状态,控制设备资源的分配 及清理。 i x Ln 系统对字 u 符设备也有一个描 述的 数据结构 ― ce,该结构描 d v 述了Lnx i 字符设备的 u 一些通用属性,比如 之前所说的一个 fl oeai 的指 ie  rt n 针, p o 我们应该在我 们自己 定义的数据结构中 包含该结构。 下面是内核源 码中 fl oeain 构体的定义: i -  to 结 e pr src fleprtos tut  eoeain{ i  src m dl *we           ; tut  ue  nr o olf t  l e)  ut  e ,l t n)         src fl * of  it: of ( s k ( * e l t i f ,  siet ed ( ut e , h         rc fl * ca u sr , i -,  f  ; sz ( a s _ * )  r t i r  e * sz t lf t e o * ) siet  i ra ( ut  b* hr一ue ,sz t         )  rc k c . ca    * ie  sz ( o ed s _ * -  a t i o sr , lf t: of  ) siet  rt ( rc fl , os ca            s ut  e* cnt  r一ue ,sz t sz_ ( ie t * w )  i h sr* ie  , Lmo翅动程序框架 ilf t : of  ) * siet  i wi ( u t c * cnt  一”e , i t          ) rc kob , os c r s * sze, sz_ ( o rt s * _ e t a i h a r e  lf t: o f  )i ( edi ( r t  e* od          c fl ,vi * fld e) n * ad )  u t  r r s t i , ili t: r   s usge it ol ( u t e ,  t l a e t t         ) rc fl* src pl t l src *: ni d  ( l s n n * p t i t u o _  _  ) b uit icl (t t  d ,sr t  e* nind  ,          c ioe* t c fl , usge it n ( ot)  r * su n u i nus n l g: ni e o ) g d  n l g  nok走i l ( u t  e* nind  ,  i e          t)  rc fl , usge it us nd o ( l e o n * c u c s t i n ngln) og :l g  opti t ( u t  e* usg d  usg d          )  rc fl , ni e i ,  i e o ( ma o l s n * c _  c t i n n n n t ln) og; i ( mp ( rc i          fl ,s c v ae src ): n * a)  u t  e* t t  ra  ut* t  m s t u r m  t i ( pn ( rc n e* sr t  e*          i d , t c fl ); n * e)  u t  t  o s t o u iit fuh (t t  e*          c fl ) ; n ( ls)  r * su i it rlae (t t  d . t t  e*         sr c ioe* src fl ) ; n ( ees)  u * n u ii ( sn)  rc f          t  e* t c dn y* n dtsn) n * yc ( u t  f s t i ,s t  t ,i aayc: l u r er t  it  i fyc ( r t  c * n dt n)         s c kob  it  ayc; n ( o  n)  u * a s t i ,  a s it  ayc ( t t t  e* n          s c fl . it; n ( sn)  ,  * f i n u r i ) i ( ok ( rc fl ,i sr t  e ok*         t  e* n,  c fl lc ): n * c)  u t l s t i t t u i _  si _ ( ed)  r t e  os s t  c  ni e          t c fl * cnt  c i e * us nd sz t  av ( u e * r s i ,  t u r o v ,  g ln,  f  ) og lf t : o * si 一 ( rt )  u t  e , o t  t  c ni e         src fl * c s s c i e * us nd sz * i v ( e w e t i n t u r o , v gln, f t* : og l f  ) osi t( edie s ut  e* o仁 ,sz t          ( rc fl ,lf t* ie  sz   nfl e  * s )  t i , ra-c rt vi ); edat -,  d* o o si t( e pg)  u t  * src pg * n,  e           ( rc f e , tut e it sz t sz   n ae s e  * d s t i l a , i , l f  ,  ) o t  i : f * n t us nd g e n pd ra( rc fl* usg d  ,          umpe ae)  ut e , ni e l g ni e l ( t a - g o * - n g s t i n o nusge ln,  sge ln, sge ln) n ind  g u ind  g u ind  g ; o n o n o Lnx驱动程序框架 i uit  hcelg ( t: n ( ekfas i ) * c s  ) n it  i ntf)s c fl *i ,  ind  g  ) n ( r oiy( r t  e  l usge ln ag: * e  d t u i fp n o r it  l k ( rc f e* it src fl lc ): n ( o )  u t  , n,  t  e  k* * c s f t i l t u i o 作为      流程, 们应该在模 一般的 我 块的 初始化函数中为设备 文件申 请其主设备 号 和从设备号。 然后对描述 设备的数 据结构进行初始化, 分配需 要的资源, 其中 包括指定 fl oe t n i -  ai 里各种操 e pr o 作应该影射到的处理函 数. 而在模块清理函 数则应该对该结构中已分 配的资源 进行回 收,并复 位设 备状态 。 为了      能够在文件系 统访问 设备, 我们还需要为 设备 在文件系统中创建节点, 该操作通常 mn 进行。 于本文实 ko d 但由 现的 是一个UB S 设备驱动, 这个操作 会在 设备接入系统时由 系统 自 动完成。34 Lnx  子系统驱动程序框架 .     UB i u S所有的UB      设备都可以 过 L u 的UB S 通 i x S 子系统进行访问. n 我们可以 把每一 个 UB S 设备的 驱动分成两个 部分: 总线的驱 动和设 备的 驱动。 所谓总线的 驱动可 以 看成是对某种类型总线逻 辑的软 件支持, 我们可以 把它 看成是 Lnx iu 的某个总 线子系统。 就是说, i x S 子系统实际上已 也 Ln 的UB u 经实 现了 UB 对 S 总线的访问 操作。 另外一部分则是设备 的驱动。 S 总线可以 接到各 UB 连 种各 样的 UB S 设备, 每一种的 UB S 都有它独 特的 访问操 作和工作方式。 能够让设备正 为了 常工作, 我 们还需要为 UB 编写 S 设备 相应的驱 动程序。 在 Lnx      iu 系统下UB S 设备可以 抽象成下图的 样子: Lnx iu 驱动程序框架图 3 U B设备抽象 . S 1 341端点 ..每个 UB设备 由若干个配置组成,每个配置有可以拥有多个接 口,每个接 口      S 则绑定了多个端点 。我们先从最底层 的结构― 端点,开始解释。端 点是每个UB S 通信的 基本结构, 所有的 数据或者命 令都 通过端点 来收发。 端点只支持 每个 单向的数 据传输方式, 从设备 要么 到主机, 要么从 主机到设 UB 备。 S 设备的 端点有四种不同类型 ,分别是控制端点、中断端点、批量端点和等时端点。控制      端点 通常用于配置设备、 获得设 备信息、 发送命 令和取得设 备状态。 每 个 UB 都有一个特殊的控制端点 S 设备 ― 端点0UB . 子系统在设 S 备接入主机时, 系统 通过该 端点对设备进行配置。 蓝牙的命 令数 据包就发 往该端点。 中断      用固 端点 可以 定速率来传 输少量数 据, 用于控制设备。 S 鼠 或者 UB 标或 键盘通常都使用这种端点。而蓝 牙的 响应事 件通过该 端点 发送。 批量端点用于传输大批量的数 并确保没      据, 有数据丢失, 但不保证传输的实 时性。 多数的打印机、 储存设 备都使用这 种端点。 协议的AL 蓝牙 C 数据包就是通过这种端点传送的。 Lnx驭动程序框架 iu等时      端点用于传输实时 性要求的 数据, 但不能 保证数据的可靠传 输, 通常用 于数据采集设备。蓝牙 协议的so c 链路数据就是通过 这种端点发送。 UB      S 子系统用ubhs don 结构体来表示UB s ot  pi s e  en t S 端点, 但真正描述UB S 端点的 结构是 ube pit srpo 结构体, s n on ed w  一ecitr 其中包括了 端点的 地址 ( 有 带 传输方向 的描述) 端点的 、 类型、 端点最大传输单元以 及传输间隔 ( 用于中断 端 点) 等关键属性.342接 口 ..每个UB      实际上代 S接口 表了 S 设备的 该UB 一个逻辑 功能, 31 发现, 从图 .可以 UB S 设备驱动其实 绑定于某一 个接口 所以, 有多 , 具 个接口U 设备可能需 S B 要多 个设备驱动程序来协 调工作。 个 UB 可以 一 S 接口 有多个设置, 用于设定不同 可以 的传输带宽之类的 属性,但 初始状态的设置是 第一 个, 编号 0 为 > UB      S 子系统用ub  e ae s it fc 结构来描 UB nr 述 S 接口. 对驱动程序开 发人员 来 书,该结构体中 包含几个中要 得字段: 一个 ubhs_  r c 结构 s otit f e 体数组的 e s  ne a 指针, 保存了所 有可能的接口 设置; 表示可 一个 选配置数量的 字段; 一个当 前所用设置的指针以及该设备的次设备号。343配置 ..一个 UB 可以 含多 S 设备 包 个配置, 核使用 ubhs cni结构体来对其 内 s ot  fg s e  o进行 描述,但通常情况下,驱动开发人员甚少用到该结构。34 4设备 ..在 Lnx      核中,表 i 内 u 示一个UB 备的 S设 数据结构是ubdvc 结构体。内 seeie s  核很多的 处理都是通过 这个结构来 进行的。 我们还可以用函 数i e a _ u d ( 数 吧 个u i e a 的 构 转 行 个 n r c t s e) 来 一 s n rc 结 体 换 一 t f e o  v 函 b b  f e tub  i 的 s dvc 结构体。 e e 它的 作用相当 于字符设备中的 c v 构. d 结 e L = 驱动 m 程序框架345识别设备 ..UB      够连接多种不同的 S 总线能 设备, 而不同设 备需要不同的 驱动程序支 持, 但我 们应该怎么 识别哪个设备 对应的是哪个驱动呢? 有几种不同 的方式可以 完 成设 备的识 别, 但均需要用 到内 核的一个数据结 构 ̄ s  v e  一个 bd i i。 一e c d ub vc i通常包括该设 sd i d 一e e  备的 生产商 I 和设 I 的标 或 D 备 D 识, 者是产品 所属 类别的 提示。 可以 我们 通过生产商的 I和该设备的 D 产品I 的组 ( D 合 或者进一步 指定 版本的 范围) ,或者 通过 UB 所定义的 S 协议 设备类别, 或者通过UB 类 S 接口 型来产生 一个 ub  i i。内 s dvc d 核为这几 e e  种不同 的方法提 供了 个不同 几 的宏: UB EI ( d I rdcI) / 配生产商     Evn rD poutD; 匹 S DVC e o ,  e  和产品I D U    EIEV ( nol,  dcI l,  ; / 某版本范围的生 S VC   v drD poutD o h /匹配 几D eE e R r ,  i ) U DVC N ( s,  l s rtcl: / 配设备     EI Ocas s c s pooo) /匹 S EI e  l B  s F u a ,  b 类型 U ITR C I ( s,  l ,  t o) 匹 S 接口     F E  Ocas s cas poo l / 配 UB 类型 S NE A N l B  F u s r c ;/ b刀产商和                  产品 I D在很 多情况下,操作同类型设备的方式可能具有很大程度的相似性 ,虽然他     们的生 产商并 不一样,但驱动程 序却可以 共享, 而,内 提供了 因 核 一个宏 ― MD ED I -AL, OU -E C TBE 用于注 L VE 册一个 UB S 驱动程 序中 所支持的 所有UB S 设备的 ub eie  该宏需要一个结 s  vc i. 一 d d 尾为 空的 ub  i i 数 s d c d 组作为参数,并 e e  v 指 名注册的是ub s 设备 ( 该宏同 因为 样适用于注册PI C 设备) UB 。 S 子系统 会在设 备接入 UB 线时检查各 S总 个模块注册的设备 I表, D 并决定 使用哪个模 块。 34 .. 6通信L u 的UB 系统就好象在设备与主机之间     S 子 ix n 架设了 一条高速公路, 我们不 必再为UB S 复杂的总 线逻辑提供软件 支持而 苦恼。 速公路 高 虽然己 经搭好了, 要 在上面 运输数据我 们还需要有各种的 交通工 具。 好, S 核 幸 UB 心已 经连车都为我 们准备 好了 个名为 ub  B ,一 r (S 请求块) U 结构体就是 我们所需 要的 交通工具。 这个ub r 结构体 就好象一辆车 跟开车的 司机, 你只要把货 物放到车上, 告诉司 机 Lnx驱动程序框架 iu要把东西 送到 哪里, 及怎么送, 以 那司机就会把数 据送到目 的地, 送完了, 还会自己把车开回来 以备后用。ub 构体包含有许多很有      r结 用的字 下面仅列出 段, 部分:s r t s d v c *d t uc u b e i e  ev目标设备     的指针。 u sge it p nind  p e n i记录目      标设备上目 标端点的 信息, 核提供一系列ub****ies ut 内 se***pp( rc s  tu e  e  , i e n n o t 数 以 来 成 关 定   e c * v us n i e p n 函 可 用 完 相 设 。 s d i d n g d  d i ) b v s e t u sge it asee g nind  t nfr fas n r sl 用 于设定各种各样的传输方式 。     v i * r n f r  f e od  a s e b fr t u收发      缓冲区。由 数据的 于端点是单向的, 所以该 缓冲区可以 解释成 接收缓冲或者发送缓冲 ,视具体端点而定 。      it ase-ufr lnt n t nfrbfe-egh r缓冲区tase bf      nfr ue 或者 da r s e  r m 缓冲区 t n r  的大小. r f da ae mub m lt t m lt s一opee c pee c o当数      据包传输完成 或者出 错时, 系统自 动调用的 处理例程指针。v d c n e t oi * o t x可以      看成是该 u 的 r 私有数据, b 方便处理 例程识别该 u 提交时 r b 所处的 上下文状态      it ta_ gh n a ullnt c e在 ub      r 结束时, 表示该ub r 实际发送或收到的数 据长度。i nt t t s sa u用于识别 ub 束状态,通常被 ub 束例程用于判断 u 是否出      r 的结 r 的结 r b 错。i t  t r a n i evl nub      r 被轮询的时间间 隔, 只用于中断或等时ub r.it me一f akt n n br _ ces u op 等 时 ub的传输缓冲区数量。      rsrc ub  _akt  citr  f m_  [ t t  io ce dsrpo i r eds 0 u s s p e s a ec ] o  Gnx驱动程序框架 u用于在      单个等时ub 传输多个 r中 等时 数据祯。 在使用ub      结构体 r 之前, 我们先要向UB S 子系统申 分配, 请 这个步骤通过函 数 ub   cub 进行,当 s al - 来 el o r 我们使 用完这些 u 之后, r b 我们应当调 用函 数 ub  eub s fe r 来释放 r -  掉它们。 对于不同的      货物,我 们需要不同的 车子。 之前已 我们 经说过, s 端点分为 ub 四类,内 核提供了 三个函 数来封装不同的ub r,分别 是: u fl n bs ut  ub sr ubdvc *e,     it  ( rc u *r,  ut  eeie  v s il ur t b  _  r b  t c ss  dusge it p, i *rnfr  fe,                        nind  p e v d  ase一ufr n i o t b it fe lnt, bcmlt t m lt,                        n b fr  gh u e pee c pee u e sso ovi cnet i it vl;                      od  t ,  ne a) o x n t  r ubfl k r( ut  *r,  u seeie  ,      l ubsrc ub  b src ubdvc * v s  l e  t ei 一u s r u t t  s  d eusge it p, i *rnfr fe,                        n ind  p e v d  aseb ufr n i o t it fejegh ubcmlt t m lt,                        n b fr nt,  e pee c pee u sso o v i cnet;                        od  tx) oub  l  t l r s ut  *r,  c ubdvc dv     cn o- ( rc ub  b s ut  eei *e, s fl o r ub t i r u t r ss  e usge it p, sge ca *eu_ak ,                        t n ind  p e u ind  r  tp ce n i n h s p v i *rnfrbfe, t fe lnt,                        od  asee fr i b fr  gh t su n u e ubcmlt_ cmlt, i cnet;                      se peet  pee v d  tx) so o o o这个过      程就好比向车 子放上了货 然后告诉司 物, 机东西要运 往哪里以 及怎么 运。 系统缺少一 个封装等时ub 函数, r的 开发人员需 要手工设定 u 的 r 各个字 b 段。当封装好 r 后      ub ,我们需要把它提交给 UB S 子系统,以后的工作交 由 UB S子系统来完 成. 步骤我们需要函数ubsbi ub 这个 seumt r。当ub 提交给内核 s  e  s r 成功 以后,在系 统调用ub r 结束回 程以 调例 前, 我们不能 对该 ub r 结构体 进行访问。当 UB      S 子系统完成 了对 已提交的 ub r 处理完毕后 , 也就是当货物 已经顺 利送抵目 地或者在 的 运送途中出 错时,系 统会自 动调用刚 刚由ubc peet s o l _ _m t c p t所指定的 o le me 处理例程。通常 例程会对 ub 束状态进行检 r 的结 查以 确定进一步的处理过程。如果向      交了ub 系统提 r 后,由 于某种原因, 比如设备 被拔出 我们需要 , 取消该请求的话 ,我们可 以用函数 U lm 驱动程序框架ubkl      bs ut  *r) s  l  ( rc ub  b ei ur t r u或者ubuln     k bsrc ub  b s ni ur ( ut  *r _ t r u) 来撤销请求.他 们的区 别在于 ubkl ub s  l  会等到 u 的 ei r r 真正结束后 b 才返回,而u en n u 则 不 待u 完 被 止 换 话 , s ul k r可 s u i w  并 等 r 全 终 . 句 说 u n n u b   kr s l eb b b i w  eb用于不能休眠的 代码中, 但它需要设置ub r 结构中的UB  N ULN 标志 R AYC  I S N K 才 能正确工作。 对于某些      发生的 偶然 数据传输, 化、 然后释放 u 并 初始 提交 r 提供回 b 调处理 例程这样的步骤显 得过于繁琐, 系统针 所以 对这种情况提供了 个函数 两 用于处理 这样的数 据传输: ubbl s( ut  e  c u 一e,  ind  pp,     mgsrc ubd i *s  v usge it  e s uk  t s e  s e e  bd v n n i vi * t it ,  *cull g ,  tmot;                 h it eu) od  a n l i at _  t n i d ,  e n a n t  a e n ubcnrl   s ut  dvc *e ni d  pp,     ows( rc ub  ie  v usge it  e s ot e g t e w  m s e d ,  n n i一                                              u rqet 8  us,u 8 qetye u 1 vle e r ustp,  6  u, e a- 6 e,  d t,  1 sz i tmo )                     t:                     u id vi *aa u 6 e n ieu 1 nx o d i ,  t 他们分别用于传送批量端点和控制端点的数据 。     34 7操作 ..对于 UB      S 设备来说, 他的操作方式与 其他字符型设 备有所不同。 作用于一个 UB S 设备的 操作除了 一般文 件系 统对文件可 用的 操作以 还有一些其他的一些 外, 操作,比 poe ds net sse ,  ue poe 数在 UB 如 rb,  c nc,  p d rsm 等。 rb 函 io u n e S 子系 统

我要回帖

更多关于 苹果手机怎么清理内存 的文章

 

随机推荐