Как ядро ​​Linux частично пишется на ассемблере, когда требуются системные вызовы? [закрыто]

Iterar sobre los archivos primero, abrirlos y luego iterar sobre los directorios.

for i in "$1/*"; do [[ -f "$i" ]] && caseit "$i"; done; 
for i in "$1/*"; do [[ -d "$i" ]] && vacatetmp "$i"; done

Sería más completo llamar también a vacatetmp()desde dentro de caseit(), al final. Pero dudo que sea necesario, y conduciría a un código menos mantenible.

0
17.05.2019, 14:02
1 ответ

mov [register]и подобные им являются не системными вызовами, а инструкциями ассемблера.

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

Инструкции на ассемблере в основном представляют собой удобное для человека -представление фактических байтов машинного кода. А машинный код не интерпретируется и не компилируется, а реализуется внутри процессора либо микрокодом процессора, либо напрямую на аппаратном уровне, с помощью больших групп логических вентилей.

Один вызов системного вызова на языке ассемблера обычно состоит из нескольких строк кода. Сначала параметры для системного вызова загружаются в соответствующие регистры процессора и/или в стек, а затем используется специальная инструкция, такая как int 0x80или syscall, для фактического выполнения системного вызова.

В 32-битной архитектуре x86 -int 0x80используется в качестве инструкции системного вызова. Ядро подготовило таблицу программных обработчиков прерываний для процессора. Эта таблица недоступна напрямую для обычного пользователя -, но с помощью инструкции intкод пользовательского пространства может вызвать одну из подпрограмм, на которые указывает таблица. int 0x80просто говорит процессору переключиться в режим ядра и перейти к подпрограмме, адрес которой находится в слоте #128 этой таблицы. Эта подпрограмма является интерфейсом системных вызовов Linux для 32 -битной архитектуры x86 :. Она проверяет заданные параметры, определяет, какой процесс выполнил вызов, а затем переходит к соответствующей подпрограмме -.

В 64-битной -версии архитектуры x86 для той же цели существует специальная инструкция syscall. На самом деле, 32 -битная архитектура x86 теперь тоже имеет его, но либо его еще не существовало, когда Линус Торвальдс разработал 32 -битное соглашение о системных вызовах Linux, либо в инструкции была аппаратная ошибка в некоторых моделях процессоров, так и не привык. Но так как все 64 -битные процессоры x86 имеют инструкцию syscallи она определенно работает, она используется.

0
28.01.2020, 03:41

Теги

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