首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连续使用kmap_atomic()和kunmap_atomic()

连续使用kmap_atomic()和kunmap_atomic()
EN

Stack Overflow用户
提问于 2013-11-12 14:12:08
回答 2查看 948关注 0票数 2

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

代码语言:javascript
复制
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负载)时,如下所示:

代码语言:javascript
复制
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();

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

代码语言:javascript
复制
scheduling while atomic
thread overran stack or stack corrupted

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

Linux内核版本: 3.0.48,Distr 7.0.1和Altlinux6.0内核版本3.4.62运行良好,但我正好需要3.0.48

我已经和它斗争了一段时间了,但是我不知道。你有吗?

EN

回答 2

Stack Overflow用户

发布于 2015-11-18 23:05:25

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

像这样:

代码语言:javascript
复制
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]);
}
票数 2
EN

Stack Overflow用户

发布于 2013-11-13 13:36:20

调用调度或在中断上下文中休眠的任何东西都是原因

即使你已经删除了preempt_schedule,可能还有一些休眠和休眠呼叫时间表,检查这个

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19922175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档