Comment fonctionne le programme? Où les systèmes d'exploitation entrent en jeu?
Un programme est compilé à partir d'une langue à l'ASM --> Code Machine directement exécutable). Quand les gens disent que c'est dépendant de la plate-forme, le moyen que les binaires formés seront à exécuter (correctement) que sur les Processeurs avec le même Jeu d'Instructions de l'Architecture comme x86, x86-64. Il peut (à tort) /ne peut pas (du tout) l'exécuter sur d'autres processus en raison de la différence dans ISA. Droit?
Maintenant, le concept de binaires est source de confusion pour moi. Tout est à propos de la "Machine" Code de Langue" & "CPU". D'où vient l'OS entrent en jeu? Je veux dire que le binaire compilé directement les instructions pour le PROCESSEUR lorsqu'il est chargé dans la mémoire. & PROCESSEUR exécute une instruction à la fois. Je ne pouvais pas voir le rôle de Système d'Exploitation de n'importe où, sauf dans les processus de gestion texte du lien . Il doit être en cours d'exécution sur le PROCESSEUR de même ISA, indépendamment du Système d'Exploitation. droit?
Pourtant, ce n'est pas le cas. Si je construis un code x86 sur une machine windows. Il ne fonctionne pas sur Mac machine x86 ou Linux x86 machine.
Il me manque quelque chose ici. Veuillez effacer ma confusion.
source d'informationauteur claws
Vous devez vous connecter pour publier un commentaire.
Pour commencer, un PROCESSEUR récent a (au moins) deux modes, un mode dans lequel il exécute le noyau du Système d'Exploitation lui-même ("en mode noyau") et un mode dans lequel il est programmes en cours d'exécution ("mode utilisateur"). En mode utilisateur, le PROCESSEUR n'arrive pas à faire un tas de choses.
Par exemple, un clic de souris est généralement remarqué dans le noyau, pas en mode utilisateur. Cependant, les OS, les dépêches de l'événement pour le mode utilisateur et à partir de là vers le bon programme. Dans l'autre sens exige également la coopération: un programme ne peut pas dessiner à l'écran librement, mais doit passer par le système d'exploitation et du mode noyau à attirer de sa part.
De même, la loi du démarrage d'un programme est généralement une coopération. La coque de la partie de l'OS est un programme en mode utilisateur. Il obtient votre clic de souris, et il estime que c'est un clic de souris, à l'intention de lancer un processus. Le shell dit alors à la mode noyau de la partie de l'OS à démarrer un nouveau processus pour que programme de.
Lorsque le mode noyau a besoin pour démarrer un nouveau processus, il alloue de la mémoire pour la comptabilité, et procède ensuite à charger le programme. Cela implique de récupérer les instructions de la binaire, mais également la mise en place du programme de l'OS. Cela nécessite généralement de trouver le point d'entrée (classiquement
int main(int argc, char** argv)
) du binaire, et tous les points où le programme veut appeler l'OS.Différents Systèmes d'Exploitation utilisent différentes méthodes pour raccorder des programmes avec l'OS. En conséquence, le processus de chargement diffère, et les formats de fichier pour les fichiers binaires peuvent différer trop. Il n'est pas absolue; le format ELF pour les fichiers binaires est utilisé pour un certain nombre de Systèmes d'Exploitation, et Microsoft utilise son format PE sur l'ensemble de ses Systèmes d'Exploitation actuels. Dans les deux cas, le format ne décrivent avec précision le format du fichier binaire, de sorte que le système d'exploitation peut décider si le programme peut être relié à l'OS. Par exemple, si c'est un binaire Win32, il sera dans le format PE, donc Linux ne se charge pas, Windows 2000, Windows 7-64. Un Win64 binaire sur l'autre main est dans le format PE trop, mais Windows 2000 de la rejeter.
Il ne fonctionnera pas sur les autres processeurs depuis 01010110011 signifie quelque chose sur x86 et quelque chose d'autre sur les BRAS. x86-64 arrive d'être compatible avec les architectures x86, donc il peut exécuter des programmes x86.
Le binaire est dans un format spécifique que votre système d'exploitation comprend (windows = PE, mac/linux = ELF)
Avec n'importe quel binaire normal, votre système d'exploitation, la charge en mémoire et remplit un certain nombre de domaines avec certaines valeurs. Ces "certaines valeurs" sont adresses aux fonctions de l'api qui existent dans les bibliothèques partagées (dll, donc) comme kernel32 ou de la libc.
L'API adresses sont nécessaires parce que le binaire lui-même ne savez pas comment accéder à des disques durs, les cartes réseau, les manettes de jeu etc. Le programme utilise ces adresses pour appeler certaines fonctions qui existent dans votre système d'exploitation ou dans d'autres bibliothèques.
En essence, le binaire est absent certaines parties vitales qui doivent être remplis par le système d'exploitation pour faire fonctionner le tout. Si le système d'exploitation remplit les mauvaises pièces, le binaire ne fonctionne pas puisqu'ils ne peuvent pas communiquer les uns avec les autres. C'est ce qui se passerait si vous devez remplacer user32.dll avec un autre fichier, ou si vous essayez d'exécuter un exécutable linux sur mac osx.
Alors, comment est-libc savoir comment ouvrir un fichier?
libc utilise des appels, ce qui est faible au niveau de l'accès à l'OS des fonctions de base. C'est un peu comme un appel de fonction, sauf que vous le faire par le remplissage de certains registres du CPU, puis le déclenchement d'une interruption (spécial CPU instruction)
Alors, comment fonctionne l'OS ensuite, savoir comment ouvrir des fichiers?
C'est l'une des choses qu'un OS ne. Mais comment fait-il savoir comment parler à un disque dur?
Je ne sais pas exactement comment ça fonctionne, mais j'imagine que le système d'exploitation n'cela par l'écriture/la lecture de certains emplacements de mémoire qui se trouvent être mappés à des fonctions BIOS.
Donc comment le BIOS de savoir comment parler à un disque dur?
Je ne sais pas qui soit, je n'ai jamais fait de programmation à ce niveau. J'imagine que le BIOS est branché directement sur les connecteurs de disque dur et est capable d'envoyer la bonne séquence de 1 et de 0 à parler "SATA" avec le disque dur. Il peut probablement dire des choses simples telles que "lire ce secteur"
Donc comment le disque dur de savoir comment faire pour lire un secteur?
Je ne sais vraiment pas ce à tous donc je vais laisser un peu de matériel gars continuer.
Deux façons:
D'abord et avant tout la réponse est "appels système". Chaque fois que vous appelez une fonction qui doit faire toutes les I/O, interagir avec les périphériques, allouer de la mémoire, de la fourche processus, etc., cette fonction a besoin de faire un "appel système". Alors que le syscall instruction lui-même fait partie de X86, les appels système et les paramètres sont spécifiques aux systèmes d'exploitation.
Même si votre programme n'a pas de système d'appels (dont je ne suis pas sûr, c'est possible, et certainement ne serait pas très utile) les formats qui s'enroulent autour de la machine de code sont différentes pour les différents Systèmes d'exploitation. Si les formats de fichier exe (PE) et un exécutable linux (ELF en général) sont différents, c'est pourquoi un fichier exe de ne pas exécuter sur Linux.
EDIT: ce sont des détails de bas niveau. La réponse est-à-dire que tout ce qui a besoin d'accéder à des fichiers, la console/GUI, allouer de la mémoire, etc. est OS.
Les OS entre en jeu lorsque vous essayez d'accéder à un "service", dont les résumés pour vous au niveau du matériel, par exemple ouvrir un fichier à l'intérieur de la "base de données" appelé système de fichiers, générer un nombre aléatoire (tous les OS modernes dispose de cette fonctionnalité).
Sous GNU/Linux par exemple, vous devez remplir les registres et appeler int 80h pour accéder à un "service" (en fait appelé "syscall").
Votre programme ne fonctionnera pas sur un autre OS aussi parce qu'il y a différents formats de fichier pour les fichiers exécutables, par exemple Gagner a COFF/PE, Linux a de l'ELFE format de fichier (juste comme n'importe quel autre format de fichier, il contient également des "méta-données", par exemple, le code HTML (ou SGML) format de fichier).
Le système d'exploitation (a) l'environnement de votre machine code s'exécute, et (b) des services standard. Sans (a), votre code ne sera jamais à exécuter en premier lieu, et sans (b), pour la mise en œuvre absolument tout ce que vous-même et de frapper directement au matériel.
La machine instructions générées par un langage de haut niveau sera appropriée pour les conventions d'appel pour les bibliothèques de la prestation de ces appels que vous faites, y compris tous appels système (bien que ces sont généralement emballés dans un espace utilisateur de la bibliothèque de quelque part, donc des détails sur la façon de faire un appel système pourrait ne pas être nécessaire).
En outre, il sera utile que pour la cible de l'instruction set architecture), à quelques exceptions près (les soins doivent être prises pour exemple, sur des hypothèses concernant le pointeur de tailles, de types primitifs, la structure de mises en page, les implémentations de la classe en C++, etc.).
Le format de fichier dictent la nécessaire crochets/publiquement visible de fonctions et de données afin de permettre au système d'exploitation pour exécuter votre code comme un processus, et pour amorcer le processus de l'état requis. Si vous êtes familier avec le développement en C/C++ sous Windows, la notion de sous-système détermine le niveau de l'amorçage, les ressources fournies, et le point d'entrée de la signature (normalement
main(int, char **)
sur la plupart des systèmes).Il y a quelques bons exemples de la façon dont les choix de langage de haut niveau, l'instruction set architecture), et le fichier exécutable format peut affecter la capacité d'exécuter un binaire sur un système donné:
Assemblée langues de code spécifiques de l'ISA. Ils ont des instructions d'utilisation spécifiques à une famille de types de processeurs. Ces instructions peuvent travailler sur d'autres familles de Processeurs, si ces Processeurs intègrent le jeu d'instructions. Par exemple x86 code du travail à un certain degré, sur un amd64 système d'exploitation, et certainement travailler sur un amd64 PROCESSEUR exécutant un système d'exploitation x86.
C résumés la plupart des spécificités de l'ISA. Quelques exceptions évidentes comprennent pointeur de tailles et de stockage. Divers bien connu des interfaces, sera fournie à un niveau prévu par la libc, comme
printf
main
fopen
et d'autres. Ces la vous inscrire et d'empiler les états afin de faire ces appels, l'activation de code C pour travailler sur différents systèmes d'exploitation et architectures sans changement. D'autres interfaces peuvent être fournis, soit directement, soit en l'enveloppant d'une plate-forme spécifique dans l'interface attendue pour augmenter la portabilité d'un code C.Python, et d'autres semblables "virtualisé" langues de fonctionner à un niveau d'abstraction, et de nouveau avec quelques exceptions, par exemple toutes les fonctionnalités qui n'existent pas sur des plates-formes particulières, ou de codage de caractères différences, peut exécuter sans modification sur de nombreux systèmes. Ceci est réalisé en fournissant une interface uniforme pour beaucoup de différents ISA et le système d'exploitation combinaisons, au détriment de la performance et de la taille de l'exécutable.
Le système d'exploitation fournit les outils et API pour l'accès à certaines fonctionnalités et le matériel.
Par exemple pour créer une fenêtre sur Microsoft Windows, vous avez besoin de l'OS de la DLL pour créer la fenêtre.
Sauf si vous souhaitez écrire l'API vous-même, vous allez utiliser l'API de l'OS. C'est là que l'OS entrent en jeu.
Aussi je veux ajouter que l'OS gère le démarrage du programme.
Il prépare les processus de l'espace et l'initialise, de sorte que le programme peut commencer, les charges les instructions du programme et donne le contrôle au programme.
Une analogie:
Dire que vous embaucher un majordome à partir d'un autre pays. Il ne comprend pas un mot que vous dire, si vous obtenez un star-trek-comme traducteur de l'appareil. Maintenant, il peut comprendre votre langage de haut niveau, parce que quand vous parlez, il entend son propre (plutôt rudimentaire) langue.
Maintenant, supposons que vous souhaitez lui rendre de A à B. Vous ne parlerait pas de ses jambes ou les pieds directement, vous devez vous demander lui de son visage! Il est en contrôle de son propre corps. Si 1) vous communiquer votre demande correctement et 2) il décide qu'il relève de ses fonctions, il se déplace d'Un point a à B.
Maintenant, vous obtenez un nouveau serviteur, dans le même pays que le dernier (parce que vous préférez ne pas acheter une nouvelle star-trek-traducteur). Vous voulez lui de marcher d'Un point a à B ainsi. Mais ce serviteur vous oblige à parler plus fort et dire s'il vous plaît tout en demandant. Vous mettre en place avec cela, car il est plus souple: vous pouvez lui demander d'aller de A à B via C si vous voulez--le précédent butler pourrait le faire, mais a traîné ses pieds et se plaint.
Une autre chance, vous pouvez ajuster votre traducteur paramètres pour gérer cela, alors, à partir de la langue de votre point de vue, rien ne change. Mais si vous deviez parler à l'ancien majordome avec les nouveaux paramètres, il serait confus et de ne pas comprendre, même si vous êtes parlant sa langue.
Dans le cas où il n'est pas clair, les majordomes sont des ordinateurs avec la même administration, mais différents systèmes d'exploitation. Le traducteur est le cross-compilateur de la chaîne d'ciblage de leurs ISA.