linux上下层通信的实现.doc

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

对于任何一种带MMU(内存管理单元)的处理器,Linux操作系统可通过内存管理为每一个进程单独分配4GB的虚拟内存空间。这4G的内存空间中,3G是用户空间,1G是内核空间。内核态的进程运行在内核空间,用户态的进程运行在用户空间。由于运行所在的内存空间不同,用户空间的进程无法直接调用内核空间的函数,也无法引用内核空间的变量。 要实现用户空间对内核空间的调用,就必须通过Linux提供的机制。Linux是通过文件系统实现的用户空间对设备的访问。 在linux中,所有的设备都是“文件”,每一个设备都对应文件系统中/dev目录下的一个设备文件(底层在注册设备时创建的文件)。而且每一个设备是用一个设备结构体struct device dev来描述的,设备结构体struct device中有一个元素struct file_operations :dev.ops = testmodule_fops;这里面保存了这个设备的相关操作函数,包括open,close,read,write,ioctl等对设备进行具体操作的底层驱动函数: static struct file_operations testmodule_fops = { .owner = THIS_MODULE, .open = testmodule_open, .release = testmodule_release, // .read = testmodule_read, .write = testmodule_write, }; 当用户空间的进程通过系统调用(linux为用户空间提供的访问底层设备的接口叫“系统调用”)open(文件路径,打开权限)函数打开位于 /dev 目录下的某一设备文件时,就会获得这个文件的文件描述符,然后继续通过系统调用对这个文件描述符进行操作,比如write(fd,),close(fd),ioctl(fd,,)这些系统调用,系统会自动调用设备文件所对应的设备结构体中的struct file_operations元素中相对应的open,close等函数。 这样,用户空间的进程与底层驱动就通过文件节点这样一个系统完成了交流。即:上层通过系统调用只对设备文件进行打开关闭读写等操作,不管底层驱动。系统会自动根据上层对文件的操作进行调用此文件对应的底层设备的驱动函数。 代码: static int __init testmodule__init(void){ //这个函数里面的步骤是固定格式,linux创建字符设备都是这个流程,调用的都是这几个函数。主要分为:注册设备号、分配空间、关联设备结构体与struct file_operations结构体、添加字符设备四步 int err = -1; dev_t dev = 0; struct device* temp = NULL; /*动态分配主设备和从设备号*/ err = alloc_chrdev_region(dev, 0, 1, TESTMODULE_DEVICE_NODE_NAME); if(err 0) { goto fail; } testmodule_major = MAJOR(dev); testmodule_minor = MINOR(dev); testmodule_dev = kmalloc(sizeof(struct testmodule_android_dev), GFP_KERNEL); if(!testmodule_dev) { err = -ENOMEM; goto unregister; } /*初始化设备*/ err = __testmodule_setup_dev(testmodule_dev); //关联设备结构体与设备操作结构体、添加设备 if(err) { goto cleanup; } static int __testmodule_setup_dev(struct testmodule_android_dev* dev) { int err; dev_t devno = MKDEV(testmodule_major, testmodule_minor); memset(dev, 0, sizeof(struct testmodule_android_dev)); cdev_init((dev-dev), testmodule_fops); //上面这个函数将fops关联到设备结构体dev:dev-dev.ops = testmodule_fops; dev-dev.o

文档评论(0)

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

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

1亿VIP精品文档

相关文档