L'arrêt de l'ordinateur à l'aide de l'assemblée
Comment puis-je arrêter l'ordinateur en utilisant uniquement du code assembleur?
Ce système d'exploitation?
la question est un peu bizarre, mais je ne sais pas pourquoi les gens sont proches/offensif/bas de vote.
Probablement parce que la seule utilisation de ce sont malveillants. Toujours pas une raison pour fermer, à mon avis. Si vous n'aimez pas cela, il suffit de downvote et de progresser.
Pas nécessairement malveillants; que s'il en a besoin pour arrêter l'ordinateur, après que son programme a terminé? Dire afin de préserver la sécurité de son application et après l'exécution de l'état?
Euh, pourquoi serait-on marquer cette question comme une offense?
la question est un peu bizarre, mais je ne sais pas pourquoi les gens sont proches/offensif/bas de vote.
Probablement parce que la seule utilisation de ce sont malveillants. Toujours pas une raison pour fermer, à mon avis. Si vous n'aimez pas cela, il suffit de downvote et de progresser.
Pas nécessairement malveillants; que s'il en a besoin pour arrêter l'ordinateur, après que son programme a terminé? Dire afin de préserver la sécurité de son application et après l'exécution de l'état?
Euh, pourquoi serait-on marquer cette question comme une offense?
OriginalL'auteur | 2009-03-24
Vous devez vous connecter pour publier un commentaire.
Vous devez dire quel processeur de la famille, il est et quel système d'exploitation que vous utilisez. Aussi quels sont les privilèges votre code est en cours d'exécution en vertu de l' - si c'est le code du noyau, alors il a plus de privilèges que le code de l'utilisateur.
En supposant que vous êtes à l'aide de certains membres de la famille Windows NT (y compris XP ou Vista) sur un processeur Intel x86 famille de PROCESSEUR et de votre code est normal (userspace) du code, alors... vous devez appeler le Windows intégré fonction pour ce faire. Vous ne pouvez pas exécuter de la magie de la séquence d'assemblage.
Même si vous pourrait exécutez simplement la magie de la séquence de l'assemblée, vous ne voulez pas à vous presque certainement envie de donner de l'OS chance d'écrire des données à partir du disque de cache sur le disque, et faire d'autres gracieuse-arrêt des trucs.
Si vous écrivez vos propres OS pour les architectures x86, alors vous avez besoin de regarder l'ACPI (ou APM) specs. Si le code GPL est OK, alors la corporation de noyau Linux routines sont ici (ACPI) et ici (APM).
J'ai ajouté des liens vers le code du noyau de Linux qui arrête le PC. L'APM on appelle juste dans le BIOS. C'est un peu complexe, car Linux est en 32 bits, et que le BIOS est de 16 bits, de sorte qu'il a pour passer à un autre mode CPU.
OriginalL'auteur user9876
C'est le 29 octets programme que j'ai utilisé pour éteindre l'ordinateur en mode ms-DOS depuis des années.
Vous pouvez recherche plus de fonctions avec Ralf Brown Interrompre Liste à DJGPP.
qemu-system-i386
2.0.0 Ubuntu 14.04: github.com/cirosantilli/x86-bare-metal-examples/blob/...Intéressant de noter que cela fonctionne. L'-je trouver de la documentation en ligne pour l'APM interrompre Api suggère que BX == 1 ne fonctionne pas avec CX == 3 pour la fonction 5307h. Voir, par exemple, ici. Je suppose que vous venez de définir BX == 0 et demander au BIOS de s'arrêter lui-même; ce serait prendre l'ensemble du système avec elle.
OriginalL'auteur Synetech
Dans Linux lire redémarrage de l'ordinateur(2).
fichiers sources d'intérêt:
kernel/sys.c kernel/exit.c et arch/x86/kernel/apm.c
pas une réponse complète, mais je pense que c'est un bon début. Je vais lire mon BIOS de la machine code pour voir ce qu'ils font. mais cette partie est spécifique à une machine. maby si vous savez qui IC contol de la puissance de votre carte mère, vous pouvez déterminer qui IO port, d'enregistrer et de commande dont vous avez besoin. puis l'installation de bon conseil/appareils etats et puis le problème de commande pour éteindre l'alimentation.
BIOS gérer l'alimentation via INT 15h ah=53h ( soi-disant Gestion Avancée de l'Alimentation aka APM )
la fonction al=07 utilisé dans Linux est l'ensemble de l'état d'alimentation cmd. paramètres bx=0001h moyenne de tous les appareils et cx=0003k dire stop.
OriginalL'auteur
De arch/x86/kernel/amp.c:
Le code est présent dans apm_32.c. Recherche pour "apm_power_off".
OriginalL'auteur larz
Conversion @larz réponse ci-dessus de msna de l'assemblée se fait comme suit:
Conditions Préalables: Bochs, Msna
Cet exemple a été exécuté sur debian wheezy avec les paquets standard.
Code (nom de fichier: arrêt de l'ordinateur.asm):
Msna compliation:
Bochs fichier de configuration (nom de fichier: .bochsrc) dans le même répertoire que le code (à l'arrêt.asm)
*Remarque, je suis en utilisant la librairie sdl pour bochs qui est un autre paquet de bochs lui-même
Cours de fonctionnement (à partir du même répertoire comme avant):
Sur la touche entrée pour l'arrêt
*Remarque je ne suis pas sûr que toutes les lignes entre l'Arrêt de l'étiquette et WaitForEnter étiquette sont nécessaires
OriginalL'auteur tjb
C'est assez facile. Aussi, les gars, OP pouvez travailler sur son propre gestionnaire d'alimentation. Exactement la même chose que je suis en train de faire.
C'est un exemple qui va permettre à l'utilisateur d'arrêter la machine. Assez simple, il suffit de donne à l'utilisateur une messagebox avec OK et Annuler. Si l'utilisateur clique sur OK, la machine s'arrête, si l'utilisateur clique sur annuler, le programme va juste sortir. Il est testé sur le NT en fonction des versions de windows, et devrait fonctionner sur les versions plus anciennes comme MOI, 95 et 98.
C'est mon propre code, et tout le monde est libre de l'utiliser.
http://pastebin.com/ccw3mWtw
OriginalL'auteur Jennifur_Pawson
Appel de l'API ExitWindowsEx fonction dans kernel32.dll
nope, mais n'hésitez pas à google pour elle!
N'est pas l'OS le lien bibliothèques dynamiques avant le démarrage de votre application?
Vous n'avez pas besoin de charger le kernel32 DLL. Il est mappé dans l'application de l'espace d'adresse au moment du chargement. Vous pouvez les appeler directement les fonctions. Si vous ne voulez charger une DLL dans Windows, il serait assez simple question de l'appel de la
LoadModule
API (exportées à partir de kernel32.dll).OriginalL'auteur Andrew Grant
GRUB
ou ici sur un Github miroir:
https://github.com/dajhorn/grub/blob/trunk/grub/grub-core/commands/acpihalt.c#L303
OriginalL'auteur Janus Troelsen