2016-04-15 7 views
3

Ich versuche zu verstehen, wie Vektoren Seite auf 0xffff0000. zugeordnet ist Ich verweise 3,14 Kernel.Vektoren Seitenzuordnung in Linux für ARM

Gemäß dem Kommentar in early_trap_init()traps.c die Vektoren von Entry-armv.S auf Vektor-Seite kopiert werden.

Es scheint early_trap_init() heißt von devicemaps_init()mmu.c.

Vor dem Aufruf early_trap_init(), erstellt es Vektoren Seite mit early_alloc() und ich konnte keine Zuordnung hier sehen.

Können Sie bitte helfen, zu verstehen, wie Vektoren Seite Mapping getan wird?

Antwort

2

Die Antwort ist in Ihrer devicemaps_init() Verbindung (über Linie 1250 in 3.14).

 /* 
     * Create a mapping for the machine vectors at the high-vectors 
     * location (0xffff0000). If we aren't using high-vectors, also 
     * create a mapping at the low-vectors virtual address. 
     */ 
    map.pfn = __phys_to_pfn(virt_to_phys(vectors)); 
    map.virtual = 0xffff0000; 
    map.length = PAGE_SIZE; 
#ifdef CONFIG_KUSER_HELPERS 
    map.type = MT_HIGH_VECTORS; 
#else 
    map.type = MT_LOW_VECTORS; 
#endif 
    create_mapping(&map); 

Dort ist zusätzlicher Code vorhanden, um weitere Zuordnungen vorzunehmen. Beachten Sie, dass es die physische Vektoranweisung plus code to transition modes gibt. Dies geschieht über das Assembler-Makro vector_stub. Eine Erklärung in den Kommentaren ist sehr gut (siehe auch den 2. verwandten Link).

 
    Vector stubs. 

    This code is copied to 0xffff1000 so we can use branches in the 
    vectors, rather than ldr's. Note that this code must not exceed 
    a page size. 

    Common stub entry macro: 
    Enter in IRQ mode, spsr = SVC/USR CPSR, lr = SVC/USR PC 

    SP points to a minimal amount of processor-private memory, the address 
    of which is copied into r0 for the mode specific abort handler. 

so können wir Verzweigungen in den Vektoren verwenden bedeutet die erste Instruktion in der Vektortabelle.

Verwandte: Find the physical address of exception vector table
                              Linux kernel arm exception stack init

+0

ich in Annahme war, dass "zunächst wird Speicher für Vektor-Seite erstellt wird (mit physikalischer Adresse) und Karte an die virtuelle Adresse 0xffff0000 werden dann die Vektoren auf die Vektorseite kopiert ", aber nach dem Anzeigen der Antwort wird der erste Speicher für die Vektorseite erstellt (unter Verwendung von ea rly_alloc(), es gibt die virtuelle Adresse zurück), kopierte Vektoren durch Aufruf von early_trap_init() und danach wird das Mapping für 0xffff0000 für die Vektorseite durchgeführt. Mein Zweifel hier ist, zwei virtuelle Mappings sind für Vektor-Seite passiert? (1. virtuelle Adresse wird von early_alloc() zurückgegeben und 2. macht explizite Zuordnung wie in der obigen Antwort gezeigt). – user3693586

+0

Ja, es gibt mehrere Zuordnungen. Das ist gut? Einige sind lesen/schreiben und andere sind schreibgeschützt. Einige sind für den Benutzerraum zugänglich, andere nicht. * Ich versuche zu verstehen, wie Vektoren Seite auf 0xffff0000 zugeordnet ist. * Ist eine Frage, die ich beantwortete. Du hast nie etwas über einen * Zweifel * über zwei Abbildungen gesagt. –

+0

Anfänglich sind meine Zweifel über Vektorseiten-Mapping, nachdem ich die Antwort gesehen habe, habe ich Zweifel über zwei virtuelle Mappings für Vektor-Seite. – user3693586