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

Четох, че когато се изпълни повикване на OS, процесът претърпява само превключване на режима, за разлика от превключване на контекста. Доколкото разбирам, това ще повиши привилегията на процеса и ще му позволи достъп до кода на ядрото, който е картографиран в неговото виртуално адресно пространство. (Това ще изисква промяна на защитния пръстен с използване на капан, според мен). Въпреки това, ако това извикване на ОС ще изпълнява IO, може да се наложи да използва кеша на страницата. Как става това без превключване на контекста? Или кешът на страницата също е картографиран към виртуалното адресно пространство на всеки процес?

Може да греша в някои от описанията си по-горе. Поправете ме, ако съм. Опитвам се да сглобя това. Освен това се интересувам повече от ядрото на Linux.


person Phelodas    schedule 02.02.2015    source източник
comment
Какво точно имате предвид с кеш на страниците? За какво ще е необходим този кеш на IO операцията? Просто искам да се уверя, че разбирам въпроса ви.   -  person Pablo Antonio    schedule 03.02.2015
comment
Говоря за буферния кеш на ОС. Кешът ще буферира четенията и записите (като мръсни страници). Надявам се това да помогне.   -  person Phelodas    schedule 03.02.2015


Отговори (2)


Опростено обяснение:

Съпоставянето на страницата не се променя, когато преминете към режим на ядрото. Въпреки това, собственото пространство на паметта на ядрото става достъпно (поради промяната на пръстена). Когато сте в режим на ядрото, все още можете да получите достъп до паметта на потребителското пространство на процеса. Следователно за стандартните I/O повиквания няма какво да се прави - потребителското пространство може да бъде достъпно директно. Въпреки това, в много случаи това не е добра идея, тъй като предадените указатели може да сочат към некартирана памет, или изведена памет, или да изчезнат по средата на повикването. Следователно обикновено се използват copy_to_user и copy_from_user.

Може да има някои системни извиквания, които да променят картата на паметта. Например, fork() създава CoW копия на картата на страницата. exec и приятели пренасочват страници към изпълним файл на диск. Това обаче са изключение.

Освен това системно повикване може да превключва контекста. Например sleep() е почти гарантирано. Това обаче не е за целите на достъп до паметта на извикващата програма.

person abligh    schedule 02.02.2015

Като пример Linux/x86 обикновено използва разделяне на 3Gb/1Gb за потребителско пространство/пространство на ядрото. Което означава, че ядрото има директен достъп до почти 1 Gb физическа памет.

За достъп до повече памет ще се използва висока памет (т.е. буфери за отскачане).

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

person ninjalj    schedule 03.02.2015