- 리눅스 시스템의 메모리 공간에서 실행 중인 프로그램
- 다수의 프로세스를 실시간으로 사용하는 기법을 멀티프로세싱이라 함
- 같은 시간에 여러 프로그램을 실행하는 방식을 멀티태스킹이라 함
- 프로세스는 리눅스 시스템 메모리에 적재되어 실행을 대기하거나 실행하는 실행 흐름
- 프로세스를 관리하는 자료구조이자 객체
- 프로세스와 관련된 자료 구조로 디버깅 패치 작성 가능
- task_struct 필드를 활용
- 리눅스 커널 소스 코드를 실행하는 주인공은 프로세스
- 모든 함수는 프로세스의 스택 공간에서 실행
- 프로세스
- __schedule() 함수 리뷰
- 프로세스
- mutex_lock() 함수 리뷰
- 프로세스
- __send_signal() 함수 리뷰
- 프로세스의 task_struct 자료 구조
- irq_enter() 함수 리뷰
- 프로세스
- current -> comm;
- 기존 임베디드 RTOS 기반 시스템에서 특정 코드나 프로그램 실행을 일괄처리 했는데 이런 실행 및 작업 단위를 태스크라 함
- 기존 임베디드 개발자들이 리눅스를 사용하는 임베디드 프로젝트로 유입
- 태스크라는 용어에 익숙한 임베디드 개발자들이 리눅스에서도 '태스크' 라는 용어를 사용
결국 태스크와 프로세스는 대부분 같은 의미를 갖음
- 태스크 디스크립터(Task Descriptor)라고 부르고 task_struct 구조체로 표현
- thread_info 구조체와 thread 구조체로 표현
- task_struct: 일반적인 프로세스의 속성(아키텍쳐 무관)
- thread_info, thread 구조체: 아키텍처에 의존적인 프로세스의 동작
- 프로세스의 스택 사이즈는 0X4000(1<<14), ArmV8 64bit 기준
- 인터럽트 처리용 전용 스택
- per-cpu 타입으로 정의됨
- 스택 오버플로우
- 스택 깨짐(out-of-bound, use-after-free)
- stack canary
- compiler option
- 디버깅
- 코드 리뷰
- 프로세스 스택의 내용 상세 분석(스택, 푸시)
- 리눅스 시스템 프로그래밍 코드가 실행되는 모드
- 카카오톡, 브라우저와 같은 애플리케이션 구동
- 메모리 접근에 제약이 있어 리눅스 저수준 함수를 사용해 시스템 콜을 호출, 커널에게 요청
- 리눅스 커널이 실행되는 모드
- 직접 커널 함수를 호출해 커널 시스템 정보(메모리, 인터럽트, ...) 획득 가능
- 시스템 레지스터에 접근 가능 -> 시스템 속성 설정
- 유저 공간에서 fork() 함수를 호출하면 리눅스에서 제공한느 유틸리티 라이브러리의 도움을 받아 커널에게 프로세스 생성 요청
- 리눅스 커널에서는 fork() 함수에 대응하는 시스템 콜 핸들러인 __arm64_sys_clone() 함수를 호출
- 커널 프로세스는 커널 공간에서만 실행되는 프로세스
- 데몬과 같이 백그라운드로 실행되면서 시스템 메모리나 전원을 제어하는 동작을 수행
- 커널 스레드는 커널 공간에서만 실행되며, 유저 공간과 상호작용하지 않음
- 커널 스레드는 실행, 휴면, 등 모든 동작ㅇ를 커널에서 직접 제어 관리
- 대부분의 커널 스레드는 시스켐이 부팅할 때 생성되고 시스템이 종료할 때까지 백그라운드로 실행
- 1단계: kthreadd 프로세스에게 커널 프로세스 생성을 요청
- 2단계: kthreadd 프로세스는 깨어나 프로세스를 생성해달라는 요청이 있으면 프로세스를 생성
- kthreadd 프로세스는 모든 커널 스레드의 부모 프로세스
- 스레드 핸들러 함수는 ktreadd()이며, 커널 스레드를 생성하는 역할을 수행
- 워크큐에 큐잉된 워크(work)를 실행하는 프로세스
- 스레드 핸들러 함수는 worker_threa()이며, process_one_work()함수를 호출해 워크를 실행
- Soft IRQ를 위해 실행되는 프로세스
- ksoftirq 스레드의 핸들러는 run_ksoftirqd() 함수로서 Sofr IRQ 서비스를 실행
- Soft IRQ 서비스를 처리하는 __do_softirq() 함수에서 ksoftirqd를 깨움
- 인터럽트 후반부 처리를 위해 쓰이는 프로세스
- 프로세스의 속성 정보를 표현하는 가장 중요한 자료구조
- 프로세스의 이름과 PID와 같은 프로세스 정보 저장
- 프로세스의 관계를 알 수 있는 데이터 저장
- 프로세스가 생성되면 커널이 태스크 디스크립터를 프로세스에 부여
- 아키텍쳐에 의존적인 프로세스의 속성 정보 저장
- struct task_struct의 시작 주소
- flags와 preempt_count 필드로 구성
- preempt_count 는 preemption의 여부를 판단하는 데이터를 저장
- 프로세스가 실행된 레지스터 세트와 같은 정보 저장
- current 매크로는 현재 구동 중인 프로세스의 태스크 디스크립터 주소를 알려줌
- current 매크로를 통해 직접 태스크 디스크립터 필드에 접근할 수 있음
- struct task_struct 타입의 태스크 디스크립터 는 커널에서 가장 중요하게 관리하는 자료구조
- 커널은 태스크 디스크립터에 접근해 프로세스 정보를 수시로 접근하고 저장
- 태스크 디스크립터에 들어 있는 속성 정보로 함수의 실행 흐름이 바뀜
-sp_el0를 'struct task_struct*' 구조체로 캐스팅해 반환struct task_struct 구조체의 시작 주소가 sp_el0 레지스터에 저장되는 시기
- 컨텍스트 스위칭 수행시 x1(레지스터)은 앞으로 CPU를 점유하면서 실행할 프로세스의 태스크 디스크립터의 주소를 저장
- sp_el0 레지스터는 이제부터 CPU를 점유하면서 실행되는 프로세스의 주소로 업데이트