Когда мы прыгаем в ядро ​​часть нашего процесса виртуальной памяти, кроме того, когда мы используем системные звонки? (В Linux)

Вы можете открыть файл с помощью ssh в Emacs, указав / ssh: : Ctrl X Ctrl F затем

/ssh:username@server:/home/prasad/test.sh
2
08.10.2018, 11:15
3 ответа
  1. Процессы, работающие в пользовательском режиме, вообще не имеют доступа к адресному пространству ядра. Процессор может переключиться в режим ядра и выполнить код ядра несколькими способами, но все они настраиваются ядром и происходят в хорошо -определенных контекстах :для запуска системного вызова, ответа на запрос. прерывание или обработка ошибки. Системные вызовы не включают прямой вызов кода ядра; они включают в себя -специфичный для архитектуры механизм, который просит ЦП передать управление ядру, чтобы выполнить определенный системный вызов, идентифицируемый по его номеру, от имени вызывающего процесса. В LWN есть серия статей, объясняющих, как это работает:Анатомия системного вызовачасть первая , часть вторая и дополнительный контент .

    Если процесс попытается получить доступ к памяти в адресном пространстве ядра, он переключится в режим ядра, но в результате ошибки; затем ядро ​​уничтожит процесс с нарушением сегментации (SIGSEGV).

    На 32 -бит x86 есть есть механизм переключения в режим ядра с помощью дальних вызовов, шлюзы вызовов ; но Linux не использует это. (И они полагаются на специальные дескрипторы сегментов кода, а не на обращение к адресам ядра.)

  2. См. выше :вы не можете перейти в память ядра. В описанных выше обстоятельствах при переходе в режим ядраЦП проверяет, разрешен ли переход, и если это так, переключается в режим ядра, используя любой механизм, подходящий для используемой архитектуры. В x86 Linux это означает переключение с кольца 3 на кольцо 0.

  3. Переход в режим ядра не влечет за собой изменение процесса, так что да, все это происходит без переключения контекста (, как считает ядро ​​).

4
27.01.2020, 22:08

1 и 2. Нет, пользовательская программа не может просто использовать инструкцию перехода для входа в память ядра. Это не разрешено. ЦП не устанавливает автоматически «бит ядра», чтобы такой переход был успешным... (возможно, какой-то ЦП имеет такую ​​функцию, но защищенный порт Linux отключит эту функцию)

...На самом деле, поскольку вы обращаетесь к странице способом, на который у вас нет разрешения, вы войдете в ядро ​​:-). Он входит контролируемым образом, он работает очень похоже на системный вызов, но мы называем это «ошибкой страницы». ЦП предоставит подробную информацию о доступе к ядру. С описанным вами типом доступа ядро ​​будет рассматривать это как ошибку в вашей программе :-). Это отправит фатальный сигнал вашей программе (SIGSEGV ).

0
27.01.2020, 22:08

Технически память ядра может быть отображена на процессы, недоступна для чтения, только для чтения или чтения -для записи и, возможно, даже для выполнения процессами путем перехода к коду, хранящемуся в этой памяти. Это может быть методом увеличения скорости некоторых системных вызовов, когда безопасно запускать код для обработки системного вызова в процессе, а не в ядре. Он также может включать такие данные, как адрес памяти, содержащий значение часов, предоставленное ядром, поэтому процесс не должен прерываться, чтобы система могла войти в ядро.

Процессы также могут вводить системные вызовы через прерывание в ядро ​​через INT 0x80, это то, с чем знакомы многие программисты на ассемблере, но это, конечно, не единственный механизм, который может быть предоставлен ядром. Нет жесткого правила, согласно которому адресные пространства ядра и пользователя должны быть полностью разделены.

Независимо от того, какие подходы использует Linux, технически возможно поместить код ядра и данные в процессы. Linux также регулярно использует память ядра в процессе по соображениям производительности, связанным с переключением контекста и TLB, но, поскольку многие области ядра являются чувствительными, они обычно не читаются процессом.

-1
18.04.2021, 20:19

Теги

Похожие вопросы