2009-07-15 5 views
2

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

Я заинтересован в том, чтобы делать это как в среде MS Windows, так и в Linux. Рассматриваются любые языки или API.

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

Возможно ли это?

+0

Зачем вам это нужно? Единственная причина, по которой я могу придумать, - это объединиться с вещами, с которыми вы не должны возиться (Flash BIOS и т. Д.). – Powerlord

+0

Я принимаю, что прецедент совершенно незначителен. Мой интерес - это прежде всего производительность. Раньше такого рода вещи были обычными в старые 8 и 16-битные дни, и я думаю, что это имеет ценность как интеллектуальное упражнение. Я подумал, возможно, что поставщики ОС оказали достаточное давление на производителей чипов, чтобы добавить аппаратное обеспечение поддержки ОС, которое сделало бы это невозможным, но эта человеческая изобретательность найдет какие-то скрытые способы обойти запреты. Некоторые интересные ответы здесь. –

+0

Вы должны быть * реальными * старайтесь не наступать на все, что может вызвать проблемы, когда ОС вернется. По какой причине вы не можете перезагрузиться в пользовательскую ОС и перезагрузиться в исходную? Производительность кажется странной причиной того, чего вы почти никогда не делали. –

ответ

0

Не как таковой, нет.

Что вы хотите - это в основном приложение, которое становится ОС; сильно урезанное Linux-ядро в сочетании с некоторыми высоко настраиваемыми и сведенными к минимуму инструментами, может быть, способ пойти на это.

+0

Невозможно; это было сделано, как вариант спячки. Смотрите мой пост. :) – bdonlan

+0

Действительно. Я стою исправлено. –

14

С Linux вы можете использовать kexec jump, чтобы полностью передать управление другому ядру (т. Е. Вашей программе). Разумеется, с большой силой приходит большая ответственность - вам все же нужно обслуживать прерывания и избегать развращения памяти старого ядра. В итоге вам придется написать собственное ядро ​​ОС для этого. Кроме того, передача управления занимает довольно много времени, так как ядро ​​должно де-инициализировать все оборудование, а затем повторно инициализировать его, когда придет время для возобновления. Поскольку скачок kexec был первоначально разработан для поддержки гибернации, это не проблема в его исходном контексте, но в зависимости от того, что вы делаете, это может быть проблемой.

Возможно, вы захотите рассмотреть возможность работы в рамках, предоставленном вам ОС, - просто напишите обычный драйвер для того, что вы делаете.

И, наконец, еще один вариант будет использовать linux Real-Time patchset. Это позволяет назначать статические приоритеты всем, даже обработчикам прерываний; запустив процесс с более высоким приоритетом, чем что-либо еще, вы можете приостановить/почти/все - система по-прежнему будет обслуживать небольшую заглушку для прерываний, а также некоторые прерывания, которые нельзя отложить, например, временные прерывания, но для большинства часть тяжелой работы будет отложена до тех пор, пока вы не откажетесь от управления процессором.

Обратите внимание, что пакет исправлений RT не остановит виртуальную память и т. П. - mlockall предотвратит ошибки страницы на допустимых страницах, хотя этого вам и достаточно.

Также имейте в виду, что, что бы вы ни делали, системная BIOS все еще может вызвать SMM traps, что невозможно отключить, за исключением методов, ориентированных на материнскую плату.

1

Не совсем. Операционные системы являются основой, и ваша программа работает поверх них. ОС обрабатывает доступ к памяти, операции записи на диск, связь и т. Д., Когда ваше приложение делает запросы, и попросить ОС уйти с пути будет означать, что ваша программа должна будет выполнять работу ОС.

-2

Да, чувак, вы можете это сделать, вы также можете написать программу, чтобы сообщить моему банку, чтобы дать вам все мои деньги и отправить вам горячего русского.

+0

Что не смешно об этом! – jDeveloper

+0

Вы невольно произошли по моей самой идее, черт возьми! –

+0

+1: Я покажу тебе какую-то любовь! :) -2 казался суровым для очевидной шутки. :) –

2

Есть много действительно уродливых способов сделать это. Вы можете изменить запущенное ядро, написав какой-то батутный код в/dev/kmem, который передает управление вашему приложению. Но я бы не рекомендовал попробовать что-то подобное!

В принципе, вам необходимо, чтобы ваше приложение выступало в качестве собственной операционной системы.Если вы хотите прочитать данные из файла, вам нужно выяснить, где данные живут на диске, и генерировать ваши собственные запросы SCSI для разговора с дисководом. Вам нужно будет реализовать собственный обработчик прерываний, чтобы получить уведомление, когда данные будут готовы. Точно так же вам придется обрабатывать ошибки страницы, распределение памяти и т. Д. Большинство пользователей считают, что это не стоит усилий ...

Почему вы хотите это сделать?

Есть ли что-то, что вашему приложению необходимо сделать, чтобы ОС не позволяла этому делать? Вы обеспокоены воздействием ОС на производительность? Что-то другое?

+0

Есть законные причины, чтобы хотеть сделать что-то вроде этого. Например, чтобы получить надежную реакцию в реальном времени от системы. См. Мой ответ ниже. –

+0

Я согласен, что если вам нужен ответ в реальном времени, вам нужно будет отключить Windows (или Linux). Но я бы по-прежнему утверждал, что разумный способ достичь этого - запустить операционную систему реального времени (или исполнительную) между аппаратным обеспечением, а не использовать приложение полностью для HW. Если это то, что происходит после OP, я согласен с тем, что подход RTX является хорошим. (FWIW, годы назад я работал в VenturCom, чья технология теперь входит в RTX IntervalZero ...) –

0

Если вы были коварны и хотели избежать многого домашнего хозяйства, вы, вероятно, могли бы подключиться к рутине водителя. Размышление вслух, граничащее с взломом. Google, как писать корневые наборы.

2

Если вы не против обстрела наличными, вы можете использовать IntervalZero's RTX, чтобы сделать это для системы Windows. Это жесткая подсистема реального времени, которая устанавливается в окне Windows как нечто вроде взлома в HAL и берет на себя машину, позволяя Windows иметь все циклы процессора.

Он имеет свой собственный планировщик и драйвера устройств, но если запустить программу с высшим приоритетом RTX, не устанавливать никаких драйверов устройств RTX (или отключить прерывания для продолжительности), то ничего не прервет его.

Он также поддерживает небольшое взаимодействие с программами на стороне Windows.

Мы используем его как хороший способ получить жесткий ящик реального времени, в котором работает Windows.

2

coLinux загружает CoLinuxDriver в ядро ​​NT или colinux.ko в ядро ​​Linux. Он делает именно то, что вы задали –, он «отлаживает» хост-систему и запускает свой собственный код с собственным управлением памятью, прерываниями и т. Д. Затем, когда это будет сделано, он «перераспределяет» хост-систему, позволяя ей продолжать работу с где он остановился. coLinux использует это для запуска модифицированного ядра Linux параллельно с ОС хоста.

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

 Смежные вопросы

  • Нет связанных вопросов^_^