프로세스

프로세스와 관련된 자료 구조

  • 태스크 디스크립터(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
  • 디버깅
  • 코드 리뷰
  • 프로세스 스택의 내용 상세 분석(스택, 푸시)

높은 주소(최하단) -> 낮은 주소

  • 프로세스의 스택을 메모리 덤프로 분석해야 한다.

  • 함수 호출 흐름은 Sequential 하지 않다!

    • Preemption
    • IRQ
    • Demand Paging
  • 함수가 순차적으로 실행되지 않는다.
  • cpu startup을 하다가도 인터럽트가 발생하면 점프를 한다. arch에서 인터럽트를 실행하는 동안 인터럽트가 생기면 인터럽트를 처리하는 특정 벡터주소로 점프하고 그 주소를 기준으로 서브루틴이 실행이 되다가 다시 돌아온다.
  • 실행을 하다가 인터럽트가 유발되면 점프를 했다 돌아오고 premption이 되기도 한다.

프로세스 관리

유저모드와 커널모드

유저 모드

  • 리눅스 시스템 프로그래밍 코드가 실행되는 모드로 카카오톡,
    브라우저와 같은 애플리케이션 구동

  • 메모리 접근에 제약이 있어 리눅스 저수준 함수(open,read,write)를 사용해 시스
    템 콜을 사용해 커널에게 요청

  • 시스템 콜로 유저모드에서 커널모드로 진입

  • 인터럽트로 커널모드로 스위칭

커널 모드

  • 리눅스 커널,드라이버가 실행되는 모드
  • 직접 커널 함수를 호출해 커널 시스템 정보(메모리, 인터럽트
    등등)를 획득할 수 있고 시스템 레지스터에 접근 가능

regs : 프로세스가 실행이된 레지스터 정보를 확인하는 구조체

  • 프로세스 유저공간에서 커널공간으로 진입할 때 유저공간에서 실행되던 레지스터 정보, pstate 정보를 struct pt regs가 담고있다.

pstate : 프로세서의 상태를 저장하는 레지스터
레지스터의 0~4번째 비트는 익셉션 레벨을 나타냄.

  1. fork 시스템콜 -> 커널공간 진입
  2. 시스템콜 핸들러가 호출, copy process 호출, 여기서 프로세스가 생성
  3. 부모프로세스가 사용했던 fd같은 리소스, 가상메모리 공간을 자식 프로세스가 물려받음
    ==> 프로세스에 의해 카피된다.
  • arm64 접두사 :아키텍처를 나타내는 접두사

bash : 프로세스 이름, 숫자 : pid [001] : cpu코어의 번호
1680.296714: 타임스탬프, <stack trace]수의 호출 흐름을 나타내겠다.

  • el0에서는 유저 애플리케이션.
  • invoke까지는 시스템콜이 유발될 때 반복되는 패턴.
  • 시스템콜 핸들러 : arm64_sys가 붙음.
  • 카피 프로세스 함수 내에서 프로세스가 생성된다. 부모프로세스로부터 카피가 된다.

커널 스레드

커널 스레드의 정의

  • 커널 프로세스는 커널 공간에서만 실행되는 프로세스
  • 데몬과 같이 백그라운드로 실행되면서 시스템 메모리나 전원을 제어하는
    동작을 수행

커널 스레드의 특징

  • 커널 스레드는 커널 공간에서만 실행되며, 유저 공간과 상호작용하지 않음
  • 커널 스레드는 실행, 휴면 등 모든 동작을 커널에서 직접 제어 관리
  • 대부분의 커널 스레드는 시스템이 부팅할 때 생성되고 시스템이 종료할 때
    까지 백그라운드로 실행
    ex)kswapd thread - 페이지 메모리 확보
  • 워크 큐 : 인터럽트 후반부 처리기법
  • create worker함수
  • ktread create on node 호출, 첫번째 인자가 워커 스레드인데 워커 스레드는 함수 이름.
    이 함수는 커널 스레드의 핸들러 함수. 워커: 매개인자,
  • 데몬이 커널 스레드 생성

커널 스레드 생성 과정

  1. 커널 스레드 데몬 프로세스에게 커널 프로세스 생성 요청
  2. 커널스레드 데몬 프로세스를 깨움
  3. 커널 스레드 생성 요청을 찾고 있으면 관련된 함수 호출, 커널 스레드 생성

커널 스레드 종류

  • kthreadd 프로세스
    • 모든 커널 스레드의 부모프로세스
    • 스레드 핸들러 함수는 kthreadd(), 커널 스레드 생성
  • 워크큐에 큐잉된 워크(work)를 실행하는 프로세스
  • 스레드 핸들러 함수는 worker_thread()이며, process_one_work() 함수를 호출
    해 워크를 실행

0개의 댓글