2014-11-13 11 views
0

Microblaze에서 실제로 TLB를 설정하고 C_USE_MMU3으로 설정하려고합니다.Microblaze에서 부팅 할 때 MMU/TLB에 액세스

이 내 부팅 코드 :

.global _start 
    .section .vectors.reset, "ax" 
    .align 2 
    .ent _start 
    .type _start, @function 

_start: 
    brai _actualstart 
    .end _start 

.... 

    .section .text 
    .global _actualstart 
    .align 4 
    .ent _actualstart 
    .type _actualstart, @function 

_actualstart: 
    mfs r1, rmsr 
    nop 
    ori r1, r1, 0x00040000 
    mts rmsr, r1 
    nop 

    addik r3, r0, 0x3F /* Microblaze TLB has 64 entries */ 
_zeroouttlb: 
    mts rtlbx, r3 
    mts rtlbhi, r0 
    mts rtlblo, r0 
    bgtid r3, _zeroouttlb /* Uses delay slot */ 
    addik r3, r3, -1 

r10x00040000 업데이트 아래 라인은 사용자가 예상하는대로 :

mts rmsr, r1 

:

ori r1, r1, 0x00040000 

을하지만, 다음 줄에 msr의 값은 변경되지 않으므로 코드 goe 실패 위하여 s의 것은 다음과 함께

mts rtlbhi, r0 

:

Fatal (MB_TLB) Attempting Write to TLBHI when no MMU available 

(msr 업데이트되지 않았기 때문에 여전히 0x00000000 그래서, 상기 프로세서는 가능한 MMU 지원이없는 평가하는 정확한 판독).

내 코드가 msr으로 업데이트되지 않는 이유는 무엇입니까?

+0

시뮬레이터와 같은 소리는 단순히 MMU를 에뮬레이션하지 않습니다. 따라서 MSR 비트는 변경할 수 없습니다. –

+0

시뮬레이터가 MMU AIUI – adrianmcmenamin

답변

1

문제는 잘못된 비트를 설정하고 있다는 것입니다. BigEndian 아키텍처를 설명하는 많은 참조 가이드는 비트 # 31이 2^0이고 비트 # 0이 2^31이라고 가정합니다. MicroBlaze 매뉴얼은이 혼란스러운 표기법을 사용하는 매뉴얼 중 하나입니다.

비트 VM (BigEndian 비트 18)을 설정하려면 msr0x00002000 또는 1 << (31-18)으로 설정해야합니다.

ori r1, r1, 0x00002000 
mts rmsr, r1 
nop 

이 모든 일을해야한다 :

그래서 기본적으로 라인을 변경.

+0

과 함께 Linux를 실행할 수 있다고 생각하지 마십시오. 나중에 테스트하겠습니다.하지만 확실히 어셈블러가 비트 순서를 뒤집 지 않는 한 big endian에 비트 13을 설정하고 있습니다. 나는 조금 혼란 스럽다. – adrianmcmenamin

+0

아, 나는 네가 무엇을 의미 하는지를 안다. 그것은 꽤 도움이되지 않습니다. – adrianmcmenamin

+1

예, 불행히도 많은 BigEndian 문서는 [Wikipedia] (http://en.wikipedia.org/wiki/IPv4#Header)에서도 TCP/IP 헤더를 포함하여 역순으로 비트를 매기는 경향이 있습니다. 이 전통은 정말 실망스럽고 많은 혼란을 가져옵니다. 말할 필요도없이 MicroBlaze를 LittleEndian으로 전환하면이 비트는 '0x00002000'과 동일하게 유지됩니다. 그것은 단지 문서 일뿐입니다. – dkz