inux字符驱动之read、write部分

2023-11-16

本期主题:
linux字符驱动之read、write部分


往期链接:


linux字符驱动之read、write部分


1.copy_to_user / copy_from_user

由于用户空间并不能直接访问内核空间,所以内核提供了以下两个接口来操作:
copy_from_user():完成从用户空间缓存区到内核空间的复制
copy_to_user():完成从内核空间到用户空间缓存区的复制

函数源码:

static inline int copy_from_user(void *to, const void __user volatile *from,
				 unsigned long n)
{
	__chk_user_ptr(from, n);
	volatile_memcpy(to, from, n);
	return 0;
}

static inline int copy_to_user(void __user volatile *to, const void *from,
			       unsigned long n)
{
	__chk_user_ptr(to, n);
	volatile_memcpy(to, from, n);
	return 0;
}

2.测试代码

写一个驱动测试模块,驱动中写write和read接口,在测试的时候,使用echo/cat来测试从用户空间到内核空间的读写

示例代码:


#include <linux/init.h>
#include <linux/module.h>
#include <linux/kdev_t.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/uaccess.h>
#include <linux/slab.h>


MODULE_LICENSE("GPL");
MODULE_AUTHOR("PD");


#define HELLO_TEST_BUFF_SIZE	0x10
//static char hello_test_buf[HELLO_TEST_BUFF_SIZE];
struct hello_dev
{
	char hello_dev_buf[HELLO_TEST_BUFF_SIZE];
};

struct hello_dev *hello_dev_p;

static int hello_open (struct inode *inode, struct file *filep)
{
	filep->private_data = hello_dev_p; //作为驱动的private数据
	printk("hello_open()\n");
	return 0;
}

//param:
//file: 文件结构体指针
//buf: 用户空间内存的地址
//count: 要读的字节数
//ppos: 读的位置相对于文件开头的偏移
static ssize_t hello_read(struct file *file, char __user *buf, size_t count,
			loff_t *ppos)
{
	unsigned long p = *ppos;
	int ret;
	size_t size = count;

	struct hello_dev *dev = file->private_data;

	printk("read func, p is 0x%ld\r\n", p);

	if (p > HELLO_TEST_BUFF_SIZE)
	{
		return 0;
	}
	if (size > HELLO_TEST_BUFF_SIZE - p)
	{
		size = HELLO_TEST_BUFF_SIZE - p;
	}

	if (copy_to_user(buf, dev->hello_dev_buf + p, size))
	{
		ret = -EFAULT;
		printk("read failed\r\n");
	}
	else
	{
		*ppos += count;
		ret = count;

		printk("read %u bytes from kernel\r\n", size);
	}
	return ret;
}

static ssize_t hello_write(struct file *file, const char __user *buf, size_t count,
			loff_t *ppos)
{
	unsigned long p = *ppos;
	int ret;
	struct hello_dev *dev = file->private_data;
	printk("write func, p is 0x%ld\r\n", p);

	if (copy_from_user(dev->hello_dev_buf + p, buf, count))
	{
		ret = -EFAULT;
		printk("write failed\r\n");
	}
	else
	{
		*ppos += count;
		ret = count;

		printk("write %u bytes to kernel\r\n", count);
	}
	return ret;
}

static struct file_operations hello_ops = 
{
	.open = hello_open,
	.read = hello_read,
	.write = hello_write,
};

static int major = 230;
static int minor = 0;
static dev_t dev_num = 0;
static struct cdev cdev;

static int hello_init(void)
{
	int result;
	int error;

	dev_num = MKDEV(major, minor);
	
	result = register_chrdev_region(dev_num, 1, "test");

	if (result < 0)
	{
		printk("register_chrdev_region fail \n");
		return result;
	}
	printk("hello_init, register_chrdev_region OK \n");

	cdev_init(&cdev,&hello_ops);
	error = cdev_add(&cdev,dev_num,1);
	//添加hello_dev_p的kzalloc
	hello_dev_p = kzalloc(sizeof(struct hello_dev), GFP_KERNEL);
	if (!hello_dev_p)
	{
		result = -ENOMEM;
		printk("kzalloc fail \n");
		return result;
	}

	if(error < 0)
	{
		printk("cdev_add fail \n");
		unregister_chrdev_region(dev_num,1);
		return error;
	}
	return 0;
}


static void hello_exit(void)
{
	printk("hello_exit \n");
	cdev_del(&cdev);
	unregister_chrdev_region(dev_num, 1);
	return;
}

module_init(hello_init); //insmod
module_exit(hello_exit);//rmmod

测试结果:
在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

inux字符驱动之read、write部分 的相关文章

  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • Tomcat Intellij Idea:远程部署

    RackSpace 云服务器 Ubuntu 12 04 Intellij Idea 11 1 2 Windows 8 Tomcat 7 0 26 JDK 6 在 Intellij Idea 上 当我尝试在远程 Tomcat 7 服务器上运行
  • vmsplice() 和 TCP

    在原来的vmsplice 执行 有人建议 http lwn net Articles 181169 如果您的用户态缓冲区是管道中可容纳的最大页面数的 2 倍 则缓冲区后半部分成功的 vmsplice 将保证内核使用缓冲区的前半部分完成 但事
  • ioctl 命令的用户权限检查

    我正在实现 char 驱动程序 Linux 并且我的驱动程序中有某些 IOCTL 命令仅需要由 ADMIN 执行 我的问题是如何在 ioctl 命令实现下检查用户权限并限制非特权用户访问 IOCTL 您可以使用bool capable in
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String
  • docker 非 root 绑定安装权限,WITH --userns-remap

    all 尝试让绑定安装权限正常工作 我的目标是在容器中绑定安装卷 以便 a 容器不以 root 用户身份运行入口点 二 docker daemon 配置了 userns remap 这样容器 主机上没有 root c 我可以绑定挂载和读 写
  • 如何为 Linux 桌面条目文件指定带有相对路径的图标?

    对于我的一个 Linux 应用程序 我有应用程序二进制文件 一个 launcher sh 脚本 针对 LD LIBRARY PATH 和一个 desktop 文件 所有这些都位于同一文件夹中 我想使用图标的相对路径而不是绝对路径 我试过了
  • 我们真的应该使用 Chef 来管理 sudoers 文件吗?

    这是我的问题 我担心如果 Chef 破坏了 sudoers 文件中的某些内容 可能是 Chef 用户错误地使用了说明书 那么服务器将完全无法访问 我讨厌我们完全失去客户的生产服务器 因为我们弄乱了 sudoers 文件并且无法再通过 ssh
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • tcpdump 是否受 iptables 过滤影响?

    如果我的开发机器有iptables规则到FORWARD一些数据包 这些数据包是否被 tcpdump 捕获 我有这个问题 因为我知道存在其他链称为INPUT如果数据包路由到 它会过滤发往应用程序的数据包FORWARD链 它会到达吗tcpdum
  • 如何在 Ubuntu 中创建公共 HTML 文件夹?

    简单的问题 但由于某种原因我无法在谷歌上找到确切的答案 我在 Slicehost 上安装了全新的 Ubuntu 并且想在我的主目录中为包含一堆静态 HTML 文件的简单网站创建一个公共目录 我该怎么做呢 只是打字的问题吗mkdir publ
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • 在 Mono 上运行 .Net MVC5 应用程序

    我正在 Windows 上的 Visual Studio 2013 中开发 Net 4 5 1 MVC5 应用程序 现在我想知道 是否可以在Linux Ubuntu 12 04 上运行这个应用程序 可以使用OWIN吗 Owin 可以自托管运
  • Apache 访问 Linux 中的 NTFS 链接文件夹

    在 Debian jessie 中使用 Apache2 PHP 当我想在 Apache 的文档文件夹 var www 中创建一个新的小节时 我只需创建一个指向我的 php 文件所在的外部文件夹的链接 然后只需更改该文件夹的所有者和权限文件夹
  • 这种文件锁定方法可以接受吗?

    我们有 10 个 Linux 机器 每周必须运行 100 个不同的任务 这些计算机主要在我们晚上在家时执行这些任务 我的一位同事正在开发一个项目 通过使用 Python 自动启动任务来优化运行时间 他的程序将读取任务列表 抓取一个打开的任务
  • 检查已安装的软件包,如果没有找到则安装

    我需要检查已安装的软件包 如果未安装则安装它们 RHEL CentOS Fedora 示例 rpm qa grep glibc static glibc static 2 12 1 80 el6 3 5 i686 如何在 BASH 中进行检
  • x86-64 AMD 上 CALL 指令的操作数生成

    以下是示例程序 objdump 的输出 080483b4
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser

随机推荐

  • http深入

    首部字段 包含请求和响应的各种条件和属性的各类首部 一般有4种首部 分别是 通用首部 请求首部 响应首部和实体首部 一 http通用首部 1 1 Cache Control字段 1 1 1 表示是否能缓存的指令 public Cache C
  • 小米iot业务_小米,大时代下的潜行者

    11月27日 小米发布了2019年第三季度的财务业绩 报告期内 小米收入达到537亿人民币 同比增长5 5 这是小米单季度的营收新高 相比收入 盈利能力的提高是小米财报最大的亮点 2019年第三季度 经调整后净利润为35亿元 同比增长20
  • Python代码制作2020“恐龙跳一跳“小游戏

    开发工具 Python版本 3 6 4 相关模块 pygame模块 以及一些Python自带的模块 相关文件 欢迎与我交流 环境搭建 安装Python并添加到环境变量 pip安装需要的相关模块即可 原理介绍 游戏规则简介 玩家通过空格键控制
  • springcloud入门基础搭建之hystrix

    目录 1 工程目录 2 单独使用hystrix 2 1引入依赖 2 2主启动添加 EnableHystrix 2 3在需要进行错误降级的方法上添加 HystrixCommand 2 4测试 3 整合feign和hystrix 3 1依赖 3
  • 如何搭建测试平台体系

    一个健康的测试平台体系 对测试人员的职责分工 协作模式会有不同的要求 测试平台核心的职责是完成高质量的交付已满足业务需求 测试活动包括单元测试 集成测试 接口测试 性能测试等 都是通过这些测试手段 协同整个测试平台来完成高质量交付的管理工作
  • Token的详细说明,看这一篇就够了

    文章目录 1 基于Token 的身份验证方法 2 JWT 2 1 Header 2 2 Payload 2 3 signatrue 3 Web安全 对于 Token 在很多大型网站中都有所应用 比如 Facebook Twitter Goo
  • C#编码规范-使用StyleCop进行代码格式检查

    前言 但是在项目开发的过程中 如果只是验证命名规则 而没有统一程序排版 不同开发人员将产出不同的文件格式 这样的产出 虽然能够正常地提供项目功能 但缺会大幅降低了这份程序代码的可维护性与可读性 本篇文章介绍如何通过StyleCop这个工具
  • C++模板库STL——vector容器(下)

    上篇介绍了vector的基本使用 本贴将介绍一些常用的函数与方法 帮助各位更加灵活的使用vector容器 include
  • 2021-12-21 《聪明的投资者》学习笔记-17.四个非常有启发的案例--失败案例

    摘自 聪明的投资者 The Intelligent Investor 第4版 本杰明 格雷厄姆 第17章 四个非常有启发的案例 失败案例 宾州中央铁路公司的案例 利润不合理 财务实力欠佳 Ling Temco Vought公司 举债扩张 粗
  • 网络知识点------SBC和BSC的定义

    数通知识点学习 2021 7 1 2021 12 31号我就职于浙江大华技术股份有限公司 担任嵌入式软件工程师 2022 1 4我入职中兴通讯 担任数通工程师 从物联网行业跨到通讯行业 有遗憾 有悲伤 也有快乐 希望以后还能继续通过博客记录
  • Qt 查看Qt助手的方法

    为了方便大家自学 在这里提供一种查看Qt助手的方法 1 打开软件点击帮助 在这里可以搜索关键词 2 假设搜索的是QToolBar 3 搜索的全是英文 这时可以点击 4 此时会跳到网页版Qt助手 5 使用的是 Microsoft Edge 浏
  • centos 安装java11

    直接执行 yum list grep java 11 输出结果如下 java 11 openjdk i686 1 11 0 16 0 8 1 el7 9 updates java 11 openjdk x86 64 1 11 0 16 0
  • JavaWeb——JavaWeb核心之Servlet

    一 Servlet简介 1 什么是Servlet Servlet 运行在服务端的Java小程序 是sun公司提供一套规范 接口 用来处理客户端请求 响应给浏览器的动态资源 但servlet的实质就是java代码 通过java的API 动态的
  • Python3-定时任务的四种实现方式

    最近做一个小程序开发任务 主要负责后台部分开发 根据项目需求 需要实现三个定时任务 定时更新微信token 需要2小时更新一次 商品定时上线 定时检测后台服务是否存活 使用Python去实现这三个任务 这里需要使用定时相关知识点 Pytho
  • 如何回答「你的优势和劣势是什么」?【面试核心问题6】

    导读 优势和劣势也是面试中的常问问题 求职者应该有所准备 准备好自己的3个优势和3个劣势 对于优势来说 最好是结合职位要求 或是产品经理的基本能力 谈一些自己具备的和职位相关的优势 并且能拿出证据 经历来证明它 举例 具备良好的沟通能力和组
  • 手机应用软件卸载【adb】

    解决了想卸载 厂商又不让卸载 例 miui广告 卸载小爱等 adb 工具 点击下载 官方下载 安全 附自己的卸载包 adb exe shell pm uninstall user 0 com miui systemAdSolution ad
  • 双系统 Ubuntu grub启动项中 没有Windows的解决

    目标 从ubuntu的grub进入win10系统 实施 以下操作在Ubuntu系统中进行 终端依次执行下面命令 sudo grub install dev sda sudo chmod x etc grub d 30 os prober s
  • 导致项目失败常见的原因有哪些

    一 规划工作做得不细 或缺少灵活性 项目计划始终是项目开始前的热点讨论话题 但是在实际项目进行中仍会出现问题 因此在做好计划之后 在项目实施中项目经理还需要根据项目实际情况做适当的调整 项目经理可以通过进度猫甘特图制作项目计划 调整增加项目
  • 另类的唯品会和得物比价

    目前得物h5和小程序防爬弄得采集数据很费劲 另辟蹊径做了一款通过模拟器和商家后台方式采集数据的方式 目前实现了跟唯品会的比价 运行界面如下 输入品牌名称 点击 开始 表格中左边依次显示唯品会采集的数据 右边会根据采集模式的不同 从安卓模拟器
  • inux字符驱动之read、write部分

    本期主题 linux字符驱动之read write部分 往期链接 linux设备驱动中的并发 linux设备驱动中的编译乱序和执行乱序 linux设备驱动之内核模块 linux字符驱动 linux字符驱动之ioctl部分 linux字符驱动