ESL 연구실 활동/Kernel of Linux

리눅스 커널 강의 1~2강

천숭이 2022. 4. 15. 01:44

운영체제 개요 및 정의 스킵

 


큰 프로그램은 무겁고 다루기 힘드므로 [커널, 쉘, 유틸리티]들로 잘게 나눈다

 

# 커널

- 항상 메모리에 상주

- 주요 코드는 C로 작성, 나머지는 어셈블리어(하드웨어 의존적, 빠른 속도 덕에)

- 3parts [프로세스 관리 / 파일 시스템 / IO시스템]

 

# 유틸리티

- 필요할 때만 메모리에 있다가 다시 사라짐

- 명령

 

# 쉘

- 커널과 유틸리티의 작업을 관리

- 키보드 입력 관리, 명령 수행 (interpreter)

 

# 파일

- sequence of bytes

 

 


 

# Single-user System

 - Windows

 - 보안 적음

 - 보기좋은 GUI

 

# Multi-user System

 - Linux

 - 보안 좋음

 

 

Kernel mode  vs  User mode

# kernel mode

- 모든 메모리에 접근이 가능

- 어떠한 명령어도 실행 가능함

 

# user mode

 - 나의 코드(local) 메모리에만 접근이 가능

 - 처리하는 명령어 제한됨

 

내가 작성한 my source를 gcc컴파일 -> my a.out chmodk -> trap 핸들러
-> trap(user에서 kernel mode로)

* 모든 프로그램은 user mode와 kernel mode를 왔다갔다하며 변경한다 *


 

# system_call

읽고 쓰는 명령어는 굉장히 많지만, 시스템 콜 명령어는 단 하나.

system_call()
- write와 같은 쓰기 함수는 system call이 발생
- int $0x80와 같은 형태는 intel cpu가 trap을 발생시켰다는 얘기
- trap이 발생 = cpu 모드를 user모드에서 kernel모드로 변경
- HW가 트랩핸들러 커널 내부의 함수인 sys_call()로 간다. (sys_call은 어셈블리어로 되어있음)
- system call이 유효하다면 테이블로부터 system call function 의 주소를 가져온다

system call 의 특징 : sys_명령어()로 이루어짐

 

 

user mode에서 kernel mode로 갔을 때 정보의 내용이 이동해야하는 상황이 발생

독립된 정보들임에도 불구하고 서로 access가 가능

kernel끼리정보 access가 가능.

 

# my source 명령어 처리 과정 순서

 - printf() 명령어 처리해야함
- 컴파일러가 gcc를 통해 라이브러리화함
- 시스템 콜 함수 write(2) <- 제한된 명령어
- 제한된 명령어로 trap이 발생함
-  trap핸들러가 kernelmodeㄹ 변경
- system call number 를 생성해서
- 접근

 

# 새로운 system call 작성할때

장점 :

실행이 간단해짐. 능력이 향상

 

단점 :

system call number를 부여해야 하는데 나의 보드에서만 사용가능하기에 사용 지양

 


## 프로세스 관리

user program이 있으면 그 프로그램들을 관리하기 위한 PCB블록이 커널 내부에 존재

하드웨어마다 대응하는 데이터 구조체가 커널 내부에 있어야함

 

 

# PCB의 구성

PID, 우선순위, 상태, 파일 실행(키보드, 모니터 이벤트), 경로(실행환경), 터미널(자원, 상태), 부모자식 프로세스

 

 

# 자식 프로세스 생성 순서

프로세스마다 스택은 두개이다 (커널스택, 컴파일러가 만들어주는 유저스택)

 

fork 1. PCB 공간 확보하고 부모의 PCB를 초기값으로 설정 <- 상속환경, 자원 공유

fork 2. 메모리 공간(이미지공간) 확보 (자식부모는 같은 코드)

exec 3. 디스크에서 새로운 이미지 가져오기

exec 4. 대기줄 선다

 

exec() : 디스크로부터 새로운 이미지를 가져온다

fork() : 부모 프로세스와 똑같은 프로세스를 만든다

ceating&nbsp; child process

- 실습

fork = call once, return twice = 한 번 실행하면 두 개가 반환된다

소스코드 및 실행 결과

pid = fork() 하는 순간 main코드와 같은 코드가 자식프로세스로 생성됨

'ESL 연구실 활동 > Kernel of Linux' 카테고리의 다른 글

리눅스커널강의 7~9강 (작성중)  (0) 2022.04.17
리눅스커널강의 5~6강  (0) 2022.04.15
리눅스커널강의 3~4강  (0) 2022.04.15
리눅스 커널 강의 0  (0) 2022.04.15