Je travaille sur le portage du code d'AIX à Linux. Parties du code Utilisez le Lorsqu'un fichier est mappé sur un segment, le fichier est référencé en accédant au segment. Le système de pagination mémoire s'occupe automatiquement des E / S physique. Les références au-delà de la fin du fichier font que le fichier soit étendu aux incréments de la taille de la page. Le fichier ne peut pas être étendu au-delà de la limite de segment suivante. P>
blockQuote>
(un "segment" dans Aix est une partie de l'espace d'adressage de 256 Mo et une "page" est généralement de 4 Ko.) P>
Ce que je voudrais comme em> à faire sous Linux est ce qui suit: p>
Je sais que je peux le faire sous Windows avec le Fonction VirtualProtect , le bit de protection de la mémoire code> Page_GUARD CODE> et a Handler des exceptions structurées . Quelle est la méthode correspondante sur Linux de faire de même? Y a-t-il peut-être un meilleur moyen de mettre en œuvre cette fonctionnalité de prolongation sur Linux? P>
J'ai déjà envisagé: p>
Naturellement, je voudrais le faire avec seulement des modifications minimales au code de l'application. P> shmat () code> appel système
pour créer de nouveaux fichiers. Lorsqu'il est utilisé avec shm_map code> en mode helditable, on peut étendre le fichier au-delà de sa longueur d'origine (de zéro, dans mon cas): p>
mmap () code> avec une taille de grande ish fixe, mais je ne peux pas dire à quel point le fichier a été écrit par le code de l'application li>
MMAP () code> Par lui-même ne semble pas fournir une installation pour étendre la longueur du fichier de support li>
ul>
3 Réponses :
J'ai envisagé des choses similaires moi-même et je n'ai trouvé aucun moyen pour Actuellement, je prévois d'essayer deux alternatives: p>
Honnêtement, je ne pense pas que les fichiers rares fonctionnent, mais ça vaut la peine d'essayer. P> mmap () code> pour étendre le fichier de support. P>
mremap () code> 'ING APRESSE LI>
Allouer un gros tampon mais vous aimez, puis utilisez MProtect () * Call System pour rendre la queue du tampon en lecture seule et enregistrez un gestionnaire de signal pour SIGSEGV pour noter où dans les écrivies précédentes et utilisez MProtect () encore une fois pour activer les écrivies. P>
Ceci est très em> similaire à un devoir je l'ai fait. Fondamentalement, j'avais une liste de "pages" et une liste de "cadres", avec des informations associées. Utilisation de SIGSEGV CODE> J'attrape des défauts et modifierais les bits de protection de la mémoire si nécessaire. Je vais inclure des parties que vous pouvez trouver utiles.
Créer la cartographie. Initialement, il n'a pas d'autorisations. H3>
manutention d'installation h3>
gestionnaire d'exception h3>
Protection croissante H3>
int w_protect_mapping(void *addr, size_t num_pages, w_prot_t protection)
{
int prot;
switch (protection) {
case PROTECTION_NONE:
prot = PROT_NONE;
break;
case PROTECTION_READ:
prot = PROT_READ;
break;
case PROTECTION_WRITE:
prot = PROT_READ | PROT_WRITE;
break;
}
if (mprotect(addr, num_pages * w_get_page_size(), prot) < 0)
return FALSE;
return TRUE;
}
Excellent, merci! C'est une structure très similaire à ce que j'ai fait auparavant sous Windows.