华清远见11.17

news2024/9/20 18:33:34

1.在用户空间中有个字符数组,要求在内核空间打印,用dmesg查看。(ioctl实现)

        zy.h,封装一个发送用的命令码

#ifndef __LED_H__
#define __LED_H__
#define UACCESS_BUF _IOW('a',1,char [128])
#endif

        zy.c 申请并自动创建设备结点,在mydev_ioctl函数中确认命令码并接受字符数组信息存储在kbuf中,同时打印kbuf信息。

#include <linux/module.h>
#include <linux/init.h>
#include<linux/device.h>
#include<linux/uaccess.h>
#include<linux/io.h>
#include<linux/fs.h>
#include"zy.h"
#define CNAME "zy"
int major;
struct class* cls;
struct device* dev;
char kbuf[128]={};
int mydev_open (struct inode *inode, struct file *file)
{
    return 0;
}
int mydev_close (struct inode *inode, struct file *file)
{
    return 0;
}

long mydev_ioctl (struct file *file, unsigned int cmd,unsigned long arg)
{
    int ret;
    if(cmd==UACCESS_BUF)
    {
        ret=copy_from_user(kbuf,(void*)arg,sizeof(kbuf));
        if(ret)
        {
            printk("copy from user error\n");
            return EIO;
        }
        printk("kbuf = %s\n",kbuf);
    }
    return 0;
}
const struct file_operations fops={
    .open=mydev_open,
    .release=mydev_close,
    .unlocked_ioctl=mydev_ioctl,
    
};

static int __init demo_init(void)
{
    major=register_chrdev(0,CNAME,&fops);
    if(major<0)
    {
        printk("register_chrdev error\n");
        return major;
    }
    printk("major=%d\n",major);
    cls=class_create(THIS_MODULE,CNAME);
    if(IS_ERR(cls))
    {
        return PTR_ERR(cls);
    }
    //提交设备结点信息
    dev=device_create(cls,NULL,MKDEV(major,0),NULL,CNAME);
    if(IS_ERR(dev))
    {
        return PTR_ERR(dev);
    }
    return 0;    
}

static void __exit demo_exit(void)
{
    device_destroy(cls,MKDEV(major,0));
    class_destroy(cls);
    unregister_chrdev(major,CNAME);
}
module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");

        test.c 打开驱动文件并发送字符数组

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/ioctl.h>
#include "zy.h"
int main(int argc, char const *argv[])
{
    char buf[128]={"You have an ambitious nature and may make a name for yourself"};
    int fd=-1;
    fd=open("/dev/zy",O_RDWR);
    if(-1==fd)
    {
        perror("open error");
        return -1;
    }
    ioctl(fd,UACCESS_BUF,buf);
    return 0;
}

makefile:编译工具

ARCH?=x86
NAME?=zy
ifeq ($(ARCH),x86)
	KERNEDIR:=/lib/modules/$(shell uname -r)/build
else
	KERNEDIR:=/home/ubuntu/linux-5.10.61
endif
PWD:=$(shell pwd)
all:
	make -C $(KERNEDIR) M=$(PWD) modules
clean:
	make -C $(KERNEDIR) M=$(PWD) clean
obj-m:=$(NAME).o

实验结果截图

 二:将结构题传递到内核空间,在内核空间打印,把值+10后传递会用户空间打印。

        zy2.h:封装结构体和发送接收两个命令码。

#ifndef __LED_H__
#define __LED_H__
typedef struct {
    int width;
    int high;
}image_t;
#define struct_send _IOW('a',1,image_t)
#define struct_recv _IOR('a',1,image_t)
#endif

        zy2.c:在接收后打印,然后加10返回用户空间

#include <linux/module.h>
#include <linux/init.h>
#include<linux/device.h>
#include<linux/uaccess.h>
#include<linux/io.h>
#include<linux/fs.h>
#include"zy2.h"
#define CNAME "zy2"
int major;
struct class* cls;
struct device* dev;
image_t kimage;
int mydev_open (struct inode *inode, struct file *file)
{
    return 0;
}
int mydev_close (struct inode *inode, struct file *file)
{
    return 0;
}

long mydev_ioctl (struct file *file, unsigned int cmd,unsigned long arg)
{
    int ret;
    if(cmd==struct_send)
    {
        ret=copy_from_user(&kimage,(void*)arg,sizeof(image_t));
        if(ret)
        {
            printk("copy from user error\n");
            return EIO;
        }
        printk("width=%d\nhigh=%d\n",kimage.width,kimage.high);
        kimage.width+=10;
        kimage.high+=10;
    }
    else if(cmd==struct_recv)
    {
        ret=copy_to_user((void*)arg,&kimage,sizeof(image_t));
        if(ret)
        {
            printk("copy to user error\n");
            return EIO;
        }
    }
    return 0;
}
const struct file_operations fops={
    .open=mydev_open,
    .release=mydev_close,
    .unlocked_ioctl=mydev_ioctl,
    
};

static int __init demo_init(void)
{
    major=register_chrdev(0,CNAME,&fops);
    if(major<0)
    {
        printk("register_chrdev error\n");
        return major;
    }
    printk("major=%d\n",major);
    cls=class_create(THIS_MODULE,CNAME);
    if(IS_ERR(cls))
    {
        return PTR_ERR(cls);
    }
    //提交设备结点信息
    dev=device_create(cls,NULL,MKDEV(major,0),NULL,CNAME);
    if(IS_ERR(dev))
    {
        return PTR_ERR(dev);
    }
    return 0;    
}

static void __exit demo_exit(void)
{
    device_destroy(cls,MKDEV(major,0));
    class_destroy(cls);
    unregister_chrdev(major,CNAME);
}
module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");

        test2.c:发送接收并打印

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/ioctl.h>
#include "zy2.h"
int main(int argc, char const *argv[])
{
    image_t image={20,40};
    int fd=-1;
    fd=open("/dev/zy2",O_RDWR);
    if(-1==fd)
    {
        perror("open error");
        return -1;
    }
    ioctl(fd,struct_send,&image);
    ioctl(fd,struct_recv,&image);
    printf("width=%d\nhigh=%d\n",image.width,image.high);
    close(fd);
    return 0;
}

makefile:编译工具

ARCH?=x86
NAME?=zy2
ifeq ($(ARCH),x86)
	KERNEDIR:=/lib/modules/$(shell uname -r)/build
else
	KERNEDIR:=/home/ubuntu/linux-5.10.61
endif
PWD:=$(shell pwd)
all:
	make -C $(KERNEDIR) M=$(PWD) modules
clean:
	make -C $(KERNEDIR) M=$(PWD) clean
obj-m:=$(NAME).o

结果截图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/13293.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022 开源之夏|EMQ 三大开源项目开发圆满收官

今年暑假&#xff0c;EMQ 携手开源之夏&#xff0c;与高校学生开展了一场精彩纷呈的开源之旅。开源之夏&#xff08;OSPP&#xff09;是由中科院软件所「开源软件供应链点亮计划」发起的、面向高校学生的暑期开源活动&#xff0c;旨在鼓励在校学生积极参与开源软件的开发维护&a…

CE-Net: Context Encoder Network for 2D MedicalImage Segmentation

Title:用于二维医学图像分割的上下文编码器网络 摘要&#xff1a;在医学图像分割领域中&#xff0c;基于UNet已经成为主流的应用框架。但是在UNet结构中连续的池化和跨步卷积操作会导致一些空间信息的丢失。在本文中提出了一个上下文编码器网络&#xff08;简称为CE-Net&#…

数据分析师的Windows装机必备软件

文章目录1. Python安装包列表2. Office 3653. Visual Studio Code4. Git5. 向日葵6. 聊天软件7. OneDrive8. iCloud9. 网易邮箱大师10. 搜狗输入法11. 阿里云盘对于数据分析师,装机是再经常不过的一件事情,但是每次装机都要想装什么好,找来找去,故列出来供大家参考. 当然, 系统…

CentOS7自有服务和软件包

文章目录什么是服务管理服务的命令&#xff1a;systemctl列出服务服务启停开机自动启动服务服务状态软件包RPM查询安装了什么软件卸载某个软件安装某个软件查询文件所属的包名查询软件安装后&#xff0c;生成了哪些文件YUM命令epel-release什么是服务 什么是程序&#xff08;C…

最优化——凸优化概述

引言 这是中科大最优化理论的笔记&#xff0c;中科大凌青老师的凸优化课程&#xff0c;详尽易懂&#xff0c;基础扎实。不论是初学者还是从业多年的人&#xff0c;都值得系统地好好学一遍。 本文主要介绍什么是凸优化&#xff0c;通过几个例子来阐述什么是凸优化问题。让大家…

3年测试经验,面试27k自动化测试岗被diss,想给进阶自动化的人提个醒...

毕业后一直从事功能测试的工作&#xff0c;时间久了就没有一点想法&#xff0c;天天都是点点点&#xff0c;也没有一点提升&#xff0c;看着身边一个个的人都忙得不可开交&#xff0c;打听之后知道他们都是在技术上忙&#xff0c;而不像我&#xff0c;在杂事上忙&#xff0c;特…

vue 使用screenfull 实现全屏展示,全局水印实现, 以及全屏放大后部分组件无法使用,水印无法全屏显示问题的解决

需求&#xff1a;1. web项目中看板页面需要单独全屏显示 2. 项目全局增加水印&#xff0c;水印文字为当前用户登录姓名&#xff0c;登录页不显示水印 出现问题描述 单页面进行全屏显示&#xff0c;下拉&#xff0c;时间选择器&#xff0c;抽屉等组件被 全屏覆盖到下一层&…

MyBatis入门基础

目录 1.什么是MyBatis 2.第一个MyBatis查询 2.1 准备工作 2.2 实际操作 2.2.1 定义接口 2.2.2 创建XML实现上述接口 2.3 单元测试 2.3.1 单元测试的优势 2.3.2 创建并使用单元测试 2.3.3 有关断言 3.增删改的基本操作 3.1 插入操作 特殊的添加&#xff1a;返…

【PyTorch】Torchvision

文章目录三、Torchvision1、Dataset2、DataLoader2.1 test_data2.2 test_loader2.3 drop_last2.4 shuffle三、Torchvision PyTorch官网&#xff1a;https://pytorch.org 1、Dataset 数据集描述&#xff1a;https://www.cs.toronto.edu/~kriz/cifar.html 数据集使用说明&#…

SpringCloud案例day05

SpringCloud Gateway网关 案例1&#xff1a;环境搭建 可以复制 Service-A9001 改成Gateway-C9009 》1&#xff1a;创建工程导入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artif…

汽车全景视频制作让企业营销传播无界长久

全景视频制作 全景VR视频&#xff0c;顾名思义就是能够使我们看到拍摄点周围360景致的视频。传统视频拍摄受限于镜头视角&#xff0c;所以我们只能看到镜头前方180内的景物。而全景VR视频能够看到周围360以及上下180各个角度的一切景物&#xff0c;用户能够更加多方位的观赏视频…

可观测性-Event-指标事件采样策略总结

文章目录前言采样的几种策略简单随机采样周期性完整采样基于条件的采样前言 在默认情况下&#xff0c;系统会采集所有追踪&#xff08;Tracing&#xff09;的数据。但是如果系统比较复杂&#xff0c;采集的端点比较多的时候&#xff0c;对存储压力比较大&#xff0c;这个时候我…

Educational Codeforces Round 135 (Rated for Div. 2)

A:思维 题意&#xff1a;箱子里有N个颜色的球&#xff08;用下标代表不同的颜色&#xff09;&#xff0c;每个颜色的球对应一定的数量&#xff0c;你会进行多次拿球的操作&#xff0c;当箱子里的球颜色一致时&#xff0c;你就不能再拿球了&#xff0c;问最后颜色一致的球是哪个…

免疫抑制作用的转录抑制分子

科研人员发现&#xff1a;社交失败导致了小鼠焦虑行为&#xff0c;进而抑制了化疗药物的治疗过程&#xff0c;加速了肿瘤的发展。在正常小鼠中&#xff0c;人为给予外源性糖皮质激素会使得 Tsc22d3(一个具有很强免疫抑制作用的转录抑制分子)在肿瘤浸润树突细胞(TIDC)的表达上调…

Q3营收同比翻三倍,踩猛“油门”零跑必将领跑?

近日&#xff0c;零跑汽车公布三季度财报。从财报成绩来看&#xff0c;有喜有忧。喜的是销量营收同比环比均出现大幅度增长&#xff0c;忧的是亏损同比扩大86.11%。 营收同比猛增398.5%&#xff0c;销量能否穿越迷雾&#xff1f; 详细来看&#xff0c;三季度零跑汽车销量3.56万…

【附源码】计算机毕业设计JAVA旅行指南网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven Vue 等等组成&#xff0c;B/…

HOOPS学习笔记

Hoops简介 HOOPS Visualize由一套集成的组件组成&#xff0c;可快速开发高性能设计、可视化和工程应用程序。HOOPS 3DF在每个组件中保持平台独立性&#xff0c;在Windows、Linux和Mac OS X上提供跨平台解决方案。 HOOPS Visualize包含如下组件&#xff1a; 1.HOOPS/3dGS - HO…

vue+express+mysql+elementUI实现前后端交互增删改查

简介&#xff1a;使用 Vue koa koa2-router mySql elementUI实现前后端交互 页面整体效果图&#xff1a; 编辑页面&#xff1a; 添加页面&#xff1a; 删除操作&#xff1a; 数据库客户端使用Navicat for mysql 当然你需要下载安装 在数据库新建 stuInfo 表和表结构 st…

Github点赞接近 100k 的Spring Boot学习教程+实战项目推荐

很明显的一个现象&#xff0c;除了一些老项目&#xff0c;现在 Java 后端项目基本都是基于 Spring Boot 进行开发&#xff0c;毕竟它这么好用以及天然微服务友好。不夸张的说&#xff0c;Spring Boot 是 Java 后端领域最最最重要的技术之一&#xff0c;熟练掌握它对于 Java 程序…

SpringBoot-快速入门

目录 SpringBoot 概念 Spring缺点 SpringBoot 功能 快速入门案例&#xff1a;需求 案例&#xff1a;实现步骤 示例 小结 快速构建SpringBoot工程 SpringBoot 概念 SpringBoot提供了一种快速使用Spring的方式基于约定优于配置的思想&#xff0c;可以让开发人员不必在配置…