如何在内核中读取用户空间数据

在内核中只能通过sysfs文件方式读写用户空间,可以利用pro_info地址分配表读写,如下:


#include <linux/syscalls.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <linux/mm.h>

#define TRACE_REGION "/dev/pro_info"
#define TRACE_REGION_SZ (0x200)//(0x400)                 
#define TRACE_ID_OFFSET (0x100)//(0x300)


{

    int fd;
    char bf, Buff[TRACE_REGION_SZ];
    long len, offset;

    memset(Buff, 0x00, sizeof(Buff));                                                                                                                     
    mm_segment_t oldfs = get_fs();
    set_fs(get_ds());
    fd = sys_open(TRACE_REGION, O_RDWR, 0);

    if(fd >= 0) {
        offset = sys_lseek(fd, 0x200000, 0);
        len = sys_read(fd, Buff, TRACE_REGION_SZ);
        bf = Buff[TRACE_ID_OFFSET] & 0xFF; /*go encrypted?*/
        printk("[shen--read] len = %x, bf = %d offset=%x\n",len,bf,offset);

        offset = sys_lseek(fd, 0x200000, 0);
        if(Buff[TRACE_ID_OFFSET] == 0x02){
            Buff[TRACE_ID_OFFSET] = 0x10;
            sys_write(fd,Buff,TRACE_REGION_SZ);
        }else if (Buff[TRACE_ID_OFFSET] == 0x10){
            Buff[TRACE_ID_OFFSET] = 0x02;
            sys_write(fd,Buff,TRACE_REGION_SZ);
        }else {
            Buff[TRACE_ID_OFFSET] = 0x02;
            sys_write(fd,Buff,TRACE_REGION_SZ);
        }

        memset(Buff, 0x00, sizeof(Buff));
        offset = sys_lseek(fd, 0x200000, 0);
        len = sys_read(fd, Buff, TRACE_REGION_SZ);
        bf = Buff[TRACE_ID_OFFSET] & 0xFF; /*go encrypted?*/
        printk("[shen--read]2 len = %x, bf = %d offset=%x\n",len,bf,offset);

        sys_close(fd);
    }else
    {    
        printk("[melfas_suspend] fd < 0");
    }    

    set_fs(oldfs);


}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值