应用open调用内核open,应用close调用内核close通信程序
1.在TM命令窗口中,不要进入sudo -s,先创建一个普通目录 mkdir liu
2.下载已经配置好的Makefile文件(在虚拟机liunx系统浏览器输入tiie.cn网址,找到本文,下载Makefile文件),将这个文件移动到创建的liu文件夹内,如果下载后名称不是Makefile,重命名下载的文件为Makefile
不是我吹,我的云盘下载速度吊打某度云,免费不限速
3.进入root模式 ,创建驱动程序: hello.c程序, vim hello.c
注意不要改名字,否则可能会报错,这个makefile配置的是hello.c不能改名字的!!!非高手怕报错,将下面所有东西,全部放在liu文件夹内
提示:下面程序直接在liunx浏览器里面复制即可,不用敲,很多同学容易敲错,报错找不到问题所在。
程序中liuhangyu可改成你的名字
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <linux/kdev_t.h>
#include <linux/fs.h> //file_operations
MODULE_LICENSE ("GPL");
int i = 10;
struct file_operations ops;
struct cdev mycdev;
int major = 100;
int minor = 1;
dev_t dev;
int j= 0;
int k= 0;
int myopen(struct inode *pinode,struct file *pfile)
{
j++;
printk(KERN_INFO "liuhangyu myopen run j= %d\n",j);
return 0;
}
int myclose(struct inode *pinode,struct file *pfile)
{
k++;
printk(KERN_INFO "liuhangyu myclose run k= %d\n",k);
return 0;
}
void liuhangyu_init(void)
{
int ret;
mycdev.owner=THIS_MODULE;
dev = MKDEV(major,minor);
ret = register_chrdev_region(dev,1,"liuhangyu");
if(ret==-1)
{
printk(KERN_INFO "dev cant't use\n");
ret = alloc_chrdev_region(&dev,1,1,"liuhangyu"); //automatic allocation dev
if(ret==0)
{
printk(KERN_INFO "alloc : major= %d\n",MAJOR(dev));
}
else
{
printk(KERN_INFO "alloc error\n");
return ;
}
}
else
{
printk(KERN_INFO "dev can use\n");
}
ops.owner=THIS_MODULE;
ops.open=myopen;
ops.release=myclose;
cdev_init(&mycdev,&ops);
cdev_add(&mycdev,dev,1); //mycdev send dev,equipment 1
return ;
}
static int __init hello_init (void)
{
i ++;
liuhangyu_init(); //init
printk (KERN_INFO "driver init,i = %d\n",i);
return 0;
}
static void __exit hello_exit (void)
{
i ++;
printk (KERN_INFO "driver exit,i = %d\n",i);
unregister_chrdev_region(dev,1);
cdev_del(&mycdev);
}
module_init (hello_init);
module_exit (hello_exit);
4.保存下一步分别输入 make
回车 insmod hello.ko
回车
5.完成后打开第二TM窗口,在同目录下,创建同理app.c程序,这个是应用层程序。
#include "stdio.h"
#include "fcntl.h"
#include "unistd.h"
#include "stdlib.h"
int main()
{
int fd;
int q = 0;
while(1)
{
fd = open("./liuhangyu",O_RDWR,0777) ;
if(fd==-1)
{
printf("open error\n");
return -1;
}
q ++;
printf("liuhangyu open run q = %d\n",q);
sleep (8);
close(fd);
q ++;
printf("liuhangyu close run q = %d\n",q);
sleep (8);
}
return 0;
}
6.输入 mknod ./liuhangyu c 100 1
7.输入 gcc -o app app.c
8.输入./app
观察2个窗口现象,每隔几秒给第一个窗口输入dmesg
可以看到通信是成功的
以上则完成全部测试,下面讲解退出
9.输入键盘敲Ctrl+C强制退出app程序
10 分别输入rmmod hello.ko
回车,make clean
回车
好下课!
按照步骤做的,为什么到make的时候显示no targets specified and no makefile found
makefile和hello.c不在同一文件内,请在文件夹中操作
是生成hello.c之后,放到开始创建的文件夹中吗,这样做也不行
输入ls命令,查看有没有makefile文件,你肯定没有这个文件把这个文件放在和hello.c同一目录中
赞
很有用的文章