Вы можете открыть файл с помощью ssh
в Emacs, указав / ssh:
: Ctrl X Ctrl F затем
/ssh:username@server:/home/prasad/test.sh
Процессы, работающие в пользовательском режиме, вообще не имеют доступа к адресному пространству ядра. Процессор может переключиться в режим ядра и выполнить код ядра несколькими способами, но все они настраиваются ядром и происходят в хорошо -определенных контекстах :для запуска системного вызова, ответа на запрос. прерывание или обработка ошибки. Системные вызовы не включают прямой вызов кода ядра; они включают в себя -специфичный для архитектуры механизм, который просит ЦП передать управление ядру, чтобы выполнить определенный системный вызов, идентифицируемый по его номеру, от имени вызывающего процесса. В LWN есть серия статей, объясняющих, как это работает:Анатомия системного вызовачасть первая , часть вторая и дополнительный контент .
Если процесс попытается получить доступ к памяти в адресном пространстве ядра, он переключится в режим ядра, но в результате ошибки; затем ядро уничтожит процесс с нарушением сегментации (SIGSEGV
).
На 32 -бит x86 есть есть механизм переключения в режим ядра с помощью дальних вызовов, шлюзы вызовов ; но Linux не использует это. (И они полагаются на специальные дескрипторы сегментов кода, а не на обращение к адресам ядра.)
См. выше :вы не можете перейти в память ядра. В описанных выше обстоятельствах при переходе в режим ядраЦП проверяет, разрешен ли переход, и если это так, переключается в режим ядра, используя любой механизм, подходящий для используемой архитектуры. В x86 Linux это означает переключение с кольца 3 на кольцо 0.
Переход в режим ядра не влечет за собой изменение процесса, так что да, все это происходит без переключения контекста (, как считает ядро ).
1 и 2. Нет, пользовательская программа не может просто использовать инструкцию перехода для входа в память ядра. Это не разрешено. ЦП не устанавливает автоматически «бит ядра», чтобы такой переход был успешным... (возможно, какой-то ЦП имеет такую функцию, но защищенный порт Linux отключит эту функцию)
...На самом деле, поскольку вы обращаетесь к странице способом, на который у вас нет разрешения, вы войдете в ядро :-). Он входит контролируемым образом, он работает очень похоже на системный вызов, но мы называем это «ошибкой страницы». ЦП предоставит подробную информацию о доступе к ядру. С описанным вами типом доступа ядро будет рассматривать это как ошибку в вашей программе :-). Это отправит фатальный сигнал вашей программе (SIGSEGV ).
Технически память ядра может быть отображена на процессы, недоступна для чтения, только для чтения или чтения -для записи и, возможно, даже для выполнения процессами путем перехода к коду, хранящемуся в этой памяти. Это может быть методом увеличения скорости некоторых системных вызовов, когда безопасно запускать код для обработки системного вызова в процессе, а не в ядре. Он также может включать такие данные, как адрес памяти, содержащий значение часов, предоставленное ядром, поэтому процесс не должен прерываться, чтобы система могла войти в ядро.
Процессы также могут вводить системные вызовы через прерывание в ядро через INT 0x80, это то, с чем знакомы многие программисты на ассемблере, но это, конечно, не единственный механизм, который может быть предоставлен ядром. Нет жесткого правила, согласно которому адресные пространства ядра и пользователя должны быть полностью разделены.
Независимо от того, какие подходы использует Linux, технически возможно поместить код ядра и данные в процессы. Linux также регулярно использует память ядра в процессе по соображениям производительности, связанным с переключением контекста и TLB, но, поскольку многие области ядра являются чувствительными, они обычно не читаются процессом.