在 Linux 0.01 中添加系统调用以使用 C++ "Semaphore"

Adding System Calls in Linux 0.01 for a "Semaphore" using C++

本文关键字:C++ Semaphore 系统调用 Linux 添加      更新时间:2023-10-16

我正在尝试在Linux 0.01中实现一组提供信号量(没有繁忙等待)模块的系统调用。我希望这些系统调用允许进程请求一个新的信号量,并将其用于进程同步。

我想写这些在c++中,但我有麻烦让他们工作。有人有简单的解决方案吗?

  • (系统调用#110)int sema_request(int value):这个函数如果成功返回一个新的信号量,否则返回-1。fresh信号量初始化为"value"。你的实现应该在整个操作系统中支持至少10个不同的信号量。
  • (系统调用#111)int sema_wait(int s):这个函数实现了对信号量s的"等待"操作。如果成功返回0,否则返回-1。
  • (系统调用#112)int sema_signal(int s):这个函数对信号量s执行"信号"操作。如果成功返回0,否则返回-1。

如果别人帮你做你的工作,你不会学到太多东西,但这里是我写的一个用户模式信号量实现:

https://github.com/vinniefalco/VFLib/blob/master/modules/vf_core/threads/vf_Semaphore.hhttps://github.com/vinniefalco/VFLib/blob/master/modules/vf_core/threads/vf_Semaphore.cpp

您当然需要根据您的环境(分别为条件变量、互斥锁和原子整数操作)将WaitableEvent、SpinLock和Atomic映射到相应的对应对象。您还需要提供一个简单的堆栈,或者您可以采用我的库中的无锁实现。请注意,如果您决定使用无锁,则必须保留"已删除列表",否则您将遇到ABA问题。

你的API设计看起来不错,应该可以很好地实现。

可以在驱动程序加载时初始化10个内核级信号量。当sema_request调用时,如果请求有效,返回索引0~9。当sema_wait(index)调用时,调用相应的信号量wait,反之亦然。

内核级别的信号已经实现了你需要的所有功能(阻塞,等待队列,唤醒),你的驱动程序代码的主要目的是写一个好的驱动程序接口,如果有任何问题,打印出一些消息

参考:https://www.kernel.org/pub/linux/kernel/people/rusty/kernel-locking/c93.html