프로세스
프로세스와 관련된 자료 구조
- 태스크 디스크립터(task descriptor)라고 부르고 task_struct 구조체로
표현
- thread_info 구조체와 thread 구조체로 표현
자료 구조의 특징
- task_struct: 일반적인 프로세스의 속성(아키텍처 무관)
- thread_info, thread 구조체: 아키텍처에 의존적인 프로세스의 동작(프로세스가 마지막에 실행한 레지스터 정보를 저장하는 자료구조)
프로세스는 자신의 스택 공간에서 실행됨
프로세스의 스택 사이즈는 0x4000(1 << 14)임 – 64비트 Armv8 기준
IRQ Stack
인터럽트 처리용 전용 스택
per-cpu 타입으로 정의됨
프로세스 자료구조 초기화
dup task struct : copy 프로세스에서 호출되는 커널 api
메모리 공간을 확보한 다음 리턴
프로세스 스택 이슈
- 스택 오버플로우(호출이 깊어지면)
- 스택 깨짐 (out-of-bound, use-after-free)
- 지역변수로 배열에 있는 것을 메모리 copy연산 잘못하면 발생
프로세스 스택 이슈 대응
- stack canary
- compiler option
- 디버깅
- 코드 리뷰
- 프로세스 스택의 내용 상세 분석(스택, 푸시)
높은 주소(최하단) -> 낮은 주소
- 함수가 순차적으로 실행되지 않는다.
- cpu startup을 하다가도 인터럽트가 발생하면 점프를 한다. arch에서 인터럽트를 실행하는 동안 인터럽트가 생기면 인터럽트를 처리하는 특정 벡터주소로 점프하고 그 주소를 기준으로 서브루틴이 실행이 되다가 다시 돌아온다.
- 실행을 하다가 인터럽트가 유발되면 점프를 했다 돌아오고 premption이 되기도 한다.
프로세스 관리
유저모드와 커널모드
유저 모드
-
리눅스 시스템 프로그래밍 코드가 실행되는 모드로 카카오톡,
브라우저와 같은 애플리케이션 구동
-
메모리 접근에 제약이 있어 리눅스 저수준 함수(open,read,write)를 사용해 시스
템 콜을 사용해 커널에게 요청
-
시스템 콜로 유저모드에서 커널모드로 진입
-
인터럽트로 커널모드로 스위칭
커널 모드
- 리눅스 커널,드라이버가 실행되는 모드
- 직접 커널 함수를 호출해 커널 시스템 정보(메모리, 인터럽트
등등)를 획득할 수 있고 시스템 레지스터에 접근 가능
regs : 프로세스가 실행이된 레지스터 정보를 확인하는 구조체
- 프로세스 유저공간에서 커널공간으로 진입할 때 유저공간에서 실행되던 레지스터 정보, pstate 정보를 struct pt regs가 담고있다.
pstate : 프로세서의 상태를 저장하는 레지스터
레지스터의 0~4번째 비트는 익셉션 레벨을 나타냄.
- fork 시스템콜 -> 커널공간 진입
- 시스템콜 핸들러가 호출, copy process 호출, 여기서 프로세스가 생성
- 부모프로세스가 사용했던 fd같은 리소스, 가상메모리 공간을 자식 프로세스가 물려받음
==> 프로세스에 의해 카피된다.
- arm64 접두사 :아키텍처를 나타내는 접두사
bash : 프로세스 이름, 숫자 : pid [001] : cpu코어의 번호
1680.296714: 타임스탬프, <stack trace]수의 호출 흐름을 나타내겠다.
- el0에서는 유저 애플리케이션.
- invoke까지는 시스템콜이 유발될 때 반복되는 패턴.
- 시스템콜 핸들러 : arm64_sys가 붙음.
- 카피 프로세스 함수 내에서 프로세스가 생성된다. 부모프로세스로부터 카피가 된다.
커널 스레드
커널 스레드의 정의
- 커널 프로세스는 커널 공간에서만 실행되는 프로세스
- 데몬과 같이 백그라운드로 실행되면서 시스템 메모리나 전원을 제어하는
동작을 수행
커널 스레드의 특징
- 커널 스레드는 커널 공간에서만 실행되며, 유저 공간과 상호작용하지 않음
- 커널 스레드는 실행, 휴면 등 모든 동작을 커널에서 직접 제어 관리
- 대부분의 커널 스레드는 시스템이 부팅할 때 생성되고 시스템이 종료할 때
까지 백그라운드로 실행
ex)kswapd thread - 페이지 메모리 확보
- 워크 큐 : 인터럽트 후반부 처리기법
- create worker함수
- ktread create on node 호출, 첫번째 인자가 워커 스레드인데 워커 스레드는 함수 이름.
이 함수는 커널 스레드의 핸들러 함수. 워커: 매개인자,
- 데몬이 커널 스레드 생성
커널 스레드 생성 과정
- 커널 스레드 데몬 프로세스에게 커널 프로세스 생성 요청
- 커널스레드 데몬 프로세스를 깨움
- 커널 스레드 생성 요청을 찾고 있으면 관련된 함수 호출, 커널 스레드 생성
커널 스레드 종류
- kthreadd 프로세스
- 모든 커널 스레드의 부모프로세스
- 스레드 핸들러 함수는 kthreadd(), 커널 스레드 생성
- 워크큐에 큐잉된 워크(work)를 실행하는 프로세스
- 스레드 핸들러 함수는 worker_thread()이며, process_one_work() 함수를 호출
해 워크를 실행