2015-02-02 3 views
2

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

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

+0

Что именно вы имеете в виду с «кешем страницы»? Для чего нужна операция ввода-вывода? Я просто хочу, чтобы я понял ваш вопрос. –

+0

Я говорю о кэше буфера ОС. Кэш будет буферизовать чтение и запись (как грязные страницы). Надеюсь, это поможет. – Phelodas

ответ

1

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

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

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

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

1

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

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

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

Смежные вопросы