[리눅스커널] 인터럽트 후반부 처리: 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 ...) 먼저 이 함수에 전달하는 인자부터 살펴봅시다.
[python] mac 과 linux 에서 group 구하기
By 지훈현서 | 2018년 9월 27일 |
의외로 맥과 리눅스에서 현재 로그인 한 계정의 그룹 이름을 구해오는 것이 쉽지 않았습니다. 이것을 파이썬으로 간단히 한줄로 (?) 구해 보도록 하겠습니다. python -c 'import grp,sys; gid=sys.stdin.readline().strip(); [gname]=[g.gr_name for g in grp.getgrall() if g.gr_gid==int(gid)][:1]; print(gname)' <<< $(id -g) 하나씩 파헤쳐 보겠습니다. * 마지막의 id -g 명령은 현재 계정의 gid 를 구해옵니다.* python -c '...' 은 '...'의 파이썬 코드를 실행합니다.* import grp, sys 는 두 표준 모듈을 import 합니다.* gid=
[리눅스커널] 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/