ZYNQ防火墙开发4-配置管理

什么是进程间通信

​ 嵌入式实际开发最终用到的核心技术也都是经典教科书上的知识,很少有本质的改变。所以打好基础才是真正的内功心法。这么多的通信机制既然都还有保留,那必定有他应用的场景。本课程尽量把原理讲清,使大家能自己独立实现。

​ 基于以上每个进程拥有独立的地址空间和资源,所以为了实现数据交换和协作,需要使用IPC机制。

IPC类型

​ IPC是进程间通信(interprocess communication)的简称。

基于通信内容分类:

 1. 数据交换 :  传递数据。
 2. 共享资源 :  共享内存、文件、设备等。
 3. 进程同步 :  同步操作。
 4. 消息传递 :  通信和协作。

Screenshot_20240330_215908

​ 对于实战课程的简洁,并没有对每个技术细节展开和深入讲解。在我们利用每个技术点的过程当中可以深入学习。

sunrpc介绍

​ 是一个非常轻量级 RPC 系统,可用在大多数POSIX和类 POSIX 操作系统中使用,包括 Linux、SunOS、OS X 和各种发布版本的 BSD

rpcgen工具简介

​ rpcgen可以自动生成RPC服务器程序的大多数代码,它的输入为一个规格说明文件,它的输出为一个C语言的源程序。规格文件(*.x)包含常量、全局数据类型以及远程过程的声明。Rpcgen产生的代码包含了实现客户机和服务器程序所需要的大部分源代码。他包括参数整理、发送RPC报文、参数和结果的外部数据表示以及本地数据表示的转换等。不过在由rpcgen生成的源文件中,没有过程的具体实现,所以程序员必须要手工编辑这些文件,实现这些过程。

​ 自动生成的rpc文件

​ 文件名 作用 Makefile.file 该文件用于编译所有客户机,服务器代码 File_clnt.c 该文件包含client_stub,程序员一般不用修改 File_svc.c 该文件包含server_stub,程序员一般不用修改 File.h 该文件包含了从说明中产生的所有XDR类型 File_xdr.c 该文件包含了客户机和服务器stub所需的XDR过滤器,程序员一般不用修改 File_server.c 如果生成此文件,则该文件包含远程服务的stub File_client.c 如果生成此文件,则该文件包含了骨架客户机程序。

文件名 作用
Makefile.file 该文件用于编译所有客户机,服务器代码
File_clnt.c 该文件包含client_stub,程序员一般不用修改
File_svc.c 该文件包含server_stub,程序员一般不用修改
File.h 该文件包含了从说明中产生的所有XDR类型
File_xdr.c 该文件包含了客户机和服务器stub所需的XDR过滤器,程序员一般不用修改
File_server.c 如果生成此文件,则该文件包含远程服务的stub
File_client.c 如果生成此文件,则该文件包含了骨架客户机程序。

rpcgen的命令行选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
dnsnat@dnsnat:~/EBAZ4205/gateway_zynq/test$ rpcgen --help
usage: rpcgen infile
rpcgen [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile
rpcgen [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile]
rpcgen [-s nettype]* [-o outfile] [infile]
rpcgen [-n netid]* [-o outfile] [infile]
options:
-a generate all files, including samples
-b backward compatibility mode (generates code for SunOS 4.1)
-c generate XDR routines
-C ANSI C mode
-Dname[=value] define a symbol (same as #define)
-h generate header file
-i size size at which to start generating inline code
-I generate code for inetd support in server (for SunOS 4.1)
-K seconds server exits after K seconds of inactivity
-l generate client side stubs
-L server errors will be printed to syslog
-m generate server side stubs
-M generate MT-safe code
-n netid generate server code that supports named netid
-N supports multiple arguments and call-by-value
-o outfile name of the output file
-s nettype generate server code that supports named nettype
-Sc generate sample client code that uses remote procedures
-Ss generate sample server code that defines remote procedures
-Sm generate makefile template
-t generate RPC dispatch table
-T generate code to support RPC dispatch tables
-Y path directory name to find C preprocessor (cpp)
-5 SysVr4 compatibility mode
--help give this help list
--version print program version

For bug reporting instructions, please see:
<https://bugs.launchpad.net/ubuntu/+source/glibc/+bugs>.

部分选项的解释:

-a 生成所有源程序,包括客户机和服务器源程序。
-C 使用ANSI C标准生成编码。
-c 生成xdr转码C程序。(file_xdr.c)。
-l 生成客户机stubs。(file_clnt.c)
-m 生成服务器stubs,但是不生成main函数。(file_svc.c)
-s rpcgen –C –s tcp file.x,生成服务器stubs,用tcp协议,同时生成了main函数。(file_svc.c)
-h 生成头文件。
-Sc 生成骨架客户机程序,(file_client.c),生成后还需要手动添加代码。
-Ss 生成服务器程序,(file_server.c),生成后还需要手动添加代码。

rpcgen –C file.x 生成file_xdr.c,file.h,Makefile.file,file_svc.c和file_client.c
rpcgen –C –a file.x 比上面多生成了2个文件,file_server.c和file_client.c

rpcgen示例程序

创建规格文件(test.x)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/* filename: test.x */

const ADD = 0;
const SUB = 1;
const MUL = 2;
const DIV = 3;

struct TEST
{
int op; /* 0-ADD, 1-SUB, 2-MUL, 3-DIV */
float arg1;
float arg2;
float result;
};

program TEST_PROG
{
version TEST_VER
{
struct TEST TEST_PROC(struct TEST) = 1;
} = 2;
} = 0x20000001;

//Portmap从3,4版本开始叫做 rpcbind

sudo apt install rpcbind

1
2
3
4
5
6
7
8
9
10
dnsnat@dnsnat:~/EBAZ4205$ rpcinfo -p
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
536870913 2 udp 57340
536870913 2 tcp 43135

service portmap restart(fedora 10以上为service rpcbind restart)

查看glibc版本

1
2
3
4
5
6
dnsnat@dnsnat-Standard-PC-i440FX-PIIX-1996:~$ ldd --version
ldd (Ubuntu GLIBC 2.23-0ubuntu11.3) 2.23
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.

下载相应的glibc版本查看sunrpc实现原理

1
wget https://ftp.gnu.org/gnu/glibc/glibc-2.3.2.tar.bz2

rpcbind工具简介

​ 在Linux中,rpcbind服务是用于为远程过程调用(RPC)提供端口映射和绑定的服务。它允许客户端应用程序通过网络调用服务器上运行的远程程序或服务。

具体来说,首先服务器端启动RPC服务,并开启服务端口和启动服务,并向RPC注册端口信息。当客户端应用程序需要调用远程程序时,它会向rpcbind服务发送请求,确定远程程序的端口号和地址。rpcbind服务会在运行的RPC程序列表中查找请求的程序,并返回其端口号和地址给客户端应用程序。客户端应用程序接收到这些信息后,可以通过TCP或UDP协议与远程程序进行通信和交换数据。

rpcbind服务在Linux系统中是一个常见的系统服务,通常与其他网络服务(如NFS,NIS等)一起使用,以实现远程系统之间的通信和数据共享。

1
git clone git://linux-nfs.org/~steved/rpcbind

入侵防御管理模块实现

​ 从授课角度来说可能录制的并不专业,但从课程的真实度来说还是有非常大的参考价值。我们真实项目是基于rpcgen和nanomsg进行改造的。但由于基本原理相同,所以我们没必要和真的一模一样进行改造。我们也讲解真实的实现,但本课程模仿时还是以标准的runrpc方式实现。

NanoMsg的优点:

  1. 轻量级:NanoMsg是一个非常轻量级的消息传递库,具有低延迟和高性能。
  2. 简单易用:它提供了简单而直观的API,容易上手并快速集成到应用程序中。
  3. 可移植性:NanoMsg支持多种操作系统平台,并且可以在不同语言环境下使用。

ZeroMQ的优点:

  1. 强大灵活:ZeroMQ提供了广泛且强大的消息传递模式和拓扑结构,支持复杂的通信场景。
  2. 多语言支持:ZeroMQ可以与许多编程语言集成,并提供各种语言绑定。
  3. 大型社区支持:由于其广泛使用和活跃的社区,ZeroMQ具有丰富的生态系统和大量的扩展。

Screenshot_20240327_100709


ZYNQ防火墙开发4-配置管理
http://witbit.cn/视频课程/FIREWALL_GATEWAY/ZYNQ防火墙开发4-配置管理.html
作者
朝彻
发布于
2025年2月13日
许可协议