范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

13。字符设备驱动开发及相关概念openwrt入门经典教程

  13.字符设备驱动开发及相关概念
  本实验目标
  对 Linux 内核、驱动有初步的认识
  如果对此部分不太熟悉的朋友可以下载国嵌的 linux 视频看看 ,非有很大帮助。
  1  应用程序、库、内核、驱动程序的关系
  从上到下,一个软件系统可以分为:应用程序、库、操作系统(内核)、驱动程序。开发 人员可以专注于自己熟悉的部分,对于相邻层,只要了解它的接口,无需关注它实现的细节。
  以点亮一个 LED 为例,这 4 层软件的协作关系如下,如图 1 所示。
  图 1
  1). 应用程序使用库提供的 open 函数打开代表 LED 的设备文件。
  2). 库根据 open 函数传入的参数执行"SWI"指令,该指令会引起 CPU 异常,进入内核。 3). 内核的异常处理函数根据这些参数找到相应的驱动程序,返回一个文件句柄给库, 进而返回给应用程序。
  4). 应用程序得到文件句柄后,使用库提供的 write 或 ioclt 函数发出控制命令。
  5). 库根据 write 和 ioclt 函数传人的参数执行 "swi" 指令, 这条指令会引起 CPU 异 常,进入内核。
  6). 内核的异常处理函数根据这些参数调用驱动程序的相关函数,点亮 LED。
  库(比如 glibc)给应用程序提供的 open、 read、 write、 ioctl、 mmap 等接口函数被 称为系统调用,它们都是设置好相关寄存器后,执行某条指令引发异常进入内核。除系统调 用接口外, 库还提供其他函数, 比如字符串处理函数(strcpy、 strcmp 等)、 输入/输出 函数(scanf、 printf 等)、数学库,还有应用程序的启动代码等。
  在异常处理函数中,内核会根据传入的参数执行各种操作,比如根据设备文件名找到对 应的驱动程序,调用驱动程序的相关函数等。一般来说,当应用程序调用 open、 read、
  write、ioctl、mmap 等函数后,将会使用驱动程序中的 open、read、write、ioctl、mmap 函数来执行相关操作,比如初始化、读、写等。实际上,内核和驱动程序之间并没有界线, 因为驱动程序最终是要编进内核去的:通过静态链接和动态加载。
  从上面操作 LED 的过程可以知道,与应用程序不同,驱动程序从不主动运行,它是被 动的:根据应用程序的要求进行初始化,根据应用程序的要求进行读写。驱动程序加载进内 核时,只是告诉内核"我在这里,我能做这些工作" ,至于这些"工作"何时开始,取决 于应用程序。当然,这不是绝对的,比如用户完全可以写一个系统时钟触发的驱动程序,让 它自动点亮 LED。
  在 Linux 系统中,应用程序运行于"用户空间" ,拥有 MMU 的系统能够限制应用 程序的权限(比如将它限制于某个内存块中) ,这可以避免应用程序的错误使整个系统崩溃。 而驱动程序运行于"内核空间" ,它是系统"信任"的一部分,驱动程序的错误有可能导 致整个系统崩溃。
  2   Linux   驱动程序分类
  Linux 的外设可以分为 3 类:字符设备、块设备和网络接口。
  字符设备是能够像字节流(比如文件)一样被访问的设备,就是说对它的读写是以字节 为单位的。 比如串口在进行收发数据时就是一个字节一个字节的进行的, 我们可以在驱动 程序内部使用缓冲区来存放数据以提高效率, 但是串口本身对这并没有要求。 字符设备的 驱动程序中实现了 open、close、read、write 等系统调用,应用程序可以通过设备文件(比 如/dev/ttySAC0 等)来访问字符设备。
  块设备上的数据以块的形式存放 ,比如 NAND Flash 上的数据就是以页为单位存放的。 块设备驱动程序向用户层提供的接口与字符设备一样, 应用程序也可以通过相应的设备文 件(比如/dev/mtdblock0、/dev/hda1 等)来调用 open、 close、 read、 write 等系统调 用,与块设备传送任意字节的数据。对用户而言,字符设备和块设备的访问方式没有差别。 块设备驱动程序的特别之处如下。
  1).   操作硬件的接口实现方式不一样。
  块设备驱动程序先将用户发来的数据组织成块,再写入设备;或从设备中读出若干块 数据,再从中挑出用户需要的。
  2).   数据块上的数据可以有一定的格式。
  通常在块设备中按照一定的格式存放数据,不同的文件系统类型就是用来定义这些格 式的。内核中,文件系统的层次位于块设备驱动程序上面,这意味着块设备驱动程序除了向 用户层提供与字符设备一样的接口外, 还要向内核其他部件提供一些接口, 这些接口用户 是看不到的。这些接口使得可以在块设备上存放文件系统,挂载块设备。
  网络接口同时具有字符设备、块设备的部分特点,无法将它归入这两类中:如果说它 是字符设备,他的输入/输出却是有结构的、成块的(报文、包、帧) ;如果说它是块设备, 它的"块"又不是固定大小的,大到数百甚至数千字节,小到几字节。
  UNIX 式的操作系统访问网络接口的方法是给它们分配一个惟一的名字(比如 eth0) ,
  但这个名字在文件系统中(比如/dev 目录下)不存在对应的节点项。应用程序、内核和网络 驱动程序间的通信完全不同于字符设备、 块设备, 库、 内核提供了一套和数据包传输相 关的函数, 而不是 open、 read、 write 等。
  3   Linux   驱动程序开发步骤
  Linux 内核就是由各种驱动组成的, 内核源码中有大约 85%是各种驱动程序的代码。 内核中驱动程序种类齐全,可以在同类驱动的基础上进行修改以符合具体单板。
  编写驱动程序的难点并不是硬件的具体操作,而是弄清楚现有驱动程序的框架,在这个 框架中加入这个硬件。比如,x86 架构的内核对 IDE 硬盘的支持非常完善:首先通过 BIOS 得到硬盘的信息,或者使用默认 I/O 地址去枚举硬盘,然后识别分区、挂载文件系统。对 于其他架构的内核,只是要指定了硬盘的访问地址和中断号,后面的枚举、识别和挂接的过 程完全是一样的。也许修改的代码不超过 10 行,花费精力的地方在于:了解硬盘驱动的 框架, 找到修改的位置。
  编写驱动程序还有很多需要注意的地方,比如:驱动程序可能同时被多个进程使用,这 需要考虑并发的问题;尽可能发挥硬件的作用以提高性能。比如在硬盘驱动程序中既可以使 用 DMA 也可以不用,使用 DMA 时程序比较复杂,但是可以提高效率;处理硬件的各种 异常情况(即使效率低) ,否则出错时可能导致整个系统崩溃。
  一般来说,编写一个 Linux 设备驱动程序的大致流程如下。
  1). 查看原理图、数据手册,了解设备的操作方法。
  2). 在内核中找到相近的驱动程序,以它为模板进行开发,有时候需要从零开始。
  3). 实现驱动程序的初始化:比如向内核注册这个驱动程序,这样应用程序传入文件名 时,内核才能找到相应的驱动程序。
  4). 设计所要实现的操作,比如 open、 close、 read、 write 等函数。
  5). 实现中断服务(中断并不是每个设备驱动所必须的)。
  6). 编译该驱动程序到内核中,或者用 insmod 命令加载。
  7). 测试驱动程序。
  4   驱动程序的加载和卸载
  可以将驱动程序静态编译进内核中,也可以将它作为模块在使用时再加载。在配置内核 时,如果某个配置选项被设为 m ,就表示它将会被编译成一个模块。在 2.6 的内核中,模 块的扩展名为.ko ,可以使用 insmod 命令加载,使用 rmmod 命令卸载,使用 lsmod 命 令查看内核中已经加载了哪些模块。
  当使用 insmod 加载模块时,模块的初始化函数被调用,它用来向内核注册驱动程序; 当使用 rmmod 卸载模块时,模块的清除函数被调用。在驱动代码中,这两个函数要么取 固定的名字: init_module 和 cleanup_module ,要么使用以下两行来标记它们(假设初始 化函数、 清除函数为 my_init 和 my_cleanup)。
  moudle_init(my_init); module_exit(my_cleanup);

房地产行业融资遭遇困境,以万科为代表的房地产行业,现状如何?头号有新人房地产行业对资金的需求量非常大,并且国家相关政策的变化会对其产生不可估量的影响。房地产企业作为资金密集型企业,其发展的最重要因素是拥有充足且稳定的现金流。然而,由于之前的河北证监局全方位推动企业规范上市取得新突破河北上市公司家数达74家,为历史最高2022年IPO上市过会企业9家,其中已上市5家,创历年之最拟上市企业53家,达历史新高2022年新增辅导备案企业24家,居历年峰值中证网讯(记港籍省政协委员举办湾区国际人才嘉年华,让人才流动起来据数据显示,粤港澳大湾区92城市中,有4个城市位列全球城市人才竞争力百强,在全球人才争夺战中发展态势强劲。1月13日上午,广东省政协十三届一次会议第二场委员通道现场,省政协香港地区事关猪肉价格!国家发改委最新发声!涉及这些企业据国家发展改革委微信公众号消息,针对近期生猪价格低位运行的情况,国家发展改革委价格司组织部分大型生猪屠宰企业召开会议,深入分析生猪市场供需和价格形势,建议屠宰企业适当增加商业库存提推荐一首你百听不厌的歌吧(一首)为什么好听?答我想来想去,唯有东方红这首歌,让我百听不厌,其他的歌曲都没有东方红好。为什么?因为,沒有毛主席,沒有共产,我们还生活在,吃不饱穿不暖的旧社会里,你想想看,人饭都吃不饱,那有穷心思大衣哥朱之文能火多久?说实话我从来不喜欢老朱演唱会长相也不好歌声又是模访人家的丶又不是大美女这些对我来说O吸引力只是听他讲过几回话通过河南小年轻上门求助结果分文未助在也不想听老朱一句话之声丶觉得他不懂什魔兽世界的外观有花式翅膀,雷文德斯套装类似血精灵传承套,你觉得这幻化如何?暗影国度的护甲外观从目前四个区域不同的风格,总结起来就是有了以往魔兽护甲的味道,而不同区域的盟约斗篷,三阶段的升级之后,也会随等级而变得越来越炫酷。如果搭配传说级别的肩膀,每个区域你认为魔兽世界正式服最值得单刷的飞行坐骑是什么?你好,关于这个问题我的看法如下。我个人认为刷坐骑主要还是要根据个人的审美喜好来,每个人的审美喜好都不一样。虽说如此,我个人还是要向你推荐一下这几个飞行坐骑,先说明,飞行坐骑我喜欢那汤普森的回归,水花兄弟重组!为什么维金斯和普洱却不会打球了?因为那个人呗,队内薪资第二,众多记录的保持者,勇士王朝的缔造者之一,水花的另一半,那个跟腱拉伤后还要回来执行罚球,恳求坚持两分钟的那个男人。汤神复出后也在尽力的找回那个曾经的自己,春节马上到了,大家会给至亲的小辈发压岁钱吗?我们家弟兄俩,我是哥哥,我和我弟弟商量好的,每年春节我给我侄女500元,我弟弟给我儿子500元,这样大家都不吃亏。一开始我弟弟还说这样大家都不要给了,给来给去等于交换,我说,这不行
这事我自己说出来都感觉有点不太相信,就是我被滴滴车司机给耍了这件事我自己说出来都感觉有点不太相信,就是我被滴滴车司机给耍了,而且他在摆我一道的当时。我完全没有反应出来我被耍了。我甚至还为他担心了一下。事情是这样的,就是我当天有个七点半起飞的自贸港观察焦点新海航助力海南建设面向太平洋印度洋的区域国际航空枢纽新海航聚焦产业主赛道助力海南建设面向太平洋印度洋的区域国际航空枢纽网链全球的活力海南日报记者周晓梦一年多时间,能拿下多少个第一?海航航空集团给出了答案开辟海口巴黎首条离岛免税货物直京东百亿补贴,姗姗来迟京东,将正式启动百亿补贴。日前有网友发现,京东APP在其更新日志中表示京东3。8节,百亿补贴上线。这印证了坊间此前的传闻,京东将通过百亿补贴,围绕价格发力,再度布局电商市场。应用商3月2日大盘走势预测绝地反击!今天是反弹还是反抽?指数今天行情上,上证指数,比我们想象中的要强势,又是一根中阳线,还创出近期反弹的新高,预计短期指数还能上冲一下,压力位大约在3350点附近,就是下图中的黑色线,是压力位。对于明天和港澳会客厅何超琼创造比他人更高的价值方算创业成功中新网香港3月1日电(记者曾平)港区全国政协委员何超琼大学毕业之初曾有一段创业经历。她近日接受中国新闻网港澳会客厅采访时表示,创业者要打造出比他人更高的价值,这才是创业成功。我认为财政部对于购置期在2023年的新能源汽车继续免征车辆购置税中证网讯(记者欧阳剑环彭扬)财政部副部长许宏才3月1日在国新办权威部门话开局系列主题新闻发布会上介绍,释放消费的潜力关键是解决好不敢消费不便消费不愿消费等突出问题,财政部门将全面落2月份月度总结买入舍得酒业本月进行了一次大的操作,我把东方雨虹换成了舍得酒业。上一次大的操作还是在去年,当时煤业很是疯狂,不敢说话,不过现在我觉得煤业还好。之所以这么操作也并不是我就不看好东方雨虹了,我依然AIGC大爆发投资人一天看20个项目,创业者千帆竞发ChatGPT可以说是近十年来AI领域最轰动的突破,不仅影响了科技圈,也辐射到了创投圈。创业者纷纷扑向AIGC方向,投资人也开始忙起来了。在近期一些论坛和采访中,第一财经感受到,无意媒苏宁集团以股东出资的形式向国米注资1000万欧元现金直播吧3月1日讯意大利媒体CalcioeFinanza报道,苏宁集团以股东出资的形式向国际米兰注资1000万欧元现金。报道称,这笔钱从苏宁在2021年从美国基金橡树资本获得的贷款中宁王五折甩卖电池,绑定车企未来,用户买车或照样没优惠去年,有一段话目前除特斯拉之外的新能源整车厂都是亏损的,因为动力电池成本占到汽车总成本的4060,我现在不是给宁德时代打工吗?广汽集团董事长曾庆洪的发自肺腑的牢骚,揭露了新能源汽车(环境)山东加快收储调剂两高建设项目碳排放指标新华社济南3月1日电(记者张武岳袁敏)记者从山东省政府新闻办3月1日举行的新闻发布会上获悉,山东省相关部门已完成9个两高项目碳排放减量替代方案审核,同时通过实行碳排放指标收储调剂,