ksync
#include <linux/init.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/uaccess.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/miscdevice.h>
#include <linux/signal.h>
#include <linux/timer.h>
#include <linux/slab.h>
#define printw(fmt, ...) ({printk( KERN_ERR "[ksync] " fmt, ##__VA_ARGS__); 0; })
;
struct cdev testcdev;
struct class *myclass;
static struct fasync_struct *async;
][] = {};
int hexdump(unsigned char *name, unsigned char *data, unsigned short len)
{
unsigned char *buf;
int i, p, ret;
unsigned ] = {};
unsigned ;
tmp_len = sprintf(tmp, "%s hex(len=%d): ", name, len);
)
len = ;
buf = kmalloc( (len + ) * + tmp_len, GFP_KERNEL);
memset(buf, ) * + tmp_len);
memcpy(buf, tmp, tmp_len);
== len))
{
printw("%s\n", buf);
kfree(buf);
;
}
, p = tmp_len; i < len; i++)
{
ret = sprintf((buf + p), "%02x ", *(data + i));
p = p + ret;
}
printw("%s\n", buf);
kfree(buf);
;
}
void ksync_send(unsigned short cmd, unsigned char *buffer, short len)
{
unsigned ] = {};
sprintf(string, "%s(0x%x, %d)", __func__, cmd, len);
memcpy(fsync_buffer[] + , ();
memcpy(fsync_buffer[] + , ();
memcpy(fsync_buffer[] + , buffer, len);
hexdump(], len+);
kill_fasync(&async, SIGIO, POLL_IN);
}
void ksync_recv(unsigned short cmd, unsigned char *buffer, short len)
{
unsigned ] = {};
sprintf(string, "%s(0x%x, %d)", __func__, cmd, len);
hexdump(string, buffer, len);
ksync_send(0x57, buffer, len);
}
int char_open(struct inode *inode, struct file *filp)
{
printw("char_open ok...\n");
;
}
static int char_fasync(int fd, struct file *filp, int mode)
{
return fasync_helper(fd, filp, mode, &async);
}
int char_release(struct inode *inode,struct file *filp)
{
printw("char close\n");
, filp, );;
}
int char_ioctl (struct inode *inode, struct file *filelp, unsigned int cmd, unsigned long args)
{
;
}
ssize_t char_write(struct file *filp, const char __user *buffer, size_t count, loff_t *offset)
{
unsigned ];
printw("%s\n", __func__);
], buffer, count))
{
return -EFAULT;
}
hexdump("char_write", buffer, count);
memcpy((], );
ksync_recv( info[], fsync_buffer[] + , info[] );
printw("char_write ok...\n");
return count;
}
ssize_t char_read(struct file *filp, char __user *buffer, size_t count, loff_t *offset)
{
int ret;
ret = copy_to_user( (unsigned ], count);
!= ret) {
printw("[%s][%d][err]\n", __func__, __LINE__);
return -EFAULT;
}
filp->f_pos += count;
hexdump(], count);
printw("char_read ok...\n");
;
}
struct file_operations fop =
{
.open = char_open,
.release = char_release,
.compat_ioctl = char_ioctl,
.write = char_write,
.read = char_read,
.fasync = char_fasync,
};
int __init a_init(void)
{
dev_t dev;
int ret;
dev = MKDEV(major,);
ret = register_chrdev_region(dev,,"char");
if(ret)
{
alloc_chrdev_region(&dev,,,"char");
major = MAJOR(dev);
}
testcdev.owner = THIS_MODULE;
cdev_init(&testcdev, &fop);
cdev_add(&testcdev, dev, );
myclass = class_create(THIS_MODULE, "char_class");
device_create(myclass,NULL,dev,NULL, "ksync");
printw("module init ok ...\n");
;
}
void __exit a_exit(void)
{
dev_t dev;
dev = MKDEV(major ,);
device_destroy(myclass, dev);
class_destroy(myclass);
cdev_del(&testcdev);
unregister_chrdev_region(dev,);
printw("module exit ok....\n");
}
module_init(a_init);
module_exit(a_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("...");
MODULE_DESCRIPTION("ksync");
MODULE_VERSION("V1.0");
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
int g_fd;
unsigned ][] = {};
int hexdump(unsigned char *name, unsigned char *data, unsigned short len)
{
unsigned char *buf;
int i, p, ret;
unsigned ] = {};
unsigned ;
tmp_len = sprintf(tmp, "%s hex(len=%d): ", name, len);
)
len = ;
buf = ) * + tmp_len);
memset(buf, ) * + tmp_len);
memcpy(buf, tmp, tmp_len);
== len))
{
printf("%s\n", buf);
free(buf);
;
}
, p = tmp_len; i < len; i++)
{
ret = sprintf((buf + p), "%02x ", *(data + i));
p = p + ret;
}
printf("%s\n", buf);
free(buf);
;
}
void ksync_recv(unsigned short cmd, unsigned char *buffer, short len)
{
}
void ksync_send(unsigned short cmd, unsigned char *buffer, short len)
{
unsigned ];
int ret;
memcpy(s_buf + , ();
memcpy(s_buf + , ();
memcpy(s_buf + , buffer, len);
hexdump();
ret = write(g_fd, s_buf, len + );
printf("write ret %d\n", ret);
}
void sig_handler(int sig)
{
int ret;
unsigned ];
unsigned ];
if(sig == SIGIO)
{
ret = read(g_fd, r_buf, );
memcpy((], r_buf + , );
memcpy((], r_buf + , );
hexdump(]+);
ksync_recv(info[], r_buf + , info[]);
}
return;
}
int main(void)
{
unsigned ];
signal(SIGIO, sig_handler);
g_fd = open("/dev/ksync", O_RDWR);
== g_fd)
{
printf("open err\n");
;
}
printf("open %d\n", g_fd);
fcntl(g_fd, F_SETOWN, getpid());
fcntl(g_fd, F_SETFL, fcntl(g_fd, F_GETFL) | FASYNC);
)
{
memset(input, );
gets(input);
fflush(stdin);
)
continue;
ksync_send(0x56, input, strlen(input) );
}
;
}
# Makefile for PEDD
EXTRA_CFLAGS += -Wframe-larger-than=
ifneq ($(CROSS_COMPILE),)
EXTRA_CFLAGS += -DARC_SDP
endif
ifeq ($(KERNELRELEASE),)
ifeq ($(CROSS_COMPILE),)
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
else
KERNELDIR ?= /workspace/bpcie/output/build/linux-arc-axs101--3.13
endif
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.symvers *.order *.out
.PHONY: modules modules_install clean
else
obj-m := ksync_drv.o
endif
ksync的更多相关文章
- 使用ksync 加速基于k8s 的应用开发
ksync 实际上实现了类似 docker docker run -v /foo:/bar 的功能,可以加速我们应用的开发&&运行 安装 mac os curl https://v ...
随机推荐
- Java并发编程:Java中的锁和线程同步机制
锁的基础知识 锁的类型 锁从宏观上分类,只分为两种:悲观锁与乐观锁. 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新 ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 1
现在,如果你已经能熟练地使用MySQL客户端软件来操作数据库中的数据,就可以开始学习如何使用PHP来显示和修改数据库中的数据了.PHP提供了标准的函数来操作数据库.在PHP 5以上的版本中可以使用My ...
- 【Oracle命令】sql语句之排序(order by)
通过对数据库数据进行降序排序来达到显示最新数据在前面的效果 -- 降序排序(最新的显示在前面) SELECT * FROM 表名 t ORDER BY t.uploadDatetime DESC; 格 ...
- mysql多表关联update
日常的开发中一般都是写的单表update语句,很少写多表关联的update. 不同于SQL Server,在MySQL中,update的多表连接更新和select的多表连接查询在使用的方法上存在一些小 ...
- 【51Nod1584】加权约数和(数论)
[51Nod1584]加权约数和(数论) 题面 51Nod 题解 要求的是\[\sum_{i=1}^n\sum_{j=1}^n max(i,j)\sigma(ij)\] 这个\(max\)太讨厌了,直 ...
- [IDA] 将连续的单个变量值修改为结构体
直接选中最上边的结构体,使用ALT+Q来进行修改.
- python基础(4):用户交互、if判断、while循环、break和continue
1. 用户交互 使⽤input()函数,可以让我们和计算机互动起来 语法: 内容 = input(提⽰信息) 这⾥可以直接获取到⽤户输入的内容 content = input("你吃了么?& ...
- list方法补充
在上一个随便我们写了list 常用的方法,该随便为一些需要补充的内容 注:本次例子为: student = ["张天赐","小明","小红" ...
- python爬虫三大解析库之XPath解析库通俗易懂详讲
目录 使用XPath解析库 @(这里写自定义目录标题) 使用XPath解析库 1.简介 XPath(全称XML Path Languang),即XML路径语言,是一种在XML文档中查找信息的语言. ...
- LinuxShell脚本——循环结构
LinuxShell脚本——循环结构 摘要:本文主要学习了Shell脚本中的循环结构. while循环 基本语法 while循环是最简单的一种循环,如果条件满足则执行循环里的语句,如果条件不满足则退出 ...