第一个驱动程序(在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的输出日志等级,但是不知道是哪里操作不对,也没有实现理想的效果,暂且把这个问题搁下,接下来学习如何实现设备模块自动设置设备号和设备节点先。
这里写图片描述

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 驾照外地转本地怎么办 车转回老家保险怎么办 考驾照一直不过怎么办 驾照2年没考出来怎么办 驾考体检色盲怎么办 杭州居住告知单怎么办 郑州有房怎么办暂住证 郑州买车怎么办暂住证 在青岛办暂住证怎么办 异地买车暂住证怎么办 广州暂住证过期了怎么办 杭州暂住证过期了怎么办 居住卡到期了怎么办 居住卡过期了怎么办 在合肥办暂住证怎么办 在西安办暂住证怎么办 杭州没办暂住证怎么办 暂住证超过2月怎么办 机动车大本丢了怎么办 北京老年卡2018怎么办 暂住卡过期了怎么办 我暂住证过期了怎么办 我没租房怎么办暂住证 孩子异地入学籍怎么办 孩子入不了学籍怎么办 常州没有暂住证怎么办牌照 东莞居住证过期了怎么办 杭州告知单过期怎么办 杭州暂住证到期了怎么办 在杭州租房怎么办暂住证 杭州暂住证丢了怎么办 在宾馆住怎么办暂住证 上海学车暂住证怎么办 环保车贴丢了怎么办 交通事故交警不处理怎么办 哈尔滨冰雪大世界夏天怎么办 下围棋没天赋怎么办 围棋计算力不好怎么办? 围棋3段后怎么办 遇到围棋中的断怎么办 手机出现等待中怎么办