Linux驱动入门—第一个驱动hello编写

版权声明:随意转载,注明链接地址即可 https://blog.csdn.net/weixin_38812277/article/details/87885260

1、环境配置:

构建内核树,下载和目标机运行的“相同”内核源码,编译安装,安装内核。【编译安装内核见另一博客】

/src/usr/目录保存下载的源码。驱动模块编译需要和内核链接,需要内核源码  【注】一般用此目录,不用也可以,随便哪个目录

编译安装好后结果得到如下结果:

/lib/modules/x.x.x-x-generic 目录下存在安装的内核模块    【此文件夹是内核编译安装的时候生成的,里面存在build文件夹】  

2、编写驱动源码,安装驱动,使用驱动,卸载驱动

开始文件夹只包含:hello.c 和 Makefile 两个文件。

然后执行make命令。        生成有hello.o hello.ko hello.mod.o hello.mod.c modules.order Modules,symvers  

安装模块  insmod hello.ko           此时可以在/proc/devices里面看到已经加载的模块和主设备号。【执行此命令应该会有信息打印,模块源码的中编写了就有,但是虚拟机中的不会直接显示在终端里面,执行dmesg命令才可以看到,或者是源码中printk的优先级不够】

创建设备节点,在/dev目录下创建节点     【虽然驱动已经加载,但还是不能够使用,还没有设备对应的文件对设备进行抽象封装】

执行命令:mknod /dev/hellodev c 231 0   【231是主设备号, 0暂时不清楚。】

/proc/devices 与 /dev的区别

  • /proc/devices中的设备是驱动程序生成的,它可产生一个major供mknod作为参数。这个文件中的内容显示的是当前挂载在系统的模块。当加载驱动HelloModule的时候,并没有生成一个对应的设备文件来对这个设备进行抽象封装,以供上层应用访问。
  • /dev下的设备是通过mknod加上去的,用户通过此设备名来访问驱动。我以为可以将/dev下的文件看做是硬件模块的一个抽象封装,Linux下所有的设备都以文件的形式进行封装。

参考链接:https://www.cnblogs.com/amanlikethis/p/4914510.html

【注意Makefile文件格式特别注意】:大小写,缩进等。

使用驱动:编写test.c  使用open系统调用     fd = open("/dev/hellodev",O_RDWR);    打开驱动,观察现象。同样打印的内容只在执行dmesg命令后才能看到。【听说虚拟机才会这样】

卸载驱动:rmmod hello

猜你喜欢

转载自blog.csdn.net/weixin_38812277/article/details/87885260
今日推荐