2017-01-15 2 views
1

J'essaie d'appeler la fonction BootServices->GetMemoryMap(), mais la définition de la fonction et la documentation n'ont aucun sens pour moi. La spécification UEFI (v2.6) dit que la définition de la fonction est (page: 207):Confusion de documentation pour BootServices UEFI-> GetMemoryMap()

typedef EFI_STATUS(EFIAPI *EFI_GET_MEMORY_MAP)(IN OUT UINTN *MemoryMapSize, IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap, OUT UINTN *MapKey, OUT UINTN *DescriptorSize, OUT UINT32 *DescriptorVersion); 

Mais la section Paramètres dit:

MemoryMap: Un pointeur vers la mémoire tampon dans lequel le firmware place la carte mémoire actuelle . La carte est un tableau de EFI_MEMORY_DESCRIPTORs.

Si la carte mémoire est un tableau de EFI_MEMORY_DESCRIPTOR s et le paramètre est censé être un pointeur vers un tampon, comment le type du paramètre est IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap, devrait-il pas IN OUT EFI_MEMORY_DESCRIPTOR **MemoryMap?

+0

Il est écrit "Un pointeur vers le tampon dans lequel le micrologiciel place la carte mémoire en cours." Un tableau est un pointeur vers un tampon. Peut-être interpréter comme ceci, 'Un pointeur vers le tampon (première adresse de mémoire du tampon) dans lequel ...' '** MemoryMap' serait l'adresse d'encore une autre adresse qui est l'imitation du tampon. Ce serait donc un pointeur vers un pointeur. –

+0

Cela dépend de la signification de l'auteur du mot tampon. En fonction, il s'agirait d'une adresse mais, en termes courants, ce serait toute la zone d'adresse qui constituerait le tampon. Dans le dernier, il semble qu'il n'y ait pas de contradiction, donc soit il y a une erreur, soit le contexte révèle qu'il ne se réfère pas à la définition fonctionnelle exacte du tampon. –

+0

@marshalcraft: Merci, j'ai compris. Il semble un peu étrange qu'ils le fassent. – nom

Répondre

1

La carte est un tableau de EFI_MEMORY_DESCRIPTORs.

Si la carte est un tableau de EFI_MEMORY_DESCRIPTOR s alors le nom du tableau désintègre à un pointeur vers le premier élément de ce tableau, à savoir la

EFI_MEMORY_DESCRIPTOR *MemoryMap 

Alors, étant donné la fonction

EFI_STATUS efi_get_memorymap(IN OUT UINTN *MemoryMapSize, 
          IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap, ...); 

et une carte de descripteurs

EFI_MEMORY_DESCRIPTOR memory_map[2]; 

vous pouvez passer le tableau de cette façon:

status = efi_get_memorymap(size, memory_map, ...); 
+0

Alors comment déclarer une variable pour stocker le tableau? En ce moment je le fais comme 'EFI_MEMORY_DESCRIPTOR memoryMap;' et en appelant la fonction comme 'systemTableLocal.BootServices-> GetMemoryMap (& mapSize, & memoryMap, & mapKey, & descriptiorSize, & descriptiorVersion);'. – nom

+0

Oh, je l'ai maintenant. – nom

+0

Vous devez transmettre tableau par nom pas une adresse de nom. – 4pie0