Guillermo Austin Kim

Sources

Posts

998 posts

[ARM] tst 명령어를 실행하면 ARM CPSR 레지스터가 어떻게 변경될까?

Guillermo Austin Kim|2019년 2월 12일

tst 명령어를 실행하면 ARM CPSR 레지스터가 어떻게 변경될까? tst 명령어는 연산자와 비연산자 사이 AND 비트 연산을 수행합니다. AND 비트 연산 결과에 따라 CPSR 레지스터 Z 비트는 다음과 같이 변경됩니다.Z: 0 ( AND 비트 연산 결과가 1인 경우)Z: 1 ( AND 비트 연산 결과가 0인 경우) tst 명령어가 위와 같이 동작하는지 증명하기 위해 T32 디버거를 실행해 보겠습니다.다음 화면은 tst 명령어를 실행하기 직전입니다. NSR:80107E6C|ret_to_user_from_irq: ldr r2,[r9,#0x8]NSR:80107E70| cmp r2,#0x7F000000 ; r2,#213070

[리눅스커널][워크큐] 딜레이 워크(delayed_work) 소개

Guillermo Austin Kim|2019년 2월 12일

딜레이 워크 소개 워크큐는 대표적인 커널 후반부 처리 기법으로 후반부 처리 코드를 워크 핸들러에서 실행합니다. 동기적으로 처리 할 필요가 없는 코드를 워크 핸들러에 위치시켜 비동기적으로 커널 쓰레드 레벨에서 처리하는 겁니다. 이런 구조로 드라이버를 설계하면 다양한 디바이스 드라이버 시나리오에 맞게 코드를 구성할 수 있습니다. 워크에서 유연성을 추가한 기법이 딜레이 워크입니다. 딜레이 워크란 무엇인가? 구체적으로 딜레이 워크란 무엇일까요? 딜레이 워크는 워크를 일정 시각(HZ 단위) 후에 지연시켜 실행합니다. 여기서 말하는 지연 시각은 디바이스 드라이버 시나리오에 맞게 변경할 수 있습니다. 라즈베리파이에선 진동수인 HZ는 100입니다. 예를 들어 다음 온도를 콘트롤하는 드라이버 시나리오를 생

[리눅스커널][스케줄링] 유저 프로세스가 시스템 콜 처리를 마무리한 후 선점 스케줄링

Guillermo Austin Kim|2019년 2월 10일

유저 프로세스는 시스템 콜로 커널과 통신을 합니다. 유저 프로세스는 시스템 콜을 발생해서 시스템 콜 핸들러 함수를 호출합니다. 이후 시스템 콜 핸들러 하부 함수 실행을 마친 후 유저 공간으로 복귀하기 직전에 선점 스케줄링 실행 조건을 점검합니다. 다음 다이어그램을 보면서 세부 동작에 대해 살펴보겠습니다. 위 블록 다이어그램은 유저 프로세스가 시스템 콜을 처리한 후 선점 스케줄링되는 흐름도입니다. 선점 스케줄링은 다음 단계로 실행합니다. 1. 시스템 콜 발생으로 시스템 콜 벡터인 vector_swi 레이블로 브랜치 2. 시스템 콜 핸들러와 하부 루틴 실행을 마무리한 후 ret_fast_syscall 레이블로 복귀3. ret_fast_syscall 레이블에서 프로세스 struct thread_inf

[리눅스커널] 인터럽트 컨택스트에서 많은 일을 하면 어떻게 될까?

Guillermo Austin Kim|2019년 2월 10일

인터럽트 컨택스트에서 많은 일을 하면 어떻게 될까? 인터럽트 후반부 처리 기법을 왜 적용해야 하는지 설명드리기 위해 인터럽트 컨택스트에서 많은 일을 하는 코드를 적용하면 시스템이 어떻게 오작동하는지 소개합니다. 디바이스 드라이버를 개발하다 보면 인터럽트 컨택스트에서 인터럽트 핸들링을 할 때 많은 일을 하는 코드를 입력할 때가 있습니다. 대표적으로 다음과 같은 예를 들 수 있습니다. - I/O을 시작하는 코드 - 과도한 while loop - 유저 공간으로uevent를 전달해서 인터럽트 발생을 알림 - 스케줄링을 지원하는 커널 함수 호출 위와 같은 코드를 입력하면 시스템 반응 속도가 아주 느려지거나 평소에 볼 수 없는 오류 메시지를 볼 수 있습니다. 인터럽트 핸들러와 서브 루틴에서 코드

[리눅스커널] 인터럽트 후반부 기법을 적용하는 이유

Guillermo Austin Kim|2019년 2월 10일

인터럽트 후반부 기법을 적용하는 이유 인터러트 후반부 기법을 쓰는 이유에 대해 알아보기 전에 커널이 인터럽트를 어떤 방식으로 처리하는지 살펴볼 필요가 있습니다. 5장에서 배운 내용을 정리해보겠습니다. 1. 인터럽트가 발생하면 커널은 실행 중인 프로세스를 멈추고 인터럽트 벡터를 실행해서 인터럽트 핸들러를 실행합니다. 2. 인터럽트 핸들러는 짧고 빨리 실행해야 합니다. 3. 인터럽트를 처리하는 구간이 인터럽트 컨택스트인데 이를 in_interrupt() 함수가 알려줍니다. 인터럽트 후반부 기법을 적용해야 하는 이유는 인터럽트 컨택스트에서 빨리 실행을 끝내야 하기 때문입니다. 인터럽트는 실행 중인 코드를 멈추고 인터럽트를 핸들링하기 때문입니다. 자연스럽게 임베디드 리눅스 개발자뿐만 아니라 임베디드