Как 4 ГБ (ВМ) адресного пространства используется при переходе из / в пространство пользователя в пространство ядра - PullRequest
0 голосов
/ 24 мая 2011

Я много смотрел, если онлайн-поток / учебные пособия касаются того, как адресное пространство процесса делится на процесс / ядро.

Пример: у меня есть какая-то программа Helloworld, в которой у меня есть вызов как printf (в свою очередь, он делает записьсистемный вызов для входа в пространство ядра)

Я сомневаюсь, как программный стек Helloworld используется ядром.Можете ли вы сказать мне, как происходит все выполнение ...

. / Helloworld -> printf () -> запись системного вызова -> драйвер дисплея -> возврат от записи -> обратно в helloworld

Спасибо, Амарендер

Ответы [ 2 ]

0 голосов
/ 02 июня 2011

В двух словах: когда выполняется системный вызов write, генерируется int $80 trap. Обработчик сохраняет регистры текущего процесса в стеке ядра (присутствует в адресном пространстве ядра). Затем CPL в сегментных регистрах изменяется, чтобы разрешить использование таблиц страниц ядра. Затем ядро ​​просматривает свою таблицу системных вызовов и находит соответствующий адрес нужной подпрограммы. Затем выполнение переходит к процедуре, которая, в свою очередь, может вызвать код драйвера устройства. После выполнения своей работы ядро ​​возвращается в режим пользователя, восстанавливая содержимое регистра и CPL в сегментных регистрах.

0 голосов
/ 27 мая 2011

Подробный ответ на этот вопрос зависит от конкретного ядра и архитектуры. Однако общий ответ таков: когда пользовательское пространство хочет вызвать ядро, оно выполняет команду прерывания, которая заставляет ЦП изменить уровень привилегий и начать выполнение кода ядра. Как часть изменения уровня привилегий, ЦП также переключится на стек ядра. Когда ядро ​​будет готово, оно выполнит последовательность возврата из ловушки, которая восстановит стек пользовательского пространства и возобновит выполнение с того места, где оно остановилось.

...