Linux/Unix kernel
- Linux / UNIX 운영 체제에서 다음 코드가 포함 된 부분 :
- 시스템 간 CPU 및 RAM 공유
- 서비스를 사용할 수 있도록 모든 시스템 콜 제공
- 주변기기 핸들링
커널은 디스크에서 RAM으로로드되는 프로그램
- 컴퓨터를 처음 켜면, RAM에 상주 종료시까지 실행
커널 서브 시스템
- 메모리 관리
- 프로세스 관리
- 프로세스 간 통신 (IPC)
- 입출력(마우스, 키보드 등)
- 파일 관리
Typical Linux/Unix structure(구조)
- Application : vi, nano ...
- mode : application user mode(User sapce/level)와 여러 하드웨어 동작 mode(Kernel space/level)로 나뉨
- Kernel Space level : 부팅, 시스템 초기화, easy-to-use interface 제공(여러 개 동시 사용 조절)
- Portable OS layer : 하드웨어에 독립적 운영(ARM, x86 등 모두 돌일한 시스템 콜 사용/ C, C++ 등 상위 레벨로 작성)
- Machin - dependent layer : 하드웨어와 직접적인 연결, HW , I/O디바이스 관리, 프로세서 관리, 메모리관리, 커널/유저모드 스위치, C와 같은 상위레벨, assembly와 같은 하위레벨의 언어로도 작성(ARM, x86 등 모두 다른 구성)
System Call
- 프로그램이 Linux/Unix kernel과 대화 할 수 있는 인터페이스를 제공
- 여러 함수들을 모아놓은 것 같음 - Unix/Linux kernel을 직접적으로 호출
- Unix family tree
POSIX(Portable Operating System Interface)
- 위의 family들은 System Call들이 약간씩 차이가 있음 -> 호환성이 떨어짐
- 해결책으로 POSIX라는 표준을 정함
- POSIX 1 : process, IPC, signal, C library - 함수정의, 파라미터 정의
- POSIX 1.b : 리얼타임에 관련된 내용 - 우선순위, 스케줄 real-time signal
- POSIX 1.c : 스레드, 스케줄링
- POSIX 2 : Shell과 utilities들 정의
Function calls
- 하나의 프로세스안의 function()에서 다른 funtion을 불러오는 것 - mode switch가 일어나지 않음
System calls
- 프로세스에서 커널에 있는 funtion을 호출 - mode switch : user -> kernel mode
- process <-> Os(HW acess) -> return 발생
시스템 콜 expensive(일어나는 순서)
- 프로세스 상태 저장
- 커널 모드로 스위치(CPU를 커널이 제어)
- 파라미터들(매개변수)이 정상동작하는지 검사 - 커널
- funtion요청 -> 요청한 기능 실행
- 커널의 상태 저장
- processor로 전환 mode switch : user mode로
- 커널은 발신자에게 CPU제어권 반환
- glibc에서 execve라는 function호출
- int 0x80 SW 인터럽트 걺 (ARM은 Swi라는 인터럽트를 걺)
- 커널모드로 스위치가 일어나 커널로 jump
- 시스템 콜 테이블에서 execve위치에서 수행
- 커널모드로 실행 후 에러코드 리턴
- 유저모드로 스위치 후 glibc에서 리턴, 다시 돌아옴
각종 시스템 콜들
- getuide() : User ID를 가져옴
- fork() : 자식 프로세스 생성
- exec() : 새로운 프로그램 수행
시스템콜 확인 : man systemcalls
※ 시스템 콜과 매칭되는 라이브러리 콜이 있는데 이 둘은 동시에 사용하면 안됨
man 명령어를 사용하여 시스템 콜을 어떻게 사용하는지 확인
ex) man 2 open
시스템 콜들을 카테고리별로 나누면?
시스템 콜 에러 반환
- 시스템 호출은 호출이 성공했는지 실패했는지를 나타내는 상태 값을 반환
- 이 상태 값은 호출이 성공했는지 항상 확인해야함
- 오류가 발생하면 모든 시스템 호출은 -1을 반환
- 모든 프로세스는 errno라는 시스템 전역 변수를 가지고 있으며 이는 마지막 시스템 호출 오류의 숫자 코드를 포함
- perror()이라는 함수는 시스템 호출 오류를 설명하는 라이브러리 함수이고 여기서 error의 의미를 해석 할 수 있음
#define EPERM 1 /* Not owner */
#define ENOENT 2 /* No such file or directory */
#define ESRCH 3 /* No such process */
#define EINSR 4 /* Interrupted System call */
#define EIO 5 /* I/O error */
…
-
open으로 text읽기 시도
-
에러가 나면 fd는 -1이 됨
-
에러넘버를 출력하고 perror에서 확인
'임베디드SW공학' 카테고리의 다른 글
[9주차]시스템 콜 파일(2) - 디렉토리 (0) | 2018.11.17 |
---|---|
[8주차]리눅스시스템 프로그래밍: File I/O (0) | 2018.11.11 |
[5주차]git (0) | 2018.10.16 |
[4주차]make (0) | 2018.10.07 |
[3주차]GCC&library (0) | 2018.10.07 |