PRE
cpsr = nzcVqift_USER
pc = 0x00008000
lr = 0x003fffff; lr = r14
r0 = 0x12
0x00008000 SWI 0x123456
POST
cpsr = nzcVqIft_SVC
spsr = nzcVqift_USER
pc = 0x00000008
lr = 0x00008004
r0 = 0x12
이 코드 다시 좀 잘 볼필요가 있을듯해서요.
일단 cpsr은 살짝 미뤄두고...
벡터테이블 표2.6을 참고하면 SWI가 0x00000008번지라고 써있는걸 기억하구요.
SWI 0x123456
이 명령이 0x00008000에 존재한다 하고요.
그게 이소리더군요.
0x00008000 SWI 0x123456
그리고 나서 swi 명령이 수행되면
pc가 SWI의 벡터테이블 주소로 바뀌고
lr은 swi명령이 있던 0x00008000에 +4를 더한 주소를 가지고 있다는 군요.
그리고 책대로 이 lr주소를 통해 swi number를 얻게 된다는 군요.
요렇게...
SWI_Number = <SWI instruction> AND NOT(0xff000000)
자세한 swi넘버를 얻는 방법은 ex 3.25에 나와있습니다.
거기서
; Read the SWI instruction
LDR r10, [lr, #-4]
뭐 이건 현재 swi명령어 주소에서 4를 더한게 lr 이라고 했으니깐 lr에서 4를 빼면 swi명령어주소를 알수 있겠죵.
; Mask off top 8 bits
BIC r10, r10, #0xff000000
cond-4비트 + swi 명령어 4비트 + 24비트 => 32비트...
뭐 구지 쓰자면 [0bxxxx] [0b1111][0x123456]
swi명령어를 찾아 읽어온후 BIC을 하여 cond와 명령어 코드빼고 SWI 번호를 가지고 있는 하위 24비트만 빼서 r10에 넣으라는 말이겠죠.
그리고 3.4절 마지막에 이런 글이 있네요.
그 r10으로 적절한 SWI서비스 루틴을 호출하기 위해 SWI핸들러에서 사용된다고.
r0로 함수를 찾을거냐 0x123456으로 찾을거냐..에 대해 약간의 혼돈이 있었던거 같은데.
적절한 함수를 찾는건 0x123456인거 같네요.
근데 이거 나만 몰랐던거 아닌지 몰라~ -_-;;;
암튼.
자기전 스위스칼로 손톱때파다가... 스위스 스위.. 스우... swi?
가 갑자기 생각나 다시 한번 봤드만...
오오옷. 우리 그냥 넘어간거 꽤 되더군요.
다음주 스터디에는 서로서로 질문 많이 합시다.
댓글 6
-
홍순민
2010.04.14 09:51
-
유강희
2010.04.14 11:04
ㅎㅎ; 혼선을 드려 죄송 합니다
이 글을 보고 잠깐 짬내서 코드를 다시 보았더니
커널 코드에서도 lr을 다시 읽어와 위와 비슷하게 system call number를 읽어 오더군요
제가 system call의 리턴값과 헷갈린 듯 합니다 ^^;;
-
나영찬
2010.04.14 14:45
흠..여전히 r0의 역할에 대해서는 뭔가 클리어하지 않군요..ㅠㅠ..저만 이해를 못한건가..ㅋㅋ
그래도 SWI 0x123456 가 handler로 가는 index냐 r0가 그것이냐 하는건 풀렸군요..ㅋㅋ
SWI_Number = <SWI instruction> AND NOT(0xff000000) 에 대한 해설..감사드려요~~
-
조은지
2010.04.14 14:51
오늘 교수님께 여쭤본 결과
SWI 0x123456 <-이거는 parameter의 값이라고 합니다. 그 값을 mask 하기 위해서 r0이라는 레지스터 안에다가
저장하는거구요, 자세한건 토요일 모임에서 말씀드리도록할께염 ㅎ_ㅎ
SWI에 대한 자세한 설명 감사드려용:)
-
서정민
2010.04.14 15:36
r0는 그냥 책대로. 파라메터 패싱을 위한 걸로 받아들이자는 의도가 다분히 깔려있는 주석입니다. ㅋㅋㅋ 한놈이 핸들러 인덱스가 되어주었으니 한놈은 자연스레~ 함수로 넘어갈 인자값이나 리턴값이 되지 않겠어요? ㅎㅎㅎ
-
이승철
2010.04.14 16:06
지대로 아는게 없으니 다들 이것이 왜 고민인가에 대해서 저혼자만 고민해보도록 하겠습니다..
.
좋은 자료 감사합니다.. 수고 많으셨겠네요.. ㅎㅎ
전 샴실용 커터칼을 주로 이용해서...