Мой вопрос может быть глупым. Но даже после некоторых поисков я так и не понял, почему highmem не нужен в 64-битных архитектурах.

Насколько я искал, в x64bit нет highmem. Другими словами, вся физическая память напрямую отображается на виртуальную память.

Но при этом все процессы будут иметь свое адресное пространство от 0x00000 до sth по разным причинам, включая безопасность.

Если вся физическая память уже напрямую сопоставлена ​​с каждой частью виртуальной памяти, как мы можем создать отдельное и изолированное адресное пространство для каждого процесса, не изменяя сопоставление между физической памятью и виртуальной памятью?

1
Jonggyu Park 22 Янв 2021 в 16:02

1 ответ

Как мы можем создать отдельное и изолированное адресное пространство для каждого процесса, не изменяя сопоставление между физической памятью и виртуальной памятью?

Это именно то, что позволяет виртуальная память и что делает ядро: каждый процесс получает свое собственное, отдельное отображение виртуальной памяти. Это то, что позволяет странице 1000 в одном процессе указывать на физическую страницу X в памяти, в то время как страница 1000 в другом процессе указывает на физическую страницу Y в памяти, а страница 1000 в еще одном процессе выгружается. Каждый раз, когда контекст переключается с одного процесса на другой, отображение виртуальной памяти изменяется в соответствии с новым процессом.

Highmem необходим, так как ядро ​​сохраняет собственное отображение физических память в своем виртуальном адресном пространстве (на 32-разрядной платформе x86 верхний гигабайт адресного пространства в типичном разделении 3G/1G). Ядро должно иметь доступ к любой странице физической памяти, независимо от того, отображается ли она в виртуальной памяти текущего процесса; вот почему полезно прямое отображение физической памяти. В 32-разрядных системах это прямое сопоставление ограничено по размеру по сравнению с потенциальными размерами физической памяти: не более примерно 896 МБ на 32-разрядной платформе x86. Чтобы получить доступ к физической памяти за пределами этой области, ядру необходимо отображать страницы на лету. В 64-разрядных системах на стороне ядра адресного пространства достаточно места для прямое сопоставление до 64 ТБ физической памяти, что пока достаточно для большинства систем (а в системах, где это не так, пятиуровневые таблицы страниц позволяют отображать до 32 ТБ физической памяти).

См. также эту недавнюю статью LWN, которая включает обновление памяти.

1
Stephen Kitt 22 Янв 2021 в 16:26