리눅스커널

포스트: 154|조회수: 0|TERM
Items

Posts

154 posts

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

Guillermo Austin Kim|2018년 11월 21일

커널 공간에서 시스템 콜 실행 출발점은 vector_swi 레이블입니다. svc 명령어를 실행하면 소프트웨어 인터럽트 벡터인 vector_swi 레이블으로 브랜치하기 때문입니다. vector_swi 레이블 어셈블리 코드 분석으로 ARM 리눅스 커널에서 시스템 콜이 어떻게 동작하는지 살펴봅시다. vector_swi 레이블 어셈블리 코드는 다음과 같습니다.1 80107ee0 :2 80107ee0: e24dd048 sub sp, sp, #72 ; 0x483 80107ee4: e88d1fff stm sp, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip}4 80107ee8: e28d803c add r8, s

[라즈베리파이] 시스템 콜 - 유저 공간 시스템 콜 발생 어셈블리 코드 분석

Guillermo Austin Kim|2018년 11월 18일

아키텍처별로 시스템 콜을 실행하는 동작은 다릅니다. 시스템 콜을 실행하는 동작은 어셈블리 코드로 구현되어 있습니다. 라즈베리파이가 탑재한 ARM(ARM32) 아키텍처에서는 시스템 콜은 다음과 같이 구현돼 있습니다.1. r0 ~ r5 레지스터에 시스템 콜로 전달할 인자 지정2. r7 레지스터에 시스템 콜 번호 저장3. "svc 0x00000000" 명령어 실행 GNU C 라이브러리 파일에서 실제 시스템 콜을 실행하는 어셈블리 코드를 봅시다. write() 함수에 대한 시스템 콜을 실행하는 코드를 소개합니다.00000020 :1 20: e59fc060 ldr ip, [pc, #96] ; 88 2 24: e79fc00c

[라즈베리파이] 시그널 - 시그널 핸들러 실행 및 커널 복귀 과정

Guillermo Austin Kim|2018년 11월 17일

signal은 특정 프로세스에게 어떤 메시지를 전달할 수 있는 가장 기본적인 수단입니다.signal은 다른 (user-level) 프로세스로부터 직접적으로 받거나 혹은 (주로 문제가 될 만한 동작으로인해) 커널로부터 받을 수 있습니다. 이러한 signal은 kernel-mode에서 처리가 되는데 주로 시스템 콜이나 인터럽트 처리 등을 마치고 user-mode로 돌아오기 직전에 해당 프로세스에게 전달된 signal이 있는지 검사하여 실행됩니다.(SMP 커널에서는 user-mode에서 실행 중인 프로세스가 signal을 처리해야 하면 강제로 scheduling하도록 IPI를 보내서 kernel-mode로 들어오게 만들기도 합니다.) signal을 받은 프로세스의 기본적인 반응은 거의 대부분 해당 프로세스의

[라즈베리파이][리눅스커널] IRQ Thread는 언제 생성할까?[1] #CS

[라즈베리파이][리눅스커널] IRQ Thread는 언제 생성할까?[1] #CS

Guillermo Austin Kim|2018년 6월 19일

# 인터럽트 후반부 처리1 IRQ Thread(threaded IRQ) 란 2. 인터럽트 후반부 처리(Bottom Half) 소개3.IRQ Thread는 언제 생성할까?[1] IRQ Thread를 생성하기 위해서는 request_threaded_irq 을 호출하면 IRQ Thread가 생성된다고 설명해 드렸습니다. 사실 request_threaded_irq을 호출할 때 IRQ Thread가 생성되는 것은 아니고 다음 흐름에서 __kthread_create_on_node 함수가 실행할 때 생성됩니다. 우리는 커널 쓰레드를 생성할 때 kthread_create 함수를 호출한다고 배웠죠. IRQ Thread도 이 kthread_create 함수를 호출해서 생성합니다. 이로 I