第一个驱动程序(在Ubuntu系统下运行)
来源:互联网 发布:h5仿淘宝下拉加载详情 编辑:程序博客网 时间:2024/06/05 19:02
一、构造内核源码树
# apt-cache search linux-source# apt-get install linux-source-4.4.0(下载的源码在目录/usr/src下)# 解压内核源码tar xjf .....进入源码目录# make oldconfig# make# make modulesmake modules_install
ref:http://blog.chinaunix.net/uid-24782829-id-3211008.html
由于我主机本身内核版本就为4.4.0-21-generic,所以/lib/modules/4.4.0-21-generic/本身就存在,所以上述过程就不需要执行了。至此,构造内核源码树完成。
make时报错:
scripts/sign-file.c:23:30: fatal error: openssl/opensslv.h: 没有那个文件或目录 compilation terminated. scripts/Makefile.host:91: recipe for target 'scripts/sign-file' failed make[1]: *** [scripts/sign-file] Error 1 Makefile:566: recipe for target 'scripts
解决方法:ubuntu下缺少了如下的组件,安装一下即可
sudo apt-get install libssl-dev
二、在Linux下写驱动程序
源代码firstdrv.c:
#include <linux/module.h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/init.h>#include <linux/delay.h>static int first_drv_open(struct inode *inode, struct file *file){ printk("first_drv_open\n"); return 0;}static ssize_t first_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos){ printk("first_drv_write\n"); return 0;}static struct file_operations first_drv_fops = { .owner = THIS_MODULE, /* 这是一个宏,推向编译模块时自动创建的__this_module变量 */ .open = first_drv_open, .write = first_drv_write, };static int first_drv_init(void){ register_chrdev(246, "first_drv", &first_drv_fops); // 注册, 告诉内核 return 0;}static void first_drv_exit(void){ unregister_chrdev(246, "first_drv"); // 卸载}module_init(first_drv_init);module_exit(first_drv_exit);MODULE_LICENSE("GPL");
makefile:
obj-m:=firstdrv.o #注意.o文件名要和驱动程序文件名一致CURRENT_PATH :=$(shell pwd) LINUX_PATH :=/lib/modules/4.4.0-21-generic/buildall: make -C $(LINUX_PATH) M=$(CURRENT_PATH) modules clean: make -C $(LINUX_PATH) M=$(CURRENT_PATH) clean
# make 编译模块# insmod firstdrv.ko#lsmod #cat /proc/devices
测试程序firstdrvtest.c:
#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdio.h>int main(){ int fd; int val=1; fd=open("/dev/xyz",O_RDWR); if(fd<0) printf("can't open\n"); write(fd,&val,4); return 0;}
# mknod /dev/xyz c 246 0 创建设备节点# ./firstdrvtest 执行测试程序
2017/9/15目前的情况是firstdrv.c可以正常加载(insmod)到/proc/devices,lsmod命令也能够看到该模块,但是给/dev/xyz创建节点后,在执行firstdrvtest测试时,无法打开该文件。
2017/9/18切换成root用户执行./firstdrvtest可执行文件,文件可以打开,但没有按照模块中open和write函数指定的方式打印信息,打印信息只可以在日志中查看。查了原因,是因为printk函数运行在内核态,如果要让它显示到虚拟终端上,还要加上其他的配置,如果不更改printk函数的显示等级,只能用dmesg命令查看输出信息,我又花了点时间折腾了下修改printk的输出日志等级,但是不知道是哪里操作不对,也没有实现理想的效果,暂且把这个问题搁下,接下来学习如何实现设备模块自动设置设备号和设备节点先。
阅读全文
0 0
- 第一个驱动程序(在Ubuntu系统下运行)
- 第一个驱动程序(在开发板上运行)
- ubuntu下运行第一个opencv程序
- 在Ubuntu运行第一个c++程序
- 在 Tomcat 下运行第一个Servlet
- ubuntu下运行第一个小例子——wordcount
- ubuntu下编写并运行第一个c语言程序
- ubuntu下编写并运行第一个c语言程序
- 在Ubuntu下开发驱动程序
- 第一个LINUX下的驱动程序
- Linux下的第一个驱动程序
- 在命令行下运行第一个hadoop的程序
- Ubuntu系统下的第一个django项目
- 在VMware虚拟机下安装Android Studio(AS)以及运行第一个HelloWorld程序
- 在VMware里Ubuntu下编译内核,运行一个示例的驱动程序
- 在Ubuntu下基于QEMU运行XINU OS x86系统
- LDD3学习指南(一)第一个驱动程序
- 第一个内核驱动程序(学习资料)
- 异常处理机制
- 用Markdown写CSDN博客(没网也能写,棒!)
- Servlet(2)Eclipse中的模板创建与使用
- Pat(A) 1105. Spiral Matrix (25)
- 支付宝余额被关了,如何提现
- 第一个驱动程序(在Ubuntu系统下运行)
- Codeforces Round #135 (Div. 2)(树dp)
- Unity 2017 UGUI 如何在Image或Button上播放帧动画
- 深入浅出山寨币交易签名 + 公钥开发使用教程
- bzoj 1630 && 2023: [Usaco2005 Nov]Ant Counting 数蚂蚁(有重复元素的组合数)
- Java中Class类及用法
- 九度[1105]-字符串的反码
- 【FFmpeg】AVPacket相关
- docker的下载与安装