在内核中只能通过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);
}