我正在为linux内核开发一个补丁。我必须使用多个列表,并且我必须保护它们不受多核机器上并发修改的影响。我正在尝试使用自旋锁来实现这个目标,但是有一些事情我不能理解。我必须锁定列表的条目(我使用的是链表的linux默认实现),可能会发生这样的情况:一个进程调用syscall来删除列表中的一个元素,而相同的元素被锁定,因为实际上正在对它进行一些修改。如果我在列表条目中插入一个自旋锁,当有人在它上面进行自旋锁定时,如果进程设法删除它,会发生什么??我应该锁定整个列表吗?我正在寻找一段代码,可以解释如何处理这种情况。
例如,这段代码不应该工作(参见最后一行代码的注释):
struct list
请给出用lp编译Linux3.10内核的步骤。我正在将3.10内核移植到带有设备树的arndale板( exynos )中。我通过运行
ARCH=arm scripts/kconfig/merge_config.sh arch/arm/configs/exynos_defconfig android/configs/android-base.cfg
我试着编译它。
但是获得编译错误,比如
In file included from include/linux/jbd.h:247:0,
from fs/ext3/ext3.h:23,
from
我正在阅读一些代码,我在函数foo中看到:
// x is a global variable shared by all functions
spin_lock(&x);
if(some condition)
function();
spin_unlock(&x);
在函数()中;
// do stuff
spin_lock_irqsave(&x, vals);
....
如果“某个条件”为真,会不会出现死锁?这似乎太明显了,所以我想我可能遗漏了什么?
谢谢
编辑:代码不是linux的一部分,它只是我在网上找到的一些随机代码
我在为一个在嵌入式Linux中工作的程序跟踪一段代码,并遇到了这种情况。我无法搜索出有用的信息来向我展示它是如何工作的。
这段代码的编写方式如下:
unsigned char foo(*someaddress){
unsigned long flags = 0; //why use a long?
flags = save_and_cli(); //what is this?
spin_lock_irqsave(&someaddress, flags);//ok, this is a spin lock
...do something...
restore_flags(flags)
我正尝试在vxWorks 6.7中使用spinlockIsr_t,但是如果我尝试在多个任务中使用它,系统就会冻结。您是否允许使用多个任务来尝试获取相同的自旋锁?如果不是,那么首先它的意义是什么?下面的代码可以处理1或2个任务,但是一旦任务数增加到3个,系统就会死机,然后才能在控制台上完成第一行打印。
spinlockIsr_t mySpinLock;
int sharedResource;
void vx_test_mtx_spin_lock(void)
{
const int kNumTask = 3;
const int kTaskPriority = 50;
c
我试图从内核模块访问vm_list和mm_struct,但出于某种原因,我的输出始终为null,尽管我有多达3个VM在运行。
如果重要的话,整个事情都是在VM中运行的,因为我不想搅乱真正的内核。
#undef __KERNEL__
#define __KERNEL__
#undef MODULE
#define MODULE
// Linux Kernel/LKM headers: module.h is needed by all modules and kernel.h is needed for KERN_INFO.
#include <linux/module.
关于在linux内核中使用循环缓冲区宏,我有一个问题。
我正在尝试使用include/linux/circ_buf.h中的循环缓冲区宏。
ACCESS_ONCE()宏用于确保编译器将从内存中读取值,而不是试图优化访问。
在循环缓冲区的文档中,给出了以下代码作为生成器的示例:
spin_lock(&producer_lock);
unsigned long head = buffer->head;
/* The spin_unlock() and next spin_lock() provide needed ordering. *
请您解释一下我在linux内核源代码中找到的这段代码。我在linux和minix内核中看到了很多这样的代码,但似乎找不到它能做什么(即使C编译器支持这种函数定义)。
/* IRQs are disabled and uidhash_lock is held upon function entry.
* IRQ state (as stored in flags) is restored and uidhash_lock released
* upon function exit.
*/
static void free_user(struct user_struct *up, unsig