2016-05-20 3 views
2

Chaque fois que j'essaie d'écrire un pixel dans le LFB du mode VESA, j'obtiens un défaut de page où la page est présente et a été lue. Mon implémentation de pagination provient de la série OS de James Molloy. Je l'ai essayé identité cartographie du LFB comme suit:Défaut de page lors de la tentative d'accès au LFB VESA avec pagination activée

for (unsigned int i = 0xFD000000; i < 0xFE000000; i += 0x1000) { 
    page_t* pg = get_page(i, 1, kernel_directory); 
    alloc_page(pg, 1, 1); 
} 

Ce sont les prototypes de ces fonctions:

page_t* get_page(uint32_t address, int make, page_directory_t* dir); 
void alloc_frame(page_t* page, int is_kernel, int is_writeable); 

Lorsque la pagination est désactivé, je suis capable d'écrire des pixels à la LFB sans problèmes. Suis-je une identité de mappage incorrect du LFB? Y a-t-il autre chose que je dois faire pour l'identifier correctement? Aucune suggestion?

Répondre

0

Lorsque la radiomessagerie est désactivée, votre adresse d'accès est l'adresse physique. Cependant, lorsque la pagination est activée, votre adresse d'accès est virtuelle, vous devez donc d'abord mapper la région d'adresse à laquelle vous accéderez à une région d'adresse physique. Cela peut être mis en œuvre par la fonction remap_pfn_range ou nopage, comme introduit here.

+1

L'afficheur d'origine n'utilise pas Linux, ils créent leur propre OS –

+0

La pagination est un mécanisme du matériel (CPU et MMU), donc quel que soit le système d'exploitation que vous écrivez. Vous devez respecter les règles de pagination définies par le matériel lorsque vous activez son mécanisme de pagination. – Akr

+0

Oui, mais les routines Linux ne l'aideront pas avec le code de [série OS de James Molloy] (http://www.jamesmolloy.co.uk/tutorial_html/) –