在linux的用户空间,有没有原子操作的函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在linux的用户空间,有没有原子操作的函数相关的知识,希望对你有一定的参考价值。

有。函数如下:

    定义在include/asm/atomic.h中。 用户程序include它,在自己控制CONFIG_SMP定义。

    在单处理器时 atomic_inc() 就是incl xxxx
    在CONFIG_SMP时, atomic_inc()是 lock incl xxxx

    因此incl XXXX在SMP时不是原子的。必须用lock.

参考技术A atomic_dec()
atomic_inc()
这两个函数难道不能用么?

文档里面又没写着用户空间的程序不能使用,你可以写个简单的程序测试一下.
如果真的没有的话,只能用临界区了.本回答被提问者和网友采纳
参考技术B open 函数加 O_APPEND 这个标志 那么并发文件操作就是一个原子 , 否则会覆盖。
int open(const char *pathname, int flags);

有没有办法从linux内核模块调用用户空间函数?

想象一下这样的情况:我将从系统调用中获取位于用户空间中的函数指针,并且内核模块调用此函数。 (这个函数在用户空间中运行很重要)kenel模块是否会看到与用户空间应用程序相同的内存地址(获取的函数指针)? (我的意思是用户的虚拟地址空间或线路地址空间)

答案

首先,你试图做错事。如果您需要内核中的自定义代码,则将其作为内核模块提供。

链接副本(Executing a user-space function from the kernel space)中的答案主要是垃圾。只要没有使用系统调用并且没有使用tls /其他任何东西,这将在某些体系结构上“起作用”。事实上,这就是充足的漏洞利用程序。

我将从系统调用中获取位于用户空间中的函数指针,并且内核模块将回调此函数。

听起来你真的想要做一些倒退的事情。如果您需要一个用户空间组件,那就应该拥有所有逻辑。然后你调用内核告诉它该做什么。

(这个函数在用户空间中运行很重要吗?)

你在问谁?我只能声明调用由用户空间种植的函数并不意味着它开始“在用户空间中运行”。切换到用户空间是很多工作,绝对不是通过调用函数来完成的。

内核模块是否会看到与用户空间应用程序相同的内存地址(获取的函数指针)?

取决于架构,通常会。但即使这样,使用这个“功能”的硬件保护也必须明确禁用。

但同样,你不想这样做。我强烈建议你陈述实际问题。

以上是关于在linux的用户空间,有没有原子操作的函数的主要内容,如果未能解决你的问题,请参考以下文章

多线程编程之原子锁

Linux设备驱动程序 之 原子操作

Linux 并发与竞争(原子操作自旋锁信号量互斥体)

管道的原子性 linux写操作原子性

杂谈如何对Redis进行原子操作

Linux编程--文件原子操作