418ImATeapot писал(а):
Я имел в виду именно виртуальную память. Если понимать переключение контекста как сохранение/восстановление состояния, то получится, что любой вызов процедуры - переключения контекста.
Не любой. Например, процедуры обязаны сохранять лишь часть регистров, в то время как настоящее переключение контекста должно сохранить все регистры, включая флаги.
Цитата:
Но монолиту тоже придётся загружать в TLB новые значения, адресов ядра там может не оказаться, особенно если приложение интенсивно его использует. Или я что-то не понимаю?
"Может" или "не может" -- это гадание на кофейной гуще. В наихудшей ситуации много что может произойти, однако обычно имеет место нечто среднее, а не наилучший и не наихудший случаи. В частности, редко какая задача за короткий промежуток времени (укладывающийся в один интервал, выделенный ей для непрерывного исполнения -- ведь ОС, как правило, реализуют квантование времени и периодически снимают задачу с процессора) выполнит обращения к столь большому набору адресов, что полностью обновит содержимое TLB; соответственно, редко в каком случае "системные" элементы TLB окажутся замещёнными.
Кроме того, современные MMU позволяют явно указать, что некоторые элементы TLB не должны выбрасываться из него при переключении контекста (точней, при перезагрузке регистра базы таблиц переадресации). В случае микроядра эта особенность не шибко полезна, поскольку только страницы собственно микроядра являются глобальными и отображаются в виртуальном адресном пространстве любой задачи, поскольку каждая подсистема имеет собственное ВАП, а значит, свой собственный набор страниц, и при переходе от одной подсистемы к другой приходится менять это отображение, т.е. сбрасывать TLB (а при возврате вновь его сбрасывать -- и так много раз до тех пор, пока запрос задачи не был обработан). В монолите же вся область системы объявляется глобальной, и TLB приходится сбрасывать только в том случае, если происходит переключение на другую задачу -- т.е. не просто сохранение контекста, а полное его переключение (поскольку, если управление после выполнения системой своих функций возвращается той же задаче, нет необходимости менять отображение памяти, а значит, сбрасывать TLB).
А ещё некоторые MMU позволяют явно фиксировать определённые элементы в TLB, и тогда они никогда не будут оттуда вытеснены. Для микроядра подобная особенность тоже не шибко полезна, а вот для монолита -- очень даже.
Наконец, если говорить про современные интеловские процессоры, то, насколько помню, у них есть несколько TLB, каждый из которых используется для страниц определённого размера. Если задачам всегда выделять страницы по 4 Кбайта, а ядру -- большие страницы, то последние никогда из TLB вытеснены не будут, поскольку сам TLB для них будет не тот, что для задач. Но микроядру это снова бесполезно, ведь там необходимо менять отображение памяти в процессе работы самой системы, а не только при переключении задач.
Кстати говоря, загрузка в TLB ведётся не ядром, а самим процессором, и только тогда, когда это реально необходимо. К архитектуре ядра это никакого отношения не имеет.