Кэш страницы и переключение режима

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

Я могу ошибаться в некоторых своих описаниях выше. Поправьте меня, если я. Я пытаюсь собрать это воедино. Кроме того, меня больше интересует ядро ​​Linux.


person Phelodas    schedule 02.02.2015    source источник
comment
Что именно вы имеете в виду под кэшем страниц? Для чего операции ввода-вывода нужен этот кеш? Я просто хочу убедиться, что понимаю ваш вопрос.   -  person Pablo Antonio    schedule 03.02.2015
comment
Я говорю о буферном кеше ОС. Кэш будет буферизовать чтение и запись (как грязные страницы). Надеюсь, это поможет.   -  person Phelodas    schedule 03.02.2015


Ответы (2)


Упрощенное объяснение:

Отображение страниц не меняется при переходе в режим ядра. Однако собственное пространство памяти ядра становится доступным (из-за смены кольца). В режиме ядра по-прежнему можно получить доступ к пользовательской памяти процесса. Поэтому для стандартных вызовов ввода/вывода делать нечего - доступ к пользовательскому пространству можно получить напрямую. Однако во многих случаях это не очень хорошая идея, так как переданные указатели могут указывать на неотображенную память, или выгружаемую память, или исчезать в середине вызова. Поэтому обычно используются copy_to_user и copy_from_user.

Могут быть некоторые системные вызовы, которые действительно изменяют карту памяти. Например, fork() создает копии CoW карты страницы. exec и друзья переназначают страницы на исполняемый файл на диске. Однако это исключение.

Кроме того, системный вызов может переключать контекст. Например, sleep() почти гарантировано. Однако это не для доступа к памяти вызывающей программы.

person abligh    schedule 02.02.2015

Например, Linux/x86 обычно использует разделение 3Gb/1Gb для пространства пользователя/пространства ядра. Это означает, что ядро ​​может напрямую обращаться почти к 1 Гб физической памяти.

Чтобы получить доступ к большему объему памяти, будет использоваться высокая память (например, буферы отказов).

Конечно, разделение 4Gb/4Gb (которое можно настроить в конфигурации ядра) потребует переключения контекста.

person ninjalj    schedule 03.02.2015