当前位置: 首页 > news >正文

个人网站建设图片素材潍坊网站建设SEO优化

个人网站建设图片素材,潍坊网站建设SEO优化,公司支付网站款做凭证,wordpress描述怎么写前言 内核驱动:运行在内核态的动态模块,遵循内核模块框架接口,更倾向于插件。 应用程序:运行在用户态的进程。 应用程序与内核驱动交互通过既定接口,内核态和用户态访问依然遵循内核既定接口。 环境搭建 系统&#…

前言

内核驱动:运行在内核态的动态模块,遵循内核模块框架接口,更倾向于插件。
应用程序:运行在用户态的进程。
应用程序与内核驱动交互通过既定接口,内核态和用户态访问依然遵循内核既定接口。

环境搭建

系统:openEuler-20.03-LTS-SP3

yum install gcc kernel-devel

编写源码

  • char_module.c
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <asm/device.h> //下面这三个头文件是由于动态创建需要加的
#include <linux/device.h>
#include <linux/cdev.h>MODULE_LICENSE("GPL");#define DEVICE_NAME "char_module"
#define BUF_SIZE 32static struct class *cdev_class;
dev_t dev_num = 0; // 这里是动态分配设备号和动态创建设备结点需要用到的
struct cdev dev_c;static char context_buf[BUF_SIZE]={"this a test context buffer\0"};static ssize_t read(struct file *, char *, size_t, loff_t *);
static ssize_t write(struct file *, const char *, size_t, loff_t *);
static int open(struct inode *, struct file *);
static int release(struct inode *, struct file *);// 初始化字符设备驱动的 file_operations 结构体
struct file_operations fops = {.read = read,.write = write,.open = open,.release = release
};static int __init demo_init(void)
{int ret, err;printk(KERN_INFO "%s: %s", DEVICE_NAME , __func__);// 注册设备驱动ret = alloc_chrdev_region(&dev_num, 0, 1, DEVICE_NAME); // 动态分配设备号if (ret){printk("demo_init register failure\n");unregister_chrdev_region(dev_num, 1);return ret;}printk("demo_init register success\n");// 初始化设备操作cdev_init(&dev_c, &fops);err = cdev_add(&dev_c, dev_num, 1);if (err){printk(KERN_NOTICE "error %d adding cdev\n", err);unregister_chrdev_region(dev_num, 1);return err;}// 动态创建设备结点cdev_class = class_create(THIS_MODULE, DEVICE_NAME); if (IS_ERR(cdev_class)){printk("ERR:cannot create a cdev_class\n");unregister_chrdev_region(dev_num, 1);return -1;}device_create(cdev_class, NULL, dev_num, 0, DEVICE_NAME);return ret;
}static void __exit demo_exit(void)
{printk(KERN_INFO "%s: %s", DEVICE_NAME , __func__);// 注销设备驱动device_destroy(cdev_class, dev_num);class_destroy(cdev_class);unregister_chrdev_region(dev_num, 1);
}static ssize_t read(struct file *filp, char *buf, size_t len, loff_t *off)
{// 内核空间到用户空间copyprintk(KERN_INFO "%s: %s", DEVICE_NAME , __func__);if (raw_copy_to_user(buf, &context_buf, sizeof(context_buf))){return -EFAULT;}printk(KERN_INFO "user space: %pF", buf);printk(KERN_INFO "read: %pF; size: %ld; data: %s", &context_buf, sizeof(context_buf), context_buf);return BUF_SIZE;
}static ssize_t write (struct file *filp, const char __user *buf, size_t len, loff_t *off)
{// 用户空间到内核空间copyprintk(KERN_INFO "%s: %s", DEVICE_NAME , __func__);if (raw_copy_from_user(&context_buf, buf, sizeof(context_buf))){return -EFAULT;}printk(KERN_INFO "user space: %pF", buf);printk(KERN_INFO "write: %pF; size: %ld; data: %s", &context_buf, sizeof(context_buf), context_buf);return BUF_SIZE;
}static int open(struct inode *inodp, struct file *filp)
{printk(KERN_INFO "%s: %s", DEVICE_NAME , __func__);return 0;
}static int release(struct inode *inodp, struct file *filp)
{printk(KERN_INFO "%s: %s", DEVICE_NAME, __func__);return 0;
}module_init(demo_init);
module_exit(demo_exit);
  • Makefile
ifneq ($(KERNELRELEASE),)
obj-m := char_module.oelse
PWD  := $(shell pwd)
KVER := $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:$(MAKE) -C $(KDIR) M=$(PWD) modules modules_install
clean:rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions modules.*  Module.*
endif

app.c

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>#define CHAR_DEV_NAME "/dev/char_module"int main()
{int ret;int fd;char buf[32];fd = open(CHAR_DEV_NAME, O_RDWR | O_NDELAY);if(fd < 0){printf("open failed!\n");return -1;}int size = read(fd, buf, 32);printf("read size: %d;\nbuffer:[%s]\n", size, buf);char *write_buf = "use a application wirte to driver buffer";int w_size = write(fd, write_buf, strlen(write_buf));printf("write size: %d;\nbuffer:[%s]\n", w_size, write_buf);close(fd);return 0;
}

构建并测试

  • 驱动构建
    make && insmod char_module.ko
    
  • 驱动信息确认
    在这里插入图片描述
  • 应用程序构建
    gcc app.c -o app
    ./app
    
  • 应用程序运行结果
    在这里插入图片描述
  • 查看驱动日志
    dmesg
    
    在这里插入图片描述
http://www.yayakq.cn/news/790219/

相关文章:

  • 网站开发教程视频集团网站建设需求
  • 大丰建站wordpress读书插件
  • iis端口相同不同网站建设项目网络图怎么画
  • 山西建设执业资格注册管理中心网站中国采购网官方网站
  • 网站模板 古典wordpress 4.9.6中
  • 公司网站建设设计公司排名网站建设任务和标准
  • 安装网站提示dir一般制作一个网站要多久
  • 商务网站建设服务商做外国购物网站需要交税吗
  • 找生意做去哪个网站揭阳本地网
  • 温州网站建设方案开发牛杂网这类网站怎么做的
  • 专题文档dede企业网站建设北京网站开发公司大全
  • 住建部网站资质查询中宏建设集团网站一级页面标题怎么做的
  • 深圳企业网站制作公司怎样wordpress插件一键
  • 视频网站开发 价格注册网址免费
  • 外包网络推广公司推广网站个人网站内容如何填写
  • 购物小网站建设珠海网站设计价格
  • 做网站还需要搜狗吗玉环做企业网站
  • 购买一个网站空间如何可以多个域名使用吗装修设计专业
  • 山东网站建设方案制作网站界面设计技巧
  • 外贸cms建站统一企业官方网站
  • 无锡市政建设集团有限公司网站做网站项目所需资源
  • 谷歌seo网站建设微信网站建设
  • 网站开发项目介绍展示型网站建设模板
  • 分类目录网站怎么做阿里做网站怎么做
  • 免费网站建设链接很长 知呼网站开发 文件架构图
  • 做外贸网站基本流程深圳北斗部标平台网站建设
  • 有关网站开发的国外书籍网站建设管理制度实施方案
  • 建设银行网站查询不显示整存争取金额百度云用流量做网站
  • 微商城微网站开发wordpress < 3.6.1
  • 阜宁企业做网站多少钱网页设计图片如何显示