linux 内核驱动加载过程中 向文件系统中的文件进行读写操作

utils.h 文件:

#ifndef __UTILS_H__
#define __UTILS_H__

void a2f(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 0;
    mm_segment_t oldfs;
    int err = 0;

    oldfs = get_fs();
    set_fs(get_ds());
    fp = filp_open(FILE_PATH, O_CREAT|O_RDWR|O_APPEND, 0); // 以追加方式写入文件
    set_fs(oldfs);
    if (IS_ERR(fp)) {
        err = PTR_ERR(fp);
        return 1;
    }

    return 0;
}

static void close_it() {
    if (!fp) return;
    filp_close(fp, 0);
    fp = 0;
}

static int read_it(unsigned long long offset, unsigned char *data, unsigned int size) {
    if (!fp) return 0;
    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 0;
    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 0;
    vfs_fsync(fp, 0);
    return 0;
}

void a2f(char *s) {
    if (open_it()) return;

    int len = strlen(s);
    write_it(0, s, len);
    write_it(0, "\r\n", 2);
    sync_it();

    // close_it();
}
时间: 2024-10-10 09:50:22

linux 内核驱动加载过程中 向文件系统中的文件进行读写操作的相关文章

linux内核被加载的过程

二,linux内核被加载的过程 一,linux安装时遇到的概念解析 内核必须模块vmlinz(5M左右)不认识硬盘,原本是需要写跟loader中一样的内容,来加载非必要模块. 内核非必要的功能被编译为模块放在了/lib/modules(143M)中. 现采取的措施是 在loader加载kernel的同时 也加载initial RAM Disk ==initrd 到内存中. initrd在一般命名为/boot/initrd(14M) 其作用是挂载内存的虚拟文件系统, kernel根据该虚拟文件系统

Linux内核驱动学习(二)----根文件系统的构成 (root filesystem)

1.建立根文件系统目录和文件 1.1创建目录 1.2创建设备文件(命令mknod):必须创建设备文件---consle\null 1.3创建配置文件---复制已有的/etc目录下的文件 1.4添加内核模块 进入Linux内核目录下,(注意,应该先编译内核,即命令make uImage ARCH=arm  CROSS_COMPILE=arm-linux-) 1.4.1.编译内核模块---命令 make modules ARCH=arm CROSS_COMPILE=arm-linux- 1.4.2.

Linux基础: 系统加载过程和运行级别含义

BIOS 有固化代码指向mbr,mbr指向grub(/boot/grub/下有很多引导配置信息),grub里可以配置多种linux内核vmlinux文件. 启动内核以后就开始加载各种驱动模块并进行系统初始化.系统初始化主要读取/etc/inittab(指定默认运行级别)和/etc/init/下各种配 置文件(指定默认启动服务,终端数目,快捷键……) ,运行完这些系统就启动完毕. 系统运行级别 0-关机 1-单用户 2-不带网络模式的多用户 3-多用户 4-不用 5-图形界面 6-重新启动 在命令

多功能PCIE交换机之八:窗口扩展和驱动加载的常见问题

结合本人在PCIE NTB/DMA最近的实际工作,总结了地址转换窗口扩展和驱动加载过程中碰到的主要问题和解决办法. 0.系统启动后看不到NTB设备 需要检查BIOS,在PCIE设置里面NTB芯片是否使能.这是因为针对不同的应用场景和客户需要,BIOS里面通常添加了Enable/Disable NTB的选项. 1.如何扩展地址转换窗口 a.确定系统要求的地址转换窗口的范围和大小: b.确保系统要求的地址转换窗口的范围和大能够被BIOS支持 c.从可用的BAR2/3和BAR4/5中选择未使用的或者可

Unix/Linux环境C编程入门教程(12) openSUSECCPP以及Linux内核驱动开发环境搭建

1. openSUSE是一款优秀的linux. 2.选择默认虚拟机 3.选择稍后安装操作系统 4.选择linux  opensuse 5. 选择默认虚拟机名称 6.设置处理器为双核. 7.内存设置为2G 8. 选择网络地址转换 9.设置IO控制器 10. 选择默认磁盘类型 11.创建一个新的虚拟磁盘 12.设置磁盘大小 13.选择路径保存虚拟磁盘 14. 完成虚拟机创建 15.设置虚拟机 16.选择opensuse镜像 17.开启虚拟机 18.虚拟机启动 19.安装opensuse 20.安装程

重温.NET下Assembly的加载过程

原文:重温.NET下Assembly的加载过程 最近在工作中牵涉到了.NET下的一个古老的问题:Assembly的加载过程.虽然网上有很多文章介绍这部分内容,很多文章也是很久以前就已经出现了,但阅读之后发现,并没能解决我的问题,有些点写的不是特别详细,让人看完之后感觉还是云里雾里.最后,我决定重新复习一下这个经典而古老的问题,并将所得总结于此,然后会有一个实例对这个问题进行演示,希望能够帮助到大家. .NET下Assembly的加载过程 .NET下Assembly的加载,最主要的一步就是确定As

Linux内核启动及文件系统加载过程

上接博文<u-boot之u-boot-2009.11启动过程分析> 当u-boot开始执行bootcmd命令,就进入Linux内核启动阶段,与u-boot类似,普通Linux内核的启动过程也可以分为两个阶段,但针对压缩了的内核如uImage就要包括内核自解压过程了.本文以项目中使用的linux-2.6.37版源码为例分三个阶段来描述内核启动全过程.第一阶段为内核自解压过程,第二阶段主要工作是设置ARM处理器工作模式.使能MMU.设置一级页表等,而第三阶段则主要为C代码,包括内核初始化的全部工作

简单的Linux 驱动模块编译,加载过程

简单的Linux 驱动模块编译,加载过程 2010-03-14 14:48:24|  分类: Driver |  标签: |字号大中小 订阅 本文记录我的第一个Linux设备驱动程序的编译过程.遇到问题的解决方法. 环境:2.4.18-14的内核,Linux内核源码:2.4.18.       Linux内核源码路径:/usr/src/linux(这个源码是从kernel.org网站download的2.4.18版本)        按照<linux设备驱动开发详解>一书中的步骤实现经典例子&

ELF文件的加载过程(load_elf_binary函数详解)--Linux进程的管理与调度(十三)

日期 内核版本 架构 作者 GitHub CSDN 2016-06-04 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度-之-进程的描述 加载和动态链接 从编译/链接和运行的角度看,应用程序和库程序的连接有两种方式. 一种是固定的.静态的连接,就是把需要用到的库函数的目标代码(二进制)代码从程序库中抽取出来,链接进应用软件的目标映像中: 另一种是动态链接,是指库函数的代码并不进入应用软件的目标映像,应用软件在编译/链接阶段并