Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

8179
1390
307630


[라즈베리파이] 시스템 콜 - 소프트웨어 인터럽트 벡터(vector_swi) 코드 분석 11. 시스템 콜

커널 공간에서 시스템 콜 실행 출발점은 vector_swi 레이블입니다. svc 명령어를 실행하면 소프트웨어 인터럽트 벡터인 vector_swi 레이블으로 브랜치하기 때문입니다. vector_swi 레이블 어셈블리 코드 분석으로 ARM 리눅스 커널에서 시스템 콜이 어떻게 동작하는지 살펴봅시다.

vector_swi 레이블 어셈블리 코드는 다음과 같습니다.

1  80107ee0 <vector_swi>:
2  80107ee0:  e24dd048  sub  sp, sp, #72 ; 0x48
3  80107ee4:  e88d1fff    stm   sp, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip}
4  80107ee8:  e28d803c  add   r8, sp, #60 ; 0x3c
5  80107eec:  e9486000  stmdb  r8, {sp, lr}^
6  80107ef0:  e14f8000   mrs r8, SPSR
7  80107ef4:  e58de03c  str lr, [sp, #60] ; 0x3c
8  80107ef8:  e58d8040  str r8, [sp, #64] ; 0x40
9  80107efc:  e58d0044  str  r0, [sp, #68] ; 0x44
10 80107f00: e3a0b000  mov fp, #0
11 80107f04: ee11cf10   mrc 15, 0, ip, cr1, cr0, {0}
12 80107f08: e59fa0b0  ldr sl, [pc, #176] ; 80107fc0 <__cr_alignment>
13 80107f0c: e59aa000  ldr sl, [sl]
14 80107f10: e13a000c  teq sl, ip
15 80107f14: 1e01af10  mcrne  15, 0, sl, cr1, cr0, {0}
16 80107f18: e92d500f  push   {r0, r1, r2, r3, ip, lr}
17 80107f1c: eb0355a9  bl 801dd5c8 <trace_hardirqs_on>
18 80107f20: e8bd500f  pop {r0, r1, r2, r3, ip, lr}
19 80107f24: f1080080  cpsie i
20 80107f28: e1a096ad  lsr r9, sp, #13
21 80107f2c: e1a09689  lsl r9, r9, #13
22 80107f30: e28f808c  add r8, pc, #140 ; 0x8c
23 80107f34 <local_restart>:
24 80107f34: e599a000 ldr sl, [r9]
25 80107f38: e92d0030 push {r4, r5}
26 80107f3c: e31a00f0  tst sl, #240 ; 0xf0
27 80107f40: 1a000008 bne 80107f68 <__sys_trace>
28 80107f44: e3570e19 cmp r7, #400 ; 0x190
29 80107f48: e24fee11 sub lr, pc, #272 ; 0x110
30 80107f4c: 3798f107 ldrcc pc, [r8, r7, lsl #2]
31 80107f50: e28d1008 add r1, sp, #8
32 80107f54: e357080f  cmp r7, #983040 ; 0xf0000
33 80107f58: e2270000 eor r0, r7, #0
34 80107f5c: 2a0010db bcs 8010c2d0 <arm_syscall>
35 80107f60: e3a08000 mov r8, #0
36 80107f64: ea00d333 b 8013cc38 <sys_ni_syscall>

* 유튜브 강의 동영상도 있으니 같이 들으시면 좋습니다. 




"혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!" 

Thanks,
Austin Kim(austindh.kim@gmail.com)


#Reference: 시스템 콜
시스템 콜 주요 개념 소개
유저 공간에서 시스템 콜은 어떻게 발생할까
시스템 콜 핸들러는 어떤 동작을 할까? 
시스템 콜 실행 완료 후 무슨 일을 할까?
시스템 콜 관련 함수  
시스템 콜 디버깅  


# Reference: For more information on 'Linux Kernel';

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 1

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 2


 
repository:
http://rousalome.egloos.com/10025752








    핑백

    덧글

    • dmsdn 2021/04/10 13:36 # 삭제 답글

      안녕하세요 :) '디버깅을 통해 배우는 리눅스 커널의 구조와 원리'를 통해 공부하고있는 독자입니다!

      책을 읽던 도중 질문이 생겨서 댓글을 남기게 되었습니다!!

      우선 vector_swi의 어셈블리 코드중 첫 번째 라인인 sub sp, sp, #72 부분에서 굳이 sp의 위치를 조절해주는 이유를 모르겠습니다.
      그냥 sp에 바로 레지스터 세트들을 push하면 안되는건가요??

      또한 스택공간에서 72byte를 확보하는 것도 이해가 잘 가지 않습니다.
      분명 저장하는 4byte의 레지스터는 13개 이므로 52byte면 충분하다고 생각합니다. 혹시 다른 용도가 있어서 더 큰 용량을 확보하는 걸까요??
    • AustinKim 2021/04/10 14:42 #

      좋은 질문을 남기신 것 같은데요.
      방금 새롭게 올린 포스트(아래 링크)를 읽으시면, 궁금한 점이 해소될 것입니다.

      http://rousalome.egloos.com/10025591

      혹시 더 궁금한 점이 있으면 댓글로 질문 남겨주세요.

      그럼, 즐거운 주말 보내세요.
      감사합니다.
    댓글 입력 영역