0

当一个进程在调用“read”后被阻塞时,内核从ios读取数据并将其复制到缓冲区,但是缓冲区在哪里,在内核还是在用户空间(这是“read”的参数功能)。它节省了从内核空间到用户空间的处理,供以后选择,而且用户空间有更多的缓冲区。但是每次应对时都要更改cr3,这会刷新所有TLB数据。这就是我所知道的两个选择,还有其他的吗?

4

2 回答 2

1

一种方法是要求设备驱动程序通过 mmap 将其内核缓冲区映射到进程的用户地址空间,然后使用 remap_pfn_range 之类的东西。

当驱动程序完成 I/O 操作时,复制到其内核缓冲区不需要 cr3 更改或击落 TLB。

当用户进程在等待 I/O 时,很有可能它会被调度到另一个新进程来运行,然后 cr3 必须更改(+ TLB 刷新)才能完成整个 I/O 操作完全的。

于 2012-06-02T16:10:32.277 回答
1

我在内核中看到的一种常见模式是缓冲区通常分配在内核空间中 - kzalloc(PAGE_SIZE, GFP_KERNEL)(不一定是 PAGE_SIZE),然后读取发生在该缓冲区中。然后使用 (fs/libfs.c) 将其复制到用户空间simple_read_from_buffer(..)- 在内部使用copy_to_user(). 尽管这通常用于简单的 I/O 操作或其他(例如 debugfs)读取。

于 2012-06-02T18:09:32.953 回答