linux 内核驱动加载过程中 向文件系统中的文件进行读写操作
utils.h 文件:
#ifndef __UTILS_H__
#define __UTILS_H__ void a2f(const char *s, ...); #endif
utils.c 文件:
#include <linux/fs.h>
#include <asm/segment.h>
#include <asm/uaccess.h>
#include <linux/buffer_head.h>
#include <linux/string.h> #include "utils.h" #define FILE_PATH "/hzh" static struct file *fp; static int open_it() {
if (fp) return ;
mm_segment_t oldfs;
int err = ; oldfs = get_fs();
set_fs(get_ds());
fp = filp_open(FILE_PATH, O_CREAT|O_RDWR|O_APPEND, ); // 以追加方式写入文件
set_fs(oldfs);
if (IS_ERR(fp)) {
err = PTR_ERR(fp);
return ;
} return ;
} static void close_it() {
if (!fp) return;
filp_close(fp, );
fp = ;
} static int read_it(unsigned long long offset, unsigned char *data, unsigned int size) {
if (!fp) return ;
mm_segment_t oldfs;
int ret; oldfs = get_fs();
set_fs(get_ds()); ret = vfs_read(fp, data, size, &offset); set_fs(oldfs);
return ret;
} static int write_it(unsigned long long offset, unsigned char *data, unsigned int size) {
if (!fp) return ;
mm_segment_t oldfs;
int ret; oldfs = get_fs();
set_fs(get_ds()); ret = vfs_write(fp, data, size, &offset); set_fs(oldfs);
return ret;
} static int sync_it() {
if (!fp) return ;
vfs_fsync(fp, );
return ;
} void a2f(const char *fmt, ...) {
if (open_it()) return; char print_buf[];
va_list args;
int printed;
//初始化args,使其指向可变参数的第一个参数,fmt是可变参数的前一个参数
va_start(args, fmt);
printed = vsprintf(print_buf, fmt, args);
va_end(args); write_it(, print_buf, printed);
sync_it(); // close_it();
}
linux 内核驱动加载过程中 向文件系统中的文件进行读写操作的更多相关文章
- linux内核被加载的过程
二,linux内核被加载的过程 一,linux安装时遇到的概念解析 内核必须模块vmlinz(5M左右)不认识硬盘,原本是需要写跟loader中一样的内容,来加载非必要模块. 内核非必要的功能被编译为 ...
- 动态符号链接的细节 与 linux程序的加载过程
转: http://hi.baidu.com/clivestudio/item/4341015363058d3d32e0a952 值得玩味的一篇分析程序链接.装载.动态链接细节的好文档 导读: by ...
- linux 设备驱动加载的先后顺序
Linux驱动先注册总线,总线上可以先挂device,也可以先挂driver,那么究竟怎么控制先后的顺序呢. 1.初始化宏 Linux系统使用两种方式去加载系统中的模块:动态和静态. 静态加载:将所有 ...
- [driver]linux内核动态加载模块
问题: 1. 把编译好的模块放到板子/lib/modules对应文件夹下,并且执行了depmod -a, 比如pl2303.ko, 那么下一次插入pl2303的串口线,是否可以识别,也就是自动加载pl ...
- Linux基础: 系统加载过程和运行级别含义
BIOS 有固化代码指向mbr,mbr指向grub(/boot/grub/下有很多引导配置信息),grub里可以配置多种linux内核vmlinux文件. 启动内核以后就开始加载各种驱动模块并进行系统 ...
- Linux内核模块驱动加载与dmesg调试
因为近期用到了Linux内核的相关知识,下面随笔将给出内核模块的编写记录,供大家参考. 1.运行环境 Ubuntu 版本:20.04 Linux内核版本:5.4.0-42-generic gcc版本: ...
- Unix/Linux环境C编程入门教程(12) openSUSECCPP以及Linux内核驱动开发环境搭建
1. openSUSE是一款优秀的linux. 2.选择默认虚拟机 3.选择稍后安装操作系统 4.选择linux opensuse 5. 选择默认虚拟机名称 6.设置处理器为双核. 7.内存设置为2 ...
- 重温.NET下Assembly的加载过程 ASP.NET Core Web API下事件驱动型架构的实现(三):基于RabbitMQ的事件总线
重温.NET下Assembly的加载过程 最近在工作中牵涉到了.NET下的一个古老的问题:Assembly的加载过程.虽然网上有很多文章介绍这部分内容,很多文章也是很久以前就已经出现了,但阅读之后 ...
- NET下Assembly的加载过程
NET下Assembly的加载过程 最近在工作中牵涉到了.NET下的一个古老的问题:Assembly的加载过程.虽然网上有很多文章介绍这部分内容,很多文章也是很久以前就已经出现了,但阅读之后发现,并没 ...
随机推荐
- iBATIS缓存cacheModel属性浅析
iBATIS缓存cacheModel属性的应用使得在Mapped Statement中缓存常用的数据,那么本文将会给你介绍iBATIS缓存cacheModel属性的信息. AD:2013云计算架构师峰 ...
- Object-C内存管理基础
如果你通过手工alloc的方式分配内存实例化创建一个对象,之后你需要release这个对象,同理你也不能手工释放(release)一个能自动释放(autoreleased)的对象,因为这个样子会使你的 ...
- C与C++的区别
C++与C的区别 1. 动态分配内存 1)C语言 a. malloc函数:在内存的动态存储区中分配一个长度为size的连续空间: void *malloc(unsigned int siz ...
- php5.4安装ecshopphp5.4问题及解决
includes/cls_template.php line422 将 $tag_sel = array_shift(explode(" ", $tag)); 这句话拆开为两句. $tag_exp = ...
- javascript 获取 class 样式 重新赋值class样式 为div等系列标签内更改内容
name = document.getElementById(project_not_through_id).className; // 获取目标id的 cla ...
- 移动端Web开发如何处理横竖屏
<!Doctype html> <html> <head> <meta charset="utf-8"> <meta id=& ...
- linux安装python使用的MySQLdb
安装mysqldb模块需已安装mysql 使用pip安装MySQLdb pip install mysql-python mac os安装mysqldb sudo pip install mysql- ...
- Django设置TIME_ZONE和LANGUAGE_CODE为中国区域
Django默认的timezone是 TIME_ZONE = 'America/Chicago' LANGUAGE_CODE = 'en-us' 设置为中国区域: TIME_ZONE = 'Asia/ ...
- SpringSecurity数据库中存储用户、角色、资源
这几天项目中用到了SpringSecurity做登陆安全.所以在这写一下也许可以帮助一下其他人,自己也熟悉一下 SpringSecurity配置文件如下: <beans:beans xmlns= ...
- 从零开始学习MySQL1---MySQL基础
数据库基础 数据库是一个长期存储在计算机内的.有组织的.有共享的.统一管理的.数据集合.它是一个按数据结构来存储和管理数据的计算机软件系统.数据库包含两层含义:保管数据的仓库,以及数据管理的方法和技术 ...