안녕하세요~ 

6/29 일날 스터디에서 ARM 어셈블러 코드를 보면서 실제로 시뮬레이션 해보는 방법에대해 이야기가 나왔었는데요

저는 IAR 컴파일러를 이용해서 한번 어셈코드를 돌려봤습니다. 확실히 코드만 보면서 하는것보다 훨씬 이해가 빠른 것 같습니다. 


앞으로 어셈블리 코드 분석을 할때 일일히 계산하지 말고 코드의 일부분을 넣고 돌려보면서 확인하면 

좀 더 원할한 스터디가 될것 같습니다.  분석한 내용을 정리해서 올려봤습니다. 

근데  RAM 영역을 설정할때 아래 구문같이 왜 18 Bit 를 쉬프트하는 건지 아직도 모르겠습니다. 아시는 분 있으면 

가르켜 주세요ㅜㅜ 

 

이해 안되는 구문!!(__setup_mmu: 구문중)

 mov r9,r0,lsr #18

 mov r9,r9,lsl #18




http://supp.iar.com/Download/SW/?item=EWARM-EVAL

IAR Embedded Workbench for ARM (평가판)받으셔서 설치하시면 됩니다. 

설치하고 평가판 License 등록시에 개인 정보등록하실때 두가지를 선택하실 수 있는데요

날짜 제한, 용량 제한(32K byte) 중 용량 제한 선택하시면 됩니다.


설치후 실행사신다음 file >> new >> workspace 만드신다음 project >> create new project 하시구 asm 파일 선택하시구

ok 하신다음 프로젝트 파일 저장해주시면 그림과 같이 자동으로 asm.s 파일을 생성해주는데요



asm.JPG


다음 project  >> option 들어가셔서 general option 에서 core 를 A-15 선택하신다음 , debugger 에서 드라이버가 simulator 인지 확인해주시면 됩니다.  메이크 하시구 디버깅 버튼 눌러주셔서  디버깅 화면을 띄운 다음 view >> register 선택하시면 아래 그림과

같이 레지스터 값도 같이 보실 수 있습니다.  (R0 ~ R14, R15(pc) , CPSR, SPSR, CP15,14 등) 

제일 왼쪽은 어셈블리 코드, 중앙은 Disassembly 창 , 가장 오른쪽은 레지스터 창입니다.


디버깅창.JPG


head.S 에서 setup_mmu 일부분만 넣어서 돌려보는식으로 돌려보았습니다.  자동생성된 asm.s 메인 밑에 아래와 같이 코드를 

추가했습니다 . gas 문법이랑 약간 차이도 있구  아직 어셈블리 문법이 익숙치 않아서 에러가 많이 나서 시간 많이 걸렸어요 ㅜㅜ


  NAME    main                                                                        

 

        PUBLIC  __iar_program_start

        

        SECTION .intvec : CODE (2)

        CODE32

       

       


__iar_program_start

        B       main


        

        SECTION .text : CODE (2)

        CODE32

        

main    NOP

        ldr r4,R4_init    ; 실제 커널 소스코드로 진입하기전에

        mov r6,#0x0c  ; 필요한 레지스터값 초기화 

 

        ;  시작 (실제 커널 어셈블리 코드)

        sub r3,r4,#16384      

        bic r3,r3,#0xff

        bic r3,r3,#0x3f00             ; (1)

        


        mov r0,r3

        mov r9,r0,lsr #18

        mov r9,r9,lsl #18

        add r10,r9, #0x10000000

        mov r1,#0x12

        orr r1,r1, #3 << 10

        add r2,r3, #16384            ;(2)




label1:      

       cmp r1,r9

       cmphs r10,r1

       bic r1, r1, #0x1c

       orrlo r1,r1,#0x10

       orrhs r1,r1,r6

       str r1, [r0],#4

       add r1,r1,#1048576

       teq r0,r2

       bne label1                          ;(3)

       ; 여기까지 돌려봤어요

       

       b main         

       DATA       

R4_init: DC32 0x50008000


       END

 

       

실제 커널 코드 부분돌리기전에 레지스터 R4 에다 zImage 압축이 풀릴 영역주소로 0x50008000을 입력해주고 

R6 에는 0x0c(cacheable, bufferable 값설정을 위한 값) 를 넣어주는 코드를 추가했습니다. 

(1) 까지 실행후에 레지스터 창을 통해 R3 에 페이지 디렉토리 시작주소 , R4에 zImage 압축이 풀릴 시작주소가 

R6에는 0x0c(c=1,b=1)값이 들어간 것을 확인할 수 있었습니다.


레지스터1.JPG  ==> (1)까지 실행후 레지스터 값



(2)까지 실행하면  레지스터 값은 다음과 같습니다.

그림1.png


다음 label1 으로 표시된 영역을 돌면서 페이지 디렉토리를 초기화 하는 구문 입니다. 첫번째 루프를 돌리면서 레지스터 값의 

변화를 확인해 보았습니다.  


cmp r1,r9 (실제동작 r9 - r1)  결과가 음수이므로 CPSR 레지스터의 N=0 에서 N=1로 변경되었습니다.  

다음 cmphs 는  CPSR 의  C(carry) 비트가 1이여야 실행되므로 cmphs r10,r1을 실행하지 않고 

다음 bic r1, r1, #0x1c을 실행하여 R1 의 값이 0x00000c12 ==> 0x00000c02 변경 


그림2.png


orrlo 는 C == 0 , orrhs 는 C == 1일때 실행되므로 orrlo r1,r1, #0x10 만 실행하여  R1 = 0x00000c12 

다음  str r1, [r0],#4 를 수행 R1의 값을 R0이 가르키는 주소에다 넣어주고 R0 + 4(주소값을 4byte만큼 증가)


그림3.png


다음 teq r0,r2 에서 teq 명령은 두 레지스터의 값이 같다면 Z=1, 다르다면 Z=0 이므로 명령 수행후 Z=1

따라서 Z=0(not equal) 이므로 bne label1 명령이 실행되어 루프의 시작지점으로.. 


반복수행하다 R1의 값이  R9 ~ R10 (0x50000000 ~ 0x60000000) 사이에 있게되면  cmphs r10,r1 이 실행되고 

r10 > r1 이므로 CPSR의 C==1 로 되고 아래의 orrhs r1,r1,r6가 수행되어 MMU 섹션테이블 C=1,B=1이 설정되도록 하는 것 같습니다.


번호 제목 글쓴이 날짜 조회 수
공지 [공지] 커널 스터디 관련 Q&A 게시판 입니다. [5] woos 2016.04.09 2200
1525 앞으로의 스터디 방향 [2] 서정민 2010.08.16 6879
1524 이번주 수고하셧습니다. ㅋㅋ [3] 강진성 2010.05.03 6861
» 스터디 시간에 나왔던 ARM 어셈블러 시뮬레이션 방법을 한번 정리해보았습니다. [7] file 코로케 2013.07.02 6860
1522 likely/unlikely 사용시 차이점 [9] 박량우 2011.07.11 6839
1521 RCU 정리.. 박경태 2007.10.21 6824
1520 우분투 64bit에서 32bit 어셈블리 컴파일하기 신C 2013.06.28 6801
1519 10차 ARM-A팀 8/17 후기는 절 기다리지 마세요 [3] K 2013.08.17 6783
1518 쫑파티 합니다. ^^ [2] file 석헌영 2010.08.04 6770
1517 Clone flag- 스터디중에 어떤분이 질문했던 내용입니다. 황의순 2011.04.04 6763
1516 switch_to() 매크로 [2] 김병희 2008.08.27 6756
1515 SSE register 설명 및 Hammer Family(AMD 64bit 초기 processor) 관련 기사 [2] 최희욱 2007.11.18 6740
1514 저번주에 했던 커널정리PPT입니당 + 요번주 스터디참석여부! [4] file 조은지 2010.07.21 6733
1513 [ARM중] domain 과 AP 비트 필드를 이용한 메모리 접근 권한 제어 [3] file 홍문화 2011.10.10 6710
1512 arm 자료 올립니다 [2] file 지승화 2010.04.11 6700
1511 device mapper관련 문서 [1] file 오시리스 2011.07.25 6697
1510 Cortex™-A9 MPCore Technical Reference Manual [4] file 박대원 2010.04.05 6677
1509 ARM 아키텍쳐 관련 기초 쌓기(임베디드 레시피) [2] 차상우 2013.05.07 6672
1508 금일 스터디중 의문사항.. [7] 박은병 2007.11.11 6635
1507 Setup.S 후반부 정리내용입니다. [2] file 박경태 2007.05.15 6608
1506 리눅스 커널 내부구조 책 [5] file 어선택 2012.04.08 6608
XE Login