我的内核 3.0的手册页mlockall
说
mlockall() 锁定所有映射到调用进程地址空间的页面。这包括代码、数据和堆栈 段的页面,以及共享库、用户空间内核数据、共享内存和内存映射文件。调用成功返回时,保证所有映射的页面都驻留在 RAM 中;这些页面保证保留在 RAM 中,直到以后解锁。
后来说
使用 mlockall() 来防止页面错误延迟的实时进程应该在进入时间关键部分之前保留足够的锁定堆栈页面,以便函数调用不会导致页面错误。这可以通过调用一个函数来实现,该函数分配一个足够大的自动变量(一个数组)并写入该数组占用的内存以接触这些堆栈页面。这样,足够多的页面将被映射到堆栈并且可以锁定到 RAM 中。虚拟写入确保在临界区中甚至不会发生写时复制页面错误。
我了解此系统调用无法猜测将达到的最大堆栈大小,因此无法锁定堆栈的页面。但是为什么上面显示的 man 的第一部分说它也是为堆栈完成的?这个手册页中是否有错误,或者它只是意味着锁定是针对初始堆栈大小完成的?