Guillermo Austin Kim

Sources

Posts

998 posts

[리눅스커널] ARMv8: 슬럽 오브젝트의 트랙(track) 구조체를 TRACE32로 디버깅하기

Guillermo Austin Kim|2020년 4월 28일

이번 시간에는 64비트 기반 ARMv8 아키텍처(커널 4.19 버전)에서의 슬럽 오브젝트의 디버깅 정보를 확인해보겠습니다. 슬럽 오브젝트의 패턴을 빨리 확인하는 좋은 컨텐츠였으면 좋겠습니다. 크래시 유틸리티로 슬랩 페이지(kmalloc-256)를 확인 ffffffbf50925d00 슬럽 오브젝트의 속성을 확인하기 위해 'kmem ffffffbf50925d00' 명령어를 입력하겠습니다. 여기서 kmem 오른쪽에 보이는 주소는 슬랩 페이지 디스크립터입니다. crash64> kmem ffffffbf50925d001 CACHE OBJSIZE ALLOCATED TOTAL SLABS SSIZE NAME2 ffffffd3c08e7780 256 36025

[취준생] 임베디드 개발의 진실과 오해 - (3) 야근을 하는 이유

Guillermo Austin Kim|2020년 4월 27일

임베디드 개발자들이 야근을 하는 이유는 무엇일까요? 이번 포스팅에서는 이 주제로 이야기를 해보려고 합니다. 사실 임베디드 분야의 개발자만 야근을 하는 아니고요. 다른 IT 분야도 마찬가지이긴 하거든요.여기서 말하는 야근은 6개월 동안 11시 퇴근과 같은 성격의 야근은 아니고요. 돌발 상황으로 인한 야근을 말합니다. 하드웨어 부품이 조금만 바뀌어도 예상치 못한 문제를 겪는다. 임베디드 개발자는 기본으로 하드웨어를 프로그래밍을 하는 경우가 많아요. 그런데 운영체제나 드라이버가 같아도 하드웨어 부품이 교체되면 다음과 같은 상황을 겪게 되요. * 기존에 못 봤던 이슈를 겪는다. A란 프로젝트를 잘 마무리한 다음 A란 프로젝트에서 다른 메모리로만 교체한다고 가정해볼께요. 매니저들은 별 문제가 없으리라

[리눅스커널] 인터럽트 후반부 처리: IRQ 스레드의 전체 실행 흐름 정리

[리눅스커널] 인터럽트 후반부 처리: IRQ 스레드의 전체 실행 흐름 정리

Guillermo Austin Kim|2020년 4월 25일

지금까지 IRQ 스레드 핸들인 irq_thread() 함수에서 irq_thread_fn() 함수를 호출해 IRQ 스레드 핸들러 함수를 호출하는 과정을 살펴봤습니다. 이번에는 배운 내용을 정리하는 차원으로 IRQ 스레드 전체 실행 흐름을 보면서 정리하는 시간을 갖겠습니다. [그림 6.7] "irq/86-mmc1" IRQ 스레드 실행 흐름도 눈끔 화살표는 함수 실행 흐름 방향입니다. 위 그림에서 실행 순서별 동작을 살펴보겠습니다. [1]: arch_cpu_idle() 함수 실행 중 86번 인터럽트가 발생해서 인터럽트 벡터인 __irq_svc가 실행합니다. [2]: __handle_irq_event_percpu() 함수까지 실행한 후 86번 인터럽트 핸들러인 bcm283

[리눅스커널] 인터럽트 후반부 처리: IRQ 스레드 핸들러인 irq_thread() 함수 분석

[리눅스커널] 인터럽트 후반부 처리: IRQ 스레드 핸들러인 irq_thread() 함수 분석

Guillermo Austin Kim|2020년 4월 25일

커널에서 지원하는 wake_up_process() 함수를 사용해 커널 스레드를 깨우면 스케줄러에 의해 커널 스레드는 실행을 시작합니다. 이 때 커널 스레드의 스레드 핸들 함수가 호출되며 스레드의 시나리오에 따라 정해진 동작을 수행합니다. 마찬가지로 IRQ 스레드의 스레드 핸들 함수는 irq_thread() 입니다. 따라서 IRQ 스레드가 깨어나면 irq_thread() 함수가 호출됩니다. 이번 시간에는 IRQ 스레드를 깨우면 실행하는 irq_thread() 함수를 살펴보겠습니다. 먼저 IRQ 스레드를 깨우면 실행하는 irq_thread() 함수를 보겠습니다. static int irq_thread(void *data)2 {3struct callback_head on_exit_work;4stru

[리눅스커널] 메모리: TRACE32로 슬랩 캐시 디버깅해보기

Guillermo Austin Kim|2020년 4월 21일

슬랩 캐시를 나타내는 링크드 리스트 확인 먼저 slab_caches 전역 변수를 확인해보자. $ v.v %t %h slab_caches (static struct list_head) slab_caches = ( (struct list_head *) next = 0xFFFFFFC72CA83E60, (struct list_head *) prev = 0xFFFFFFC6008FC060) slab_caches 전역변수의 next 필드는 struct kmem_cache 구조체의 list 필드를 가르킨다. 다음과 같은 명령어를 입력해보자. $ v.v %h %t %s container_of(0xFFFFFFC72CA83E60,struct kmem_cache,list) (struct kmem_cac