43 votes

Pourquoi le programme général commencent généralement à 0x8000?

Je ne suis pas de nouvelles de chargeur de démarrage et système de SW, mais je ne sais pas l'origine de la raison pour laquelle le programme général commence à 0x8000. Je connais déjà l'adresse 0x8000 a été utilisé comme adresse de départ dans la normale programme C/C++.

La taille minimale du chargeur de démarrage pour un programme général de prendre jusqu'à 0x8000? Ou est le minimum de la taille du bloc de ROM qui devrait être alloué pour le bootloader de 32 ko? Ou est-il une autre raison?

Je voudrais savoir à ce sujet, historiquement et logiquement, et à partir d'une adresse virtuelle de point de vue.


J'apprécie tous, de votre temps et de votre aide à ce sujet. Pour rendre la question plus clairement, la question est d'adressage virtuel pas avec la physique.

J'ai fondamentalement d'accord avec la R de l'avis de la mémoire physique de l'adresse de point de vue.

Sans dire un système spécifique qui est diversifié, par exemple linux (même sur android), le général RTOS (noyau, et les autres, et surtout le BRAS de linker l'article), elles utilisent l'adresse 0x8000 comme adresse de départ sur le programme en général. de telles nommé comme crt_begin.o, le crt.o, etc situé à 0x0 avec chargeur existent dans ce domaine.

Donc je suppose que la taille minimale du chargeur de démarrage pour le programme général est de 32 ko compte tenu de la taille du bloc si il serait situé à la BootROM en temps de démarrage(démarrage à froid).

Ummm, Mais je ne suis pas sûr...

19voto

R.. Points 93718

En général, sur tous, mais les plus petits systèmes embarqués, la plate-forme ABI concepteur souhaite de ne plus jamais avoir la plus faible adresses en cours d'utilisation, de sorte que le pointeur null déréférence peut être piégé. Le fait d'avoir plusieurs KB jamais les adresses valides vous donne une sécurité supplémentaire si le pointeur null est déréférencé avec un tableau ou une structure membre de décalage, comme en null_ptr->some_member.

6voto

James Kanze Points 96599

Cela dépend du système, et les programmes de démarrage à des adresses différentes les différents systèmes. Sous Unix, il est d'usage (ou peut-être même requis par la Posix) à l'utilisation de l'adresse 0 comme pointeur null, et de ne pas la carte première page de mémoire virtuelle, de sorte que le déréférencement d'un pointeur null résultat d'un segment de la violation. Je soupçonne que d'autres systèmes à l'aide de l'adresse 0 comme un pointeur null comportent de la même façon (mais de combien ils ont de la réserve peut varier). (Historiquement, il est d'usage de carte de la première page en lecture seulement, et le remplir avec des zéros, faire un pointeur null-ci se comporte comme si il s'agissait d'une chaîne vide, un pointeur vers "". Ça remonte à environ 25 ans, cependant.)

Je m'attends à ce que, même aujourd'hui, certains systèmes embarqués faire charger le programme de départ à l'adresse 0.

3voto

Kenneth Waters Points 31

C'est un peu arbitraire, et sur linux, au moins décidé par l'éditeur de liens. L'idée générale est de réserver de l'espace pour attraper pointeur NULL exceptions. Pour aider à prévenir l'espace du noyau de pointeur NULL déréférence de l'exécution arbitraire de code d'utilisateur en mode noyau, linux ne vous empêche de la cartographie du fond de la mémoire. /proc/sys/vm/mmap_min_addr contrôle le plus bas de l'adresse, vous pourrez la carte (vous pouvez le changer à 0 et la carte d'une page à 0 si vous le souhaitez).

Sur linux, vous pouvez regarder le mappage de la mémoire en regardant en /proc. Par exemple,

genwitt ~> cat /proc/self/cartes 
00400000-0040c000 r-xp 00000000 08:01 354804 /bin/cat
0060b000-0060c000 r--p 0000b000 08:01 354804 /bin/cat
0060c000-0060d000 rw-p 0000c000 08:01 354804 /bin/cat
01dda000-01dfb000 rw-p 00000000 00:00 0 [tas]
7f5b25913000-7f5b25a97000 r-xp 00000000 08:01 435953 /lib64/libc-2.14.1.donc
7f5b25a97000-7f5b25c97000 ---p 00184000 08:01 435953 /lib64/libc-2.14.1.donc
7f5b25c97000-7f5b25c9b000 r--p 00184000 08:01 435953 /lib64/libc-2.14.1.donc
7f5b25c9b000-7f5b25c9c000 rw-p 00188000 08:01 435953 /lib64/libc-2.14.1.donc
7f5b25c9c000-7f5b25ca1000 rw-p 00000000 00:00 0 
7f5b25ca1000-7f5b25cc2000 r-xp 00000000 08:01 436061 /lib64/ld-2.14.1.donc
7f5b25cd2000-7f5b25e97000 r-p 00000000 08:01 126248 /usr/lib64/locale/locale-archive
7f5b25e97000-7f5b25e9a000 rw-p 00000000 00:00 0 
7f5b25ec0000-7f5b25ec1000 rw-p 00000000 00:00 0 
7f5b25ec1000-7f5b25ec2000 r--p 00020000 08:01 436061 /lib64/ld-2.14.1.donc
7f5b25ec2000-7f5b25ec3000 rw-p 00021000 08:01 436061 /lib64/ld-2.14.1.donc
7f5b25ec3000-7f5b25ec4000 rw-p 00000000 00:00 0 
7fff18c37000-7fff18c58000 rw-p 00000000 00:00 0 [pile]
7fff18d0c000-7fff18d0d000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]

2voto

Tom St Denis Points 21

J'avais suspect dans beaucoup de cas, la première 32K a été réservé pour les moniteurs du code, de l'utilisation de la ram. Dans beaucoup de 8051 eval commissions qu'il n'était pas rare de défaut pour 0x1000 ou 0x2000 pour toutes les applications en fonction du résident moniteur (certains qui ont travaillé comme des débogueurs trop).

32K pourrait être votre u-boot/etc chargeurs de l'espace.

2voto

Jayesh Badwaik Points 495

Je crois que la réponse est plus liée à la gestion des interruptions. Le gestionnaire d'interruption adresses sont définies dans le matériel. Intel 8086, il y avait une table de traduction sur le gestionnaire d'interruption du code et de la gestion des interruptions de routine. Probablement, cela a été fait par certains combinatoire circuit et, par conséquent, de préserver la compatibilité ascendante, il aurait été plus judicieux de les placer au début de la mémoire plutôt qu'à la fin pour éviter les changements à chaque fois. Donc, le début d'exécution de l'adresse serait à l'autre bout de la mémoire. Aussi, il est nécessaire que le code nécessaire être contenues dans ce bloc à la charge d'un segment de mémoire de programme et d'une instruction de saut pour passer à exécuter le code à partir de cette adresse de code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X