Guillermo Austin Kim

Sources

Posts

998 posts

[리눅스커널] 크래시 유틸리티(Crash Utility)로 시스템 콜 확인하기

Guillermo Austin Kim|2020년 2월 20일

크래시 유틸리티 프로그램으로 'sys -c" 명령어를 입력하면 시스템 콜 번호와 시스템 콜 핸들러를 알 수 있습니다. 먼저 ARM64 아키텍처에서 시스템 콜 정보를 확인해볼까요? 다음은 'sys -c" 명령어를 입력한 다음에 출력되는 결과입니다. crash64> sys -cNUM SYSTEM CALL FILE AND LINE NUMBER 0 __arm64_sys_io_setup ../kernel/fs/aio.c: 1303 1 __arm64_sys_io_destroy ../kernel/fs/aio.c: 1372 2 __arm64_sys_io_submit ../kernel/fs/aio.c: 1900 3 __arm64_sys_io_ca

[리눅스커널] preempt_disable() 함수: 스케줄링을 지원하는 함수 실행 금지

Guillermo Austin Kim|2020년 2월 20일

preempt_disable()/preempt_enable() 함수를 사용할 때 주의해야 할 점이 있습니다. 그것은; * preempt_disable()/preempt_enable() 함수를 사용하는 구간에서 스케줄링을 지원하는 함수가 호출되면 안된다. 라는 점입니다. 다들 아시다시피, 커널 드라이버에서 preempt_disable() 함수를 호출하면 프로세스 struct thread_info 의 preempt_count를 +1만큼 증가시켜 Preemption을 비활성화합니다. 다음 예제 코드를 보면서 설명을 시작 하겠습니다. bool try_module_get(struct module *module)02 {03 bool ret = true;0405 if (module) {06 + preempt

[리눅스커널] 프로세스 별로 파일 디스크립터(파일 객체)는 어떻게 관리하나?

Guillermo Austin Kim|2020년 2월 18일

아래 포스팅을 읽은 방문자님께서 댓글로 남겨 주신 질문에 대답하려고 합니다. [리눅스커널][가상파일시스템] 파일 객체: write 연산 세부 동작 분석 질문 서로 다른 프로세스에서 f1파일을 열었으니 fd가 가르키는 시스템 파일 테이블의 파일이 다를텐데어떻게 내용이 삭제되거나 섞이지도 않는지 알수 있을까요? 답신 사실 이 부분은 커널을 디버깅해봐야 알 수 있는 내용입니다. 커널 디버깅 툴 중 많이 사용되는 크래시 유틸리티로 이 내용을 확인해보겠습니다. 다음은 프로세스가 저장하고 있는 파일 디스크립터 목록을 출력해주는 'files 1' 명령어를 입력한 결과입니다. crash> files 1PID: 1 TASK: cf930f40 CPU: 0 COMMAND: "systemd"ROO

[리눅스커널] 스케줄링: ret_to_user_from_irq/ret_fast_syscall/__irq_svc 레이블 분석

Guillermo Austin Kim|2020년 2월 16일

선점 스케줄링과 시그널을 처리하는 3군데 레이블을 TRACE32로 점검해보자. ret_to_user_from_irq 레이블 ret_to_user_from_irq 레이블의 어셈블리 코드는 다음과 같다. 01 NSR:8010104C|E5992008 ret_to_user_from_irq: ldr r2,[r9,#0x8]02 NSR:80101050|E352047F cmp r2,#0x7F000000 ; r2,#213070643203 NSR:80101054|1B002C7E blne 0x8010C254 ; addr_limit_check_failed04 NSR:801010

[리눅스커널] softirq: SOFTIRQ_MASK의 정체

Guillermo Austin Kim|2020년 2월 7일

SOFTIRQ_MASK 분석하기 SOFTIRQ_MASK 가 어떤 값인지 알아보기 위해 이 플래그의 선언부를 확인해봤습니다.다음은 SOFTIRQ_MASK의 선언부입니다. SOFTIRQ_MASK (__IRQ_MASK(SOFTIRQ_BITS) << SOFTIRQ_SHIFT) #define SOFTIRQ_SHIFT (PREEMPT_SHIFT + PREEMPT_BITS) 보시다시피 SOFTIRQ_MASK 매크로는 __IRQ_MASK, SOFTIRQ_BITS, SOFTIRQ_SHIFT와 같이 생소한 매크로로 구성돼 있어 바로 어떤 값인지 확인하기 어렵습니다.그래서 각각의 매크로의 선언부를 따라 가다 보면 시간이 오래 걸리는 경우가 많습니다. SOFTIRQ_MASK 매크로를 확인하기 위한 패치 코드