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(일어나는 순서)

  1. 프로세스 상태 저장
  2. 커널 모드로 스위치(CPU를 커널이 제어)
  3. 파라미터들(매개변수)이 정상동작하는지 검사 - 커널
  4. funtion요청 -> 요청한 기능 실행
  5. 커널의 상태 저장
  6. processor로 전환 mode switch : user mode로
  7. 커널은 발신자에게 CPU제어권 반환

  1. glibc에서 execve라는 function호출
  2. int 0x80 SW 인터럽트 걺 (ARM은 Swi라는 인터럽트를 걺)
  3. 커널모드로 스위치가 일어나 커널로 jump
  4. 시스템 콜 테이블에서 execve위치에서 수행
  5. 커널모드로 실행 후 에러코드 리턴
  6. 유저모드로 스위치 후 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 */

 …

  1. open으로 text읽기 시도

  2. 에러가 나면 fd는 -1이 됨

  3. 에러넘버를 출력하고 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

+ Recent posts