gpt4 book ai didi

linux - 连续使用 kmap_atomic() 和 kunmap_atomic()

转载 作者:太空狗 更新时间:2023-10-29 12:18:00 25 4
gpt4 key购买 nike

我正在为 Linux 内核编写一个可加载模块,我需要在其中映射和取消映射内存页。它发生在所有中断都被禁用的情况下。操作顺序如下所示:

preempt_disable();
disable_all_interrupts(&interrupt_mask_saved);
kmap_atomic(page); // here i map ONE page
do_some_work();
kunmap_atomic(page); // unmapping ONE page
restore_all_interrupts(interrupt_mask_saved);
preempt_enable();

通过这些操作,一切都很好。但是当我需要像这样映射/取消映射多个页面时(我需要它来提高 cpu 负载):

preempt_disable();
disable_all_interrupts(&interrupt_mask_saved);
for (i = 0; i < page_num; i++) {
kmap_atomic(page[ i ]); // here i map several pages
}
do_some_work();
// i tried backward unmapping but the result is the same
for (i = 0; i < page_num; i++) {
kunmap_atomic(); // unmapping several pages
}
restore_all_interrupts(interrupt_mask_saved);
preempt_enable();

系统崩溃。不在图形模式下时,错误和信息消息直接显示在终端中。向屏幕输出一些消息后系统卡住。内核日志是空的,但我注意到的错误是:

scheduling while atomic
thread overran stack or stack corrupted

在 Linux 代码中,我发现 kunmap_atomic 使用 preempt_schedule(),这可能是原子调度的原因。但是我自己重写了kmap_atomic和kunmap_atomic的函数,没有处理抢占,还是不行。我在映射和取消映射之间执行的操作不是原因,因为我尝试没有它们但它仍然卡住。

Linux 内核版本:3.0.48、Distr AltLinux 7.0.1 和 Altlinux 6.0内核版本 3.4.62 工作正常,但我恰好需要 3.0.48

我已经为此苦苦挣扎了一段时间,但我没有想法。你有吗?

最佳答案

您必须配对嵌套的 kmap/kunmap 函数。

喜欢:

for (i = 0; i < page_num; i++) { 
address[i] = kmap_atomic(page[i]);
}

do_some_work();

for (i = page_num - 1; i >= 0; i--) {
kunmap_atomic(address[i]);
}

关于linux - 连续使用 kmap_atomic() 和 kunmap_atomic(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19922175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com