用于点对点通信的Linux驱动程序类型

时间:2015-10-11 04:07:05

标签: c linux

我有两个处理器通过串行接口相互连接。一个处理器运行裸机环路,另一个处理器运行linux。为了简化接口协议,我创建了一个类似以太网的帧,用于创建不同的消息类型。有些消息很小,少于200字节,而其他消息则要大得多,接近100 MB。较大的消息被分解为一堆类似于TCP / IP堆栈的数据包。

我开始使用在用户空间中运行的轮询循环。这需要一个专用的进程来处理数据包的接收和发送。可以从几个不同的程序启动到裸机设备的消息。其中一些程序旨在在系统电源持续时间内运行,而其他程序则是由用户触发的一个程序,在程序完成后不久终止。裸机设备期望接收整个消息作为连续数据包。因此,在发送消息时,进程必须完全控制发送器。

我正在尝试简化接口并可能加快速度,因为我们通过尝试创建内核驱动程序来获得中断信号。目前,我已经提出了与共享库一起创建字符驱动程序的设计。共享库将处理将数据分解为数据包并将数据形成帧。它还会与驱动程序接口并处理信号量。当进程调用共享库打开函数时,它还将在驱动程序中创建一个邮箱结构,以存储给定PID的任何已接收消息。裸机设备没有真正的内存管理,我没有参加任何添加,因此不会有消息交错。

我的第一个问题是我相信我需要这个库并且无法在驱动程序中执行所有操作,因为我必须处理来自用户空间的100 MByte数据缓冲区。库函数将能够获取描述符并使用更合理的缓冲区大小将数据传输到驱动程序。这是正确的假设吗?

我的第二个问题是我应该尝试使用网络设备吗?我对角色设备有更多的经验,所以这就是我的开始。

1 个答案:

答案 0 :(得分:0)

我建议每个新流程在“开放”中获得一个帖子。处理

串行设备驱动程序从每次写入调用中获取一个长度,并且可以使用长度来malloc足够的内存来保存消息。

建议设备驱动程序分层编写,

1layer to handle the actual serial hardware  
1layer to handle the user interface (open, close, write entry points at a minimum)  
1layer to handle packet formation. 
1layer to handle sequencing of the messages
如果串行设备驱动程序导致用户进程在写入时阻塞,那么串行设备驱动程序将是最简单的,但是,这可能会对整体系统性能造成严重影响,因此写入操作可能会对合适的内存段进行malloc,保留唯一信息时串行设备驱动程序是打开的,以使序列层不会混合实际发送的消息。

串行设备驱动程序可能应该通过中断执行实际的I / O(大多数串行设备都有一个内部缓冲区,以最大限度地减少要处理的中断事件的总数。