[리눅스커널][태스크릿] 태스크릿(struct tasklet_struct)은 어떻게 등록할까?
By Guillermo Austin Kim | 2019년 4월 10일 |
먼저 태스크릿을 등록하는 2가지 방법을 소개합니다.1. 태스크릿 전역 변수 선언 : DECLARE_TASKLET() 혹은 DECLARE_TASKLET_DISABLED() 함수 호출2. 태스크릿 초기화 함수 호출 : tasklet_init() 함수 DECLARE_TASKLET() 혹은 DECLARE_TASKLET_DISABLED() 함수로 태스크릿 등록하기 DECLARE_TASKLET() 혹은 DECLARE_TASKLET_DISABLED() 매크로를 써서 태스크릿을 초기화하는 방법입니다. 태스크릿 전역 변수는 컴파일 타임에 자료구조가 정해집니다.[https://elixir.bootlin.com/linux/v4.19.30/source/include/linux/interrupt.h]1 #define DE
[리눅스커널] 시스템 콜: 유저 공간에서 전달한 문자열 처리 방법
By Guillermo Austin Kim | 2019년 7월 12일 |
유저 공간에서 시스템 콜 아규먼트로 지정한 파일 이름은 커널 공간에 그대로 전달됩니다. 한 가지 예를 들어볼까요?[https://elixir.bootlin.com/linux/v4.19.30/source/fs/open.c]SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode){ if (force_o_largefile()) flags |= O_LARGEFILE; return do_sys_open(AT_FDCWD, filename, flags, mode);} 위 sys_open() 함수 첫 번째 아규먼트로 filename이 전달됩니다.이번에는 다른 예시를 들겠습니다.[https://elixir.bootlin.com/l
인터럽트(3) - 인터럽트 발생을 막고 싶을 때
By Guillermo Austin Kim | 2018년 2월 10일 |
어떤 코드 흐름에서는 인터럽트가 발생하면 안될 경우가 있습니다. 예를 들면 프로세서가 슬립에 진입할 때 각 디바이스 드라이버를 서스팬스 시키는 처리 도중 인터럽가 뜨면 안됩니다. 아래는 어셈블코드에서 호출되는 코드인데, 유저 모드에서 권한이 없는 가상 메모리 공간에 접근하면 ARM 프로세스가 감지하고예외(Exception)을 발생시킵니다. 이 때 bad_mode 함수가 호출되는데, 결국 panic 함수를 호출해서 커널 패닉을 유발시킵니다. 커널 패닉을 시키기 바로 전 local_irq_disable 함수를 호출해서 인터럽트를 아예 막아 버립니다.[arch/arm/kernel/traps.c]asmlinkage void bad_mode(struct pt_regs *regs, int reason){ co
undocker - 도커(Docker) 이미지에서 파일 추출
By 반달가면 | 2021년 9월 9일 |
도커(docker) 이미지로부터 디렉토리 구조와 파일을 추출할 수 있는 프로그램을 발견했다. 당장 쓸 일은 없지만, 혹시 모르니 일단 정리해 두기로. 관련된 블로그 원문은 아래의 링크다. Unpacking docker image with undocker docker save 명령으로 이미지 파일을 저장할 수 있는데 tar 형식으로 저장된다. (docker save 관련 내용은 이전 게시물을 참고하자. 여기로) 이 tar 파일은 단순히 디렉토리 구조와 파일을 압축한 것이 아니라 내부에 또 다시 여러개의 tar 파일이 있고 좀 복잡하게 되어 있다. 이로부터 디렉토리/파일을 복원하는 undocker.py 스크립트를 만든 모양이다. undocker의 깃허브(github) 페이지는 아래의 링크