4

最近我参加了几次采访。在提出的所有内核问题中,有一个具体问题我找不到令人信服的答案。

在用户空间进程和中断上下文函数之间共享数据时,您将如何使用不同的同步技术?我令人信服的答案是:

在中断上下文代码中:

1. do *spin_lock_irqsave*
2. access data buffer which is shared between user space app and kernel
3. do *spin_lock_irqrestore*

那么这不是令人信服的答案。在所有数据访问的情况下,irqsave我都必须这样做吗?irqrestore

4

1 回答 1

2

您不能直接将数据从中断上下文传输到用户空间上下文。在中断进程中没有进程信息,所以你不知道将数据发送到哪里。您需要使用内核空间中的中间进程上下文。

现在,来回答这个问题。在您的设备数据中,您将有一个缓冲区,您将在其中存储来自中断上下文的数据。您需要使用自旋锁保护您的数据,但不使用 irqsave/irqrestore 部分。因为您处于中断上下文中。

然后,您的设备将为用户空间提供一种获取此数据的方法。通过 char 设备或 netlink 套接字或 ioctl 调用或任何其他方法,由您决定。当用户空间需要这些数据时,你会memcpy从设备缓冲区到用户空间缓冲区。但是您将使用spin_lock_irqsave/ spin_lock_irqrestorepair 保护设备缓冲区,因为您不希望中断代码死锁。

当用户空间使用上面介绍的方法之一(char device read,netlink socket,ioctlcall,...)时,内核负责提供锁定机制,但用于用户空间和进程之间的接口。

于 2012-10-16T05:21:13.197 回答