[Kernel] slab object 자료구조 - 페이지, 슬랩 캐시
By Guillermo Austin Kim | 2018년 4월 23일 |
이번 시간에는 코어 덤프에서 페이지 디스크립터와 슬랩 오브젝트 자료구조를 알아 봅니다. 우선 다음과 같은 페이지 디스크립터가 있습니다.(struct page *) (struct page*)0xEC778540 = 0xEC778540 -> ( (long unsigned int) flags = 128 = 0x80, //<<--[1] (struct address_space *) mapping = 0x0, (void *) s_mem = 0x0, (long unsigned int) index = 3306744832 = 0xC518EC00, (void *) freelist = 0xC518EC00, //<<--[2] (bool) pfmemalloc = FALSE, (unsign
[리눅스커널] 인터럽트 후반부 처리: IRQ 스레드를 깨우는 코드 분석
By Guillermo Austin Kim | 2019년 2월 24일 |
IRQ 스레드는 누가 언제 실행할까? 이번 절에서는 IRQ 스레드가 어떤 과정으로 실행하는지 살펴보겠습니다. IRQ 스레드는 크게 다음 단계로 실행합니다.1. 인터럽트 핸들러에서 IRQ_WAKE_THREAD 반환2. IRQ 스레드 깨움3. IRQ 스레드 핸들러 실행 IRQ 스레드를 실행하는 출발점은 인터럽트 핸들러가 IRQ_WAKE_THREAD 를 반환하는 시점입니다. 이 부분부터 IRQ 스레드를 어떤 과정으로 깨우는지 세부 동작을 점검하겠습니다. IRQ 스레드를 깨우는 코드 분석 인터럽트가 발생하면 인터럽트 핸들러가 실행됩니다. 이 인터럽트 핸들러가 IRQ 스레드 실행의 출발점입니다. 인터럽트 핸들러에서 IRQ_WAKE_THREAD를 반환하면 해당 IRQ 스레드를 깨웁니다. 예를 들어 92번 “m
[라즈베리파이] 프로세스: 커널 스레드는 어떻게 생성하나?
By Guillermo Austin Kim | 2019년 1월 13일 |
이번에는 커널 스레드 생성 요청과 커널 스레드를 생성하는 코드 흐름을 살펴봅시다. 커널 스레드를 생성하려면 다음과 같이 kthread_create() 함수를 호출해야 합니다.1 #define kthread_create(threadfn, data, namefmt, arg...) \2 kthread_create_on_node(threadfn, data, NUMA_NO_NODE, namefmt, ##arg)34 struct task_struct *kthread_create_on_node(int (*threadfn)(void *data),5 void *data, int node,6 const char namefmt[],7 ...) 먼저 이 함수에 전달하는 인자부터 살펴봅시다.
[리눅스커널] Arm64: VMEMMAP_START, vmemmap, PAGE_OFFSET 위치 조정(v5.4)
By Guillermo Austin Kim | 2021년 8월 8일 |
리눅스 커널 v5.4 버전부터 가상 주소 맵이 약간 변경됐습니다.그 중 대표적인 속성은 아래 정보입니다. VMEMMAP_START: 0xfffffffeffe00000PAGE_OFFSET: 0xffffff8000000000 이 정보를 직접 어셈블리 코드로 확인해보겠습니다. 관련 코드는 참고로 다음과 같습니다. vmemmap ((struct page *)VMEMMAP_START - (memstart_addr >> PAGE_SHIFT)) 패치 코드 먼저 다음과 같은 패치 코드를 작성합시다. diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.cindex 9af647d..3000332 100644--- a/arch/arm64/mm/