Страницы ядра выгружаются? - PullRequest
12 голосов
/ 26 декабря 2010

Относительно ядра Linux, когда-нибудь меняются страницы "Ядра"? Кроме того, страницы пользовательского пространства когда-либо находятся в ZONE_NORMAL?

Ответы [ 3 ]

11 голосов
/ 26 декабря 2010

Нет, память ядра отключена.

5 голосов
/ 21 августа 2012
  1. Страницы ядра не могут быть заменены.Но его можно освободить.

  2. Страницы UserSpace могут находиться в ZONE_NORMAL.Система Linux может быть настроена на использование HIGHMEM или нет.Если ZONE_HIGHMEM настроен, то процессы пользовательского пространства получат свою память из HIGHMEM, иначе процессы пользовательского пространства получат память из ZONE_NORMAL.

2 голосов
/ 24 января 2017

Да, при нормальных обстоятельствах страницы ядра (т. Е. Память, находящаяся в ядре для использования в ядре) не подлежат замене. Фактически, после обнаружения (см. Исходный код обработчика подкачки страницы) ядро ​​явно аварийно завершает работу.

См. Это:

http://lxr.free -electrons.com / source / arch / x86 / mm / fault.c

и функция:

1205 /*
1206  * This routine handles page faults.  It determines the address,
1207  * and the problem, and then passes it off to one of the appropriate
1208  * routines.
1209  *
1210  * This function must have noinline because both callers
1211  * {,trace_}do_page_fault() have notrace on. Having this an actual function
1212  * guarantees there's a function trace entry.
1213  */
1214 static noinline void
1215 __do_page_fault(struct pt_regs *regs, unsigned long error_code,
1216                 unsigned long address)
1217 {

И обнаружение здесь:

1246          *
1247          * This verifies that the fault happens in kernel space
1248          * (error_code & 4) == 0, and that the fault was not a
1249          * protection error (error_code & 9) == 0.
1250          */
1251         if (unlikely(fault_in_kernel_space(address))) {
1252                 if (!(error_code & (PF_RSVD | PF_USER | PF_PROT))) {
1253                         if (vmalloc_fault(address) >= 0)
1254                                 return;
1255 
1256                         if (kmemcheck_fault(regs, address, error_code))
1257                                 return;
1258                 }

Но тот же самый обработчик ошибок страницы - который может обнаружить сбой страницы, возникающий из несуществующей памяти пользовательского режима (все аппаратное обнаружение сбоя страницы всегда выполняется в ядре), будет явноизвлечь данные из пространства подкачки, если они существуют, или запустить процедуру выделения памяти, чтобы дать процессу больше памяти.

Хорошо, сказано, что ядро ​​выменяет структуры ядра / память / списки задач и т. д. во время приостановки и спящего режима программного обеспечения.операция:

https://www.kernel.org/doc/Documentation/power/swsusp.txt

И на этапе возобновления он восстановит память ядра из файла подкачки.

...