Linux的高效的数据传输技术-Relay
《Linux的高效的数据传输技术-Relay》摘要: 面向内核空间的 API 这些API接口向位于内核空间的用户提供了治理relay通道、数据写入等功能。下面介绍其中主要的部分,完整的API接口列表请参见这里。 ●relay_open() - 创建一个relay通道,包…
面向内核空间的 API
这些API接口向位于内核空间的用户提供了治理relay通道、数据写入等功能。下面介绍其中主要的部分,完整的API接口列表请参见这里。
●relay_open() - 创建一个relay通道,包括创建每个CPU对应的relay缓冲区。
●relay_close() - 关闭一个relay通道,包括释放所有的relay缓冲区,在此之前会调用relay_switch()来处理这些relay缓冲区以保证已读取但是未满的数据不会丢失
●relay_write() - 将数据写入到当前CPU对应的relay缓冲区内。由于它使用了local_irqsave()保护,因此也可以在中断上下文中使用。
●relay_reserve() - 在relay通道中保留一块连续的区域来留给未来的写入操作。这通常用于那些希望直接写入到relay缓冲区的用户。考虑到性能或者其它因素,这些用户不希望先把数据写到一个临时缓冲区中,然后再通过relay_write()进行写入。
Relay的例子
我们用一个最简单的例子来介绍怎么使用Relay。这个例子由两部分组成:一部分是位于内核空间将数据写入relay文件的程序,使用时需要作为一个内核模块被加载;另一部分是位于用户空间从relay文件中读取数据的程序,使用时作为普通用户态程序运行。
内核空间的程序主要操作是:
加载模块时,打开一个relay通道,并且往打开的relay通道中写入消息;
卸载模块时,关闭relay通道。
程序内容:
/* * hello-mod.c * a kernel-space client example of relayfs filesystem */ #include <linux/module.h> #include <linux/relayfs_fs.h> static struct rchan *hello_rchan; int init_module(void) { const char *msg="Hello world"; hello_rchan = relay_open("cpu", NULL, 8192, 2, NULL); if(!hello_rchan){ printk("relay_open() failed."); return -ENOMEM; } relay_write(hello_rchan, msg, strlen(msg)); return 0; } void cleanup_module(void) { if(hello_rchan) { relay_close(hello_rchan); hello_rchan = NULL; } return; } MODULE_LICENSE ("GPL"); MODULE_DESCRIPTION ("Simple example of Relay");
