리눅스 커널
커널은 5개의 기능 블럭으로 구분한다.
- 프로세스 관리
- 메모리 관리
- 파일 시스템 관리
- 디바이스 관리
- 네트워크 관리
디렉토리 |
내용 |
arch |
CPU 종속적인 코드 ARM, MIPS와 같이 프로세서마다 독자적인 하위 디렉터리 존재 |
crypto |
암호화 API |
Documentation |
커널 하위 시스템에 대한 간략한 설명 |
drivers |
장치 드라이버와 주변 장치 컨트롤러 |
fs |
파일 시스템 구현과 관련된 코드 |
include |
커널 헤더 파일 |
init |
커널 시작 및 초기화 관련 코드 |
ipc |
프로세스 간 통신 관련 코드 ex. 메시지 큐, 세마포어, 공유 메모리 |
kernel |
스케줄러, 인터럽트 처리, 락킹 등 기본 커널에서 아키텍처 중립적인 부분이 구현 |
lib |
일반적인 Hashing, CRC (Cyclic Redundancy Code) 계산 함수 같은 라이브러리 루틴 |
mm |
메모리 관리 구현 코드 |
net |
IPv4, IPv6, 블루투스와 같은 네트워크 프로토콜 |
scripts |
커널 빌드에 사용할 스크립트 |
security |
보안용 프레임워크 |
sound | 리눅스 오디오 하위 시스템 |
usr |
초기 유저 공간 코드 |
사용자 영역과 커널 영역
사용자 영역
- 응용 프로그램이 동작하기 위해 사용되는 메모리 공간
- stack 영역
- 프로그램 시행시 지역 변수나 환경 변수와 같은 변수들이 위치 - heap 영역
- 동적 메모리 할당 영역 - bss 영역
- 초기화 되어 있지 않은 전역 변수나 정적 변수들이 저장.
- 로더에 의해 메모리로 적재될 때 공간을 확보한 후, 0으로 초기화 - data 영역
- 초기화되어 있는 전역 변수들이 저장 - text 영역
- 프로그램 코드(함수나 일반 처리문 등)와 읽기 전용 데이터(상수)로 이루어짐
커널 영역
- 운영체제가 실행되기 위해서 필요한 메모리 공간
커널에 자원 처리를 요청하는 방법
- 시스템 콜 방식
- 소프트웨어 인터럽트
- 응용 프로그램으로 하여금 하드웨어나 다른 운영체제 리소스를 접근할 수 있게 해준다.
- 시스템 콜 핸들러
- 유저 공간의 응용 프로그램이 직접 커널 코드를 호출하는 것은 불가능
- 소프트웨어 인터럽트
-> 커널은 보호된 메모리 공간에 있으므로 시스템이 커널 모드로 전환되어야 함
- 유저공간에서 커널 모드로 진입하기 위해 exception이 발생하면 시스템은 커널 모드로 전환되어 exception handler를 실행한다.
- 이 핸들러가 시스템 콜 핸들러가 된다.
- 시스템 콜 핸들러 open() 수행과정
- test.c main()에서 open() 호출
- libc.a에서 open()
시스템콜의 고유번호를 eax 레지스터에 저장
SW 인터럽트 발생 - ARM에서 system_call() 명령이 저장된 vector table 참조
- vector_swi()에서 open() 명령의 번호를 참조하여 sys_open() 호출
- sys_open()은 dev_open()을 호출하면서 실제 open 명령을 수행
리눅스 부팅 과정
- Power on
ROM-BIOS 프로그램 실행
- BIOS (Basic Input/Output System): 메모리의 특정 번지로 자동 로드되어 실행됨
POST(Power On Self Test) 수행
- 장착된 H/W가 인식됨. (예: 시리얼 장치, 마우스 장치, 사운드 장치)
- H/W의 물리적인 손상체크와 초기화가 병행
- 부팅 매체 (Disk, CD_ROM 등) 검색
- MBR(Master Boot Record)를 읽어, 부트로더(GRUB)를 로드시킨다.
GRUB 실행(부트로더 실행)
- 부팅메뉴 선택
- /boot/grub/grub.conf 파일
- kernel 이미지 로드
- swapper 프로세스 호출
swapper 프로세서 (PID=0)
- 커널 이미지 압축을 해제
- 각 장치 드라이브들을 초기화
- 루트( / ) 파일 시스템을 read-only로 마운트
- 파일시스템 검사
- 루트( / ) 파일시스템을 read-write 모드로 마운트
- init 프로세스 (PID=1)
init 프로세스 (PID=1)
- 리눅스에서 모든 프로세스는 그 실행과 함께 설정파일을 읽어들인다.
- init 프로세스는 /etc/inittab이라는 설정 파일을 읽어들여 무엇을, 어떻게, 언제 실행할 것인가를 결정하여 커널 서비스 시작
출처 http://cheonee.tistory.com/entry/리눅스-커널과-디바이스-드라이버
출처 http://cherub.sungkyul.edu/~web/jinboard/files/63_boot.pdf
출처 http://www.linuxlab.co.kr/docs/5-2.htm
출처 http://yongho1037.tistory.com/563
출처 http://young3276.tistory.com/4
'Linux Driver' 카테고리의 다른 글
캐릭터 디바이스 드라이버 (Character Device Driver) (0) | 2018.08.30 |
---|---|
디바이스 드라이버 (Device Driver) - 1. 개요 (1) | 2018.08.29 |
커널 모듈 (Kernel Module) (0) | 2018.08.29 |
디바이스 드라이버를 위한 커널 서비스 (Kernel Service for Device Driver) - 2. 인터럽트 처리 (0) | 2018.08.29 |
디바이스 드라이버를 위한 커널 서비스 (Kernel Service for Device Driver) - 1. 변수와 메모리 할당 (0) | 2018.08.29 |