9-uClinux的扩充和应用-29-uClinux的扩充和应用-2.ppt

9-uClinux的扩充和应用-29-uClinux的扩充和应用-2.ppt

  1. 1、本文档共91页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
9-uClinux的扩充和应用-29-uClinux的扩充和应用-2

Linux device driver 的概念 Linux device driver 的概念 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口,设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件, 应用程序可以象操作普通文件一样对硬件设备进行操作. Linux device driver 的概念 Linux device driver 的概念 设备号 Linux device driver 的概念 字符设备和块设备的主要区别是: 在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了,块设备则不然,它利用一块系统内存作缓冲区,当用户进程对设备请求能满足用户的要求,就返回请求的数据. Linux device driver 的概念 块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待. 用户进程是通过设备文件来与实际的硬件打交道.每个设备文件都有其文件属性(c/b),表示是字符设备还是块设备 Linux device driver 的概念 设备文件的的主设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程将无法访问到驱动程序. Linux device driver 的概念 设备驱动程序是内核的一部分,它完成以下的功能: 1.对设备初始化和释放. 2.把数据从内核传送到硬件和从硬件读取数据. 3.读取应用程序传送给设备文件的数据和回送应用程序请求的数据. 4.检测和处理设备出现的错误. 每个字符设备用结构char_device_struct来描述,所有的字符设备组成数组chrdevs: static struct char_device_struct { struct char_device_struct *next; unsigned int major; unsigned int baseminor; …… char name[64]; struct file_operations *fops; …… } *chrdevs[CHRDEV_MAJOR_HASH_SIZE]; 初始化 注册一个字符设备register_chrdev() (fs/char_dev.c) register_chrdev(unsigned int major,const char *name,struct file_operations *fops) int register_chrdev(unsigned int major, const char *name, const struct file_operations *fops) { struct char_device_struct *cd; struct cdev *cdev; char *s; int err = -ENOMEM; cd = __register_chrdev_region(major, 0, 256, name); if (IS_ERR(cd)) return PTR_ERR(cd); cdev = cdev_alloc(); //分配一个cdev对象空间 if (!cdev) goto out2; cdev-owner = fops-owner; cdev-ops = fops; kobject_set_name(cdev-kobj, %s, name); for (s = strchr(kobject_name(cdev-kobj),/); s; s = strchr(s, /)) *s = !; err = cdev_add(cdev, MKDEV(cd-major, 0), 256); if (err) goto out; cd-cdev = cdev; return major ? 0 : cd-major;out: kobject_put(cdev-kobj);out2: kfree(__unregister_chrdev_region(cd-major, 0, 256)); return err;} static struct char_device_struct *__register_chrdev_region (unsigned int major, unsigned int baseminor, int minorct, const char *name) { struct char_device_struct *cd,

您可能关注的文档

文档评论(0)

pkaokqunw + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档