강좌 & 팁
나올듯 나오지 않는 리눅스 3.18 버전이네요
현재 rc7 버전이 릴리즈 되었으니 다음주면 3.18 버전이 나오지 않을까 기대해 봅니다.
최근들어 시스템의 suspend / resume 관련된 작업을 하면서 재미있는 사실을 알게 되었습니다.
arm 의 mmu 를 turn on 시킬때 armv6 까지는 turn on 이전의 pc 카운터 값이 physical 값을 갖게 되는데
mmu turn on 을 하는 순간의 pipe line 안에 해당하는 주소가 들어 있어도 별문제가 없었습니다.
하지만 corex-a8 armv7 부터는 이 부분에서 문제가 되더군요.
즉... mmu 를 켜는 시점에서 pipeline 안에는 물리주소 체계의 pc 값이 들어가 있게 되는데
fetch 단계에서 뿐만 아니라 pipeline 안에 있을때도 fault 가 발생하는 것이죠.
이 경우 시스템은 unknown 상태로 빠지게 됩니다. (네... 디버거 장비로도 정의 되지 않은 상태가 됩니다.)
이 문제를 피하기 위해서 mmu on 시 사용되는 mmu table 의 경우 물리공간에 대한 매핑이 필요하게 됩니다
하지만 시스템이 suspend 이후에 resume 시에 사용되는 mmu table 의 경우
이전에 동작하던 mm table 을 사용하게 되면 매핑 테이블을 변경해야 하는 문제를 만들게 됩니다.
그래서.... arm kernel 에서는 soft-reset 시와 resume 시에는 별도의 mmu table 을 사용하게 되는데
그 이름이 idmap_pgd 라는 녀셕입니다.
idmap_pgd 의 경우 기본 mmu table 에 idmap section 이라는 것을 추가했습니다.
얘는 physical base 주소위치를 mapping 하고 해당 주소공간에 대한 mapping 을 mmu 에 설정하게 합니다.
어쨋건 이렇게 특별하게 만들어진 mmu table 은 resume 직후에 바로 이전 task 에서 사용하던 table 로 교체됩니다.
사실.... 4byte 의 l1 entry 값만 살짝 바꿨다가 복구해주면 되는데...
굉장히 큰 작업을 했더군요...