#assembly #mips #system-calls #exit
#сборка #mips #системные вызовы #выход
Вопрос:
Как гипотетическое ядро ОС на процессоре, совместимом с MIPS I, фактически реализует системный вызов 10, тем самым останавливая все выполнение и отключая питание?
Длинная история:
В настоящее время я создаю эмулятор MIPS, основанный конкретно на спецификации архитектуры MIPS I; Я разобрался (почти) со всей ISA, которая поставляется с ним, и сделал несколько глубоких и интересных открытий на этом пути. Я также занимаюсь привилегированными ресурсами и всем, что связано с системным сопроцессором (COP0).
Я намерен написать базовое ядро, которое обрабатывает исключения / системные вызовы / ловушки в привилегированном контексте, в основном для имитации выполнения системных вызовов с точки зрения режима ядра; в настоящее время меня ставит в тупик системный вызов завершения, код 10. Я ожидал найти какую-нибудь (привилегированную) инструкцию, которая останавливает выполнение, как HLT
это происходит с x86; однако самое близкое к этому, что я могу найти, — это WAIT
инструкция.
WAIT
на самом деле предназначен для переключения процессора в режим низкого энергопотребления и ожидания прерываний и находится в ISA, что делает его доступным и в пользовательском режиме; нет никаких указаний на завершение выполнения, хотя я мог бы придумать какой-то способ его изготовления.
Однако; Я чувствую, что я на неверном пути, и тома I-A, II-A и III спецификации MIPS мне больше не помогают. Другими словами: кто-нибудь знает, что на самом деле происходит в реальном процессоре MIPS после выполнения системного вызова 10?
Комментарии:
1.
HLT
также ожидает прерываний, это не отключение питания. Фактическое отключение питания на x86 может быть выполнено через ACPI, но это для ПК, а не для устройств MIPS2. «что происходит в реальном процессоре MIPS после выполнения системного вызова 10?» Обратите внимание, что системный вызов 10, используемый для завершения выполнения, является программной конструкцией, реализованной различными симуляторами MIPS. Это не то, что является частью архитектуры процессора. Вы можете посмотреть на реализацию SPIM здесь и здесь .
3. Вы имеете в виду фактическое отключение всей машины, чтобы она оставалась выключенной, пока кто-нибудь не придет, чтобы снова включить ее? Я не знаю о MIPS, но обычно это особенность внешнего оборудования, предоставляемого разработчиком системы, а не самого процессора. Вы должны выполнить это с помощью соответствующих команд ввода-вывода для этого внешнего оборудования в соответствии с его документацией, и это не обязательно будет одинаковым для всех машин на базе MIPS.
4. Остановка процессора не приведет к отключению питания устройства, за исключением mcu, и оно не выключается, оно переходит в состояние низкого энергопотребления. Если вы хотите отключить систему, это не имеет ничего общего с набором команд или самим процессором, точно так же, как вентиляторы или пиксели, или выключение экрана для экономии энергии, это внешнее по отношению к процессору и выполняется с помощью программного обеспечения, созданного для этой системы (точно так же, как вывод пикселей на дисплей или разговорк клавиатуре или аккумулятору ноутбука и т. Д.). Процессоры, как правило, не останавливаются, поскольку это не имеет смысла вне моделирования тестовых векторов или тому подобного. Обычно процессор останавливается при отключении питания.
5.
syscall 10
кажется более похожим на завершение процесса, а не на выключение. Я говорю это потому, что симуляторы MARS и SPIM больше похожи на то, что они имитируют один процесс с некоторыми вспомогательными системными вызовами, чем на полноценный процессор, работающий под управлением операционной системы.
Ответ №1:
системный вызов 10
Syscall
номера всегда зависят от операционной системы: версия Linux для MIPS использует совершенно другие номера системных вызовов, чем эмулятор SPIM.
По этой причине вам лучше говорить не о «системном вызове 10«, а о «системном вызове 10 в SPIM» (или любой другой ОС или эмуляторе, о котором вы говорите), чтобы избежать недоразумений.
Как гипотетическое ядро ОС на процессоре, совместимом с MIPS I, фактически реализует системный вызов 10 …
Прежде всего: в эмуляторе «SPIM» «системный вызов 10» exit
отсутствует shutdown
.
exit
не выключает компьютер, но останавливает текущую задачу в многозадачной ОС. ОС просто освобождает все ресурсы текущей задачи (например, она помечает память, используемую задачей, как «свободную») и больше не планирует эту задачу.
Все остальные задачи (а также ОС и процессор) продолжают выполняться.
… это останавливает выполнение, как
HLT
и делает…
Я не уверен, что на самом HLT
деле работает на современных процессорах x86. На ранних процессорах Intel HLT
инструкция просто выполняла возврат к себе, пока не возникало прерывание.
Это означает, что процессор не выполнил HLT
инструкцию один раз, но он выполнял инструкцию снова и снова (точно так же, как JMP
инструкция в бесконечном цикле).
Если происходит прерывание, этот бесконечный цикл прерывается (выполнение продолжается после следующей инструкции после HLT
); если прерывания не происходит (это можно сделать принудительно, используя комбинацию CLI
HLT
), процессор переходит в бесконечный цикл, но он не выключается.
… остановка всего выполнения и отключение питания?
Это shutdown
:
Ядра процессора обычно не имеют этой функции; это делает какое-то оборудование вне процессора.
Как и все другое оборудование (клавиатура, экран, диск …), доступ к ответственному аппаратному блоку осуществляется с использованием адреса ввода-вывода:
При подключении к процессору, который не поддерживает специальное адресное пространство ввода-вывода (например IN
, OUT
инструкции и на x86), используются «обычные» (память) адреса.
Допустим, блок питания подключен к вашей системе по адресу 0xF1234560 (просто в качестве примера), и питание отключается при записи значения 0x789 на этот адрес. В этом случае следующая последовательность отключит вашу систему:
LUI a0, 0xF123
ORI a1, zero, 0x789
SW a1, 0x4560(a0)
И поскольку этот аппаратный блок находится вне процессора, вы не найдете никакой информации о нем в руководствах по процессорам.
И, конечно, разные аппаратные блоки, работающие совершенно по-разному, используются в разных типах компьютеров, использующих один и тот же тип процессора! (Таким образом, нет «типичного блока питания MIPS».)
В 1990-х годах (когда было построено большинство настольных компьютеров MIPS) было очень распространено, что программное обеспечение вообще не могло отключить питание системы, но на экран выводилось какое-то сообщение («Пожалуйста, выключите компьютер«), и процессор просто переходил в бесконечный цикл…