Временно приостановить работу операционной системы ПК - PullRequest
2 голосов
/ 15 июля 2009

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

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

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

Возможно ли это вообще?

Ответы [ 8 ]

14 голосов
/ 15 июля 2009

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

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

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

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

Кроме того, имейте в виду, что, что бы вы ни делали, BIOS системы по-прежнему может вызывать прерывания SMM , которые нельзя отключить, кроме как методами, специфичными для модели материнской платы.

2 голосов
/ 15 июля 2009

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

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

2 голосов
/ 15 июля 2009

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

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

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

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

2 голосов
/ 15 июля 2009

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

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

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

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

1 голос
/ 15 июля 2009

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

0 голосов
/ 15 июля 2009

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

0 голосов
/ 15 июля 2009

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

0 голосов
/ 15 июля 2009

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

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

...