当前位置:网站首页>Réponses aux devoirs du csapp 7 8 9

Réponses aux devoirs du csapp 7 8 9

2022-07-06 14:59:00 Wuhu Han Jinlun

Les réponses sont fournies à titre d'information seulement

7.12

L'idée de résoudre le problème est d'imiter le comportement du Linker:Utilisez l'enregistrement de repositionnement pour identifier l'emplacement et utilisez la figure7.9L'algorithme dans calcule l'adresse absolue du repositionnement,Ou simplement à partir du graphique7.10Extrait des instructions de repositionnement dans.Deux points méritent d'être notés:8D'accord.movlLa directive contient deux références à repositionner.No5Lignes et paragraphes8L'instruction pour la ligne contient une pairebuf[1]Références,La valeur initiale estOx4,L'adresse déplacée est calculée comme suit:ADDR(buf) +4.

  • Le premier repositionnement estmov 0x0,%edx,Correspond à la figure7-10Dans15D'accord,Oui.swap.oLe décalage moyen est3-6Dans la position de0x0Réinitialiser l'adresse réelle au moment de l'exécution0x80483c8+3=0x80483cb,Sa valeur est0x804945c
  • Le deuxième repositionnement estmov 0x4,%eax,Dans le graphique16D'accord,Oui.swap.oLe décalage moyen est8-bEn position0x4Repositionnement et adresse réelle au moment de l'exécution0x80483c8+8=0x80483d0,Sa valeur est0x8049458
  • Troisième et quatrième repositionnements àmovl $0x4,0x0,Correspond à la figure7-10De18D'accord,Oui.swap.oLe décalage moyen est10-13De0x0Et offset est14-17De0x4Réinitialiser à l'exécution0x80483c8+10=0x80483d8Et0x80483c8+14=0x80483dc,Et vamovl $0x4,0x0Modifier comme suit:movl $0x8049458,0x8049548
  • Le cinquième repositionnement est mov 0x0,%eax,Dans la figure7-10De23D'accord, Le décalage est 1f-22De0x0 Repositionnement à l'adresse 0x80483c8+1f=0x80483e7Valeur sur0x8049548

Les résultats sont présentés dans le tableau ci - dessous.:

Fig.7-10Numéro de ligne dansAdresseValeur
150x80483cb0x004945c
160x80483d00x0049458
180x80483d80x0049548
180x80483dc0x0049458
230x80483e70x0049548

7.13

A

In.text Décalage de la Section pour 12 Fonction appelée à , À la section offset est 19 Un transfert de valeur s'est produit à ,Et la valeur est0x0, Pour être repositionné .Unionc Le Code s'appelle ici p3() La valeur de retour de edxDans le registre,Et puis*xpAjouter, Et puis à l'offset 21 Fonction de génération de position pour p2()Appel de. Donc les décalages de noeuds pour les trois repositionnements sont respectivement 12,19,21, Pour la directive call 12<p1+0xa>、Directivesmov 0x0,%eaxEt les directivescall 21<p1+0x19>Effectuer un repositionnement. Ou directementobjdump Le démontage donne le même résultat .

Les résultats sont présentés dans le tableau ci - dessous.:

Décalage de section Type de repositionnementNom du symbole
0x12R_386_PC32(Références relatives)p3
0x19R_386_32(Références absolues)xp
0x21R_386_PC32(Références relatives)p2

B

.data Modifié dans la section xpValeur de, Repositionnement à xAdresse.Alors... .data Le noeud n'est repositionné qu'une seule fois , Section offset to 0x4, Le type de repositionnement est la référence absolue de repositionnement , Le nom du symbole est xp.

Décalage de section Type de repositionnementNom du symbole
0x4R_386_32(Références absolues)xp

8.23

Le processus parent reçoit et capture le premier signal , Pendant que le processeur traite encore le premier signal , Un second signal est ajouté à l'ensemble à traiter , Il n'est pas encore reçu s'il est bloqué par le gestionnaire , Quand le troisième signal arrive , Comme le type est le même que le deuxième signal, il est rejeté ,No4、5 Il en va de même pour les signaux . Quand le premier signal aura été traité , Le noyau a remarqué un autre signal en attente (Signal2) Force le processus parent à accepter , Puis exécutez le processus , Après le deuxième traitement , Il n'y a plus de signal à traiter ,C'est fini.. Donc seulement deux signaux seront reçus et traités ,counter Ça ne vaut que 2,Au lieu de5.

8.24

L'exigence du titre est d'écrire des segments de texte en lecture seule dans un sous - processus , Cela peut entraîner une erreur de segment , Donc la deuxième exigence est de sortir une erreur de segment . Pour déterminer la fin anormale, on peut utiliser WIFSIGNALEDPour juger,Si non0 Une terminaison anormale s'est produite ,Le Code modifié est le suivant::

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#define N 2
 
int main()
{
    
	int status,i;
	pid_t pid;
	for(i = 0;i < N;i++)
		if((pid = fork()) == 0)
		{
    
			int *pt = 0x0;
			*pt = 15213;
			exit(100+i);
		}		
	while((pid = waitpid(-1,&status,0)) > 0)
	{
    
		if(WIFEXITED(status))
			printf("child %d terminated normally with exit status = %d\n",pid,WEXITSTATUS(status));
		else if(WIFSIGNALED(status))
		{
    
			fprintf(stderr,"child %d terminated by signal %d",pid,WTERMSIG(status));
			psignal(WTERMSIG(status)," ");
		}
		else
			printf("child %d terminated abnormally\n",pid);
	}
	if(errno != ECHILD)
		printf("waitpid error\n");
	exit(0);
}

Les résultats sont les suivants:

Insérer la description de l'image ici

9.11

A. L'adresse virtuelle est0x027c,Convertir en binaire:00 0010 0111 1100

131211109876543210
00001001111100

B .Selon9.6.4L'hypothèse de la section,VPOPour l'adresse0Bit to5Bits,Ce titre est111100,VPNPour6Bit to13Bits,Ce titre est00001001,C'est - à - dire:0x9,TLBI- Oui.6-7Bitwise0x1,TLBTPour8-13Bitwise0x2. Consultez le tableau pour les bits d'index 0x1、Tag bit is0x2,Raté.,MMU Besoin de PTERetirerPPN, Obtenir un PPNPour0x17, Il n'y a pas de page manquante .

Le tableau complet est :

ParamètresValeur
VPN0x9
TLBIndex0x1
TLBMarquage0x2
TLBHit?(- Oui./Non)Non
Pages manquantes?(- Oui./Province)Non
PPN0x17

C. Numéro de cadre de la page physique à obtenir 0x17( 01 0111 ) Avant d'être l'adresse physique réelle 6Bits, Le décalage est constant ,Toujours.VPO( 11 1100 ),Obtenir l'adresse physique finale: 0101 1111 1100

11109876543210
010111111100

D. L'adresse physique 6-11Bitwise010111En tant queCT,Sa valeur est0x17,2-5Bitwise1111En tant queCISa valeur est0xf,0-1 Bits offset as Block COLa valeur est:0x0. Trouver un bit d'index dans le cache 0xfGroupe、Tag bit0x17Oui.、Offset as0x0Octets de, Comme le montre la table cache 0xf Aucun groupe pour 0x17 Lignes marquées , C'est pour ça que , Aucun octet retourné . Les résultats sont présentés dans le tableau ci - dessous.:

ParamètresValeur
Byte offset0x0
Index de cache0xf
Jetons de cache0x17
Cache hit?(- Oui./Non)Non
Octets de cache retournés -

9.12

A.L'adresse virtuelle est0x03a9,Son binaire est00 0011 1010 1001

131211109876543210
00001110101001

B. Selon9.6.4L'hypothèse de la section,VPOPour l'adresse0Bit to5Bits,Ce titre est101001,VPNPour6Bit to13Bits,Ce titre est0000 1110,C'est - à - dire:0xe,TLBI- Oui.6-7Bitwise0x2,TLBTPour8-13Bitwise0x3. Consultez le tableau pour les bits d'index 0x2、Tag bit is0x3, Parce que les bits valides sont 0Raté.,MMU Besoin de PTERetirerPPN, Obtenir un PPNPour0x11, Il n'y a pas de page manquante .
Le tableau complet est :

ParamètresValeur
VPN0xe
TLBIndex0x2
TLBMarquage0x3
TLBHit?(- Oui./Non)Non
Pages manquantes?(- Oui./Province)Non
PPN0x11

C. Numéro de cadre de la page physique à obtenir 0x11( 01 0001) Avant d'être l'adresse physique réelle 6Bits, Le décalage est constant ,Toujours.VPO( 10 1001 ),Obtenir l'adresse physique finale: 0100 0110 1001

11109876543210
010001101001

D: L'adresse physique 6-11Bitwise010001En tant queCT,Sa valeur est0x11,2-5Bitwise1010En tant queCISa valeur est0xa,0-1 Bits offset as Block COLa valeur est:0x1. Trouver un bit d'index dans le cache 0xaGroupe、Tag bit0x11Oui.、Offset as0x1Octets de, Comme le montre la table cache 0xa Aucun groupe pour 0x11 Lignes marquées , C'est pour ça que , Aucun octet retourné .

Formulaire complet :

ParamètresValeur
Byte offset0x1
Index de cache0xa
Jetons de cache0x11
Cache hit?(- Oui./Non)Non
Octets de cache retournés -

9.13

A.L'adresse virtuelle est0x0040,Son binaire est00 0000 0100 0000

131211109876543210
00000001000000

B. Selon9.6.4L'hypothèse de la section,VPOPour l'adresse0Bit to5Bits,Ce titre est000000,,VPNPour6Bit to13Bits,Ce titre est0000 0001,C'est - à - dire:0x1,TLBI- Oui.6-7Bitwise0x1,TLBTPour8-13Bitwise0x0. QuandVPN=1Heure,Le BIT valide est0,PPNAucune. Donc il n'y a pas d'adresse physique . Il manque des pages .

ParamètresValeur
VPN0x1
TLBIndex0x1
TLBMarquage0x0
TLBHit?(- Oui./Non)Non
Pages manquantes?(- Oui./Province)- Oui.
PPN0x11

C.Pages manquantes

D.Pages manquantes

9.14

Les codes sont les suivants:

#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <sys/mman.h> 
#include <fcntl.h> 
int main(int argc, char const *argv[])  
{
      
    int fd;  
    if ((fd = open("hello.txt", O_RDWR)) == -1) {
    
        perror("Failed to open hello.txt");  
        exit(EXIT_FAILURE);  
    }  
    struct stat stat_of_file;  
    if (fstat(fd, &stat_of_file) == -1) {
     
        perror("Failed to get stat of hello.txt");  
        exit(EXIT_FAILURE);  
    }    
    char *p;  
    if ((p = mmap(NULL, stat_of_file.st_size, PROT_WRITE, MAP_SHARED, fd, 0)) == (void *)-1) {
    
        perror("Failed to mmap");  
        exit(EXIT_FAILURE);  
    }  
    p[0] = 'J';  
    munmap(p, stat_of_file.st_size);
    close(fd);
    return 0;  
}

Résultats des opérations:
Insérer la description de l'image ici

原网站

版权声明
本文为[Wuhu Han Jinlun]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/187/202207060919098469.html