zoukankan      html  css  js  c++  java
  • Linux驱动开发相关

    一般用printk

    查看/etc/sysconf文件,看看内核调试信息放到了哪里 

    打印的消息一般放在/var/log/messages文件里面。

    如果你是在X Windows下的XTerm中insmod的,你不会看到输出,使用dmesg就可能看到在加载和卸载模块时的输出内容,只有直接在console下加载才能直接显示到屏幕上。

    Linux下程序分为内核态和用户态,我们编写的驱动是内核态的,通过insmod加载.ko模块,再向/dev中注册设备节点后,用户态的程序就可以通过open,read,write,ioctl,release等方法访问,所以按你的意思,需要写一个用户态的可执行文件对设备进行操作,调试设备是否驱动成功。

    一个完整的驱动,需要提供如下的东西,
    第一,用户空间/dev下面的设备节点(我觉得类似于windows驱动开发中的符号链接,是专门暴露给用户态使用的)。当然,如果该设备仅仅是内核的使用,例如I2C,则不需要在/dev下面建立设备节点。
    第二,驱动程序,就是能到映射到/dev下面的fopen等系列操作。

    make写好的驱动程序之后会生成.ko文件,此ko文件就是编译之后生成的模块文件,也就是Makefile文件中obj-m缩生成的文件,然后需要将此文件加载到模块,即使用insmod或者modprobe命令将生成的模块文件(.ko文件加载进内核),但是此时所写好的应用程序还是不能运行,需要在/dev下创建设备节点,手动创建设备节点的方法是:mknod 设备节点名称 设备类型  主设备号  次设备号,例如:mknod  memdev c 260  0,创建好之后会在/dev目录下看到一个字符设备名字为memdev的类型。然后此时应用程序才能正常运行。

    Linux的主设备号和次设备号:

    以我的理解就是,主设备号是对应一个驱动程序,鉴别的是驱动。因为一个驱动程序很可能为多个设备提供服务。而次设备号就表明该驱动程序具体为哪个设备服务,鉴别的是设备。所以驱动程序向外暴露的“接口”(也就是/dev下的文件),可以有多个。所以可以看到很多主设备号相同的设备文件,但次设备号不同的设备文件。

    举一个例子:也就是针对一个.ko模块mknod多个设备节点,然后用户层应用程序就可以对分别对这些设备节点(文件)操作了,实质上操作了不同的设备。

    references:

    http://unix.stackexchange.com/questions/125919/fatal-module-hello-ko-not-found

    http://bbs.csdn.net/topics/110062713

    http://blog.sina.com.cn/s/blog_6925948d0101kwky.html

    http://blog.163.com/jammy_lee/blog/static/10119547820092391220182/

    http://blog.chinaunix.net/uid-21778123-id-1815416.html

    http://blog.csdn.net/robinvanpersie/article/details/7912457

  • 相关阅读:
    如何自己手写一个热加载(转)
    阻塞I/O、非阻塞I/O和I/O多路复用、怎样理解阻塞非阻塞与同步异步的区别?
    Java NIO浅析 转至 美团技术团队
    mysql在线修改表结构大数据表的风险与解决办法归纳(转)
    MySQL性能优化
    Tomcat Connector(BIO, NIO, APR)三种运行模式(转)
    redis 单线程的理解
    Spring 中的bean 是线程安全的吗?
    Spring 自定义注解,结合AOP,配置简单日志注解 (转)
    redis 分布式锁
  • 原文地址:https://www.cnblogs.com/foohack/p/4091577.html
Copyright © 2011-2022 走看看