리눅스 커널의 이해 중에서 1장. 소개 이원구 네트워크 실험실
목차 Part I : 리눅스와 다른 유닉스 계열 커널 비교 Part II : 하드웨어 의존성 Part III : 운영체제의 기초 개념 Part IV : 유닉스 파일시스템의 개요 Part V : 유닉스 커널 개요
Part I : 리눅스와 다른 유닉스 계열 커널 비교
UNIX SYSTEM ADMINISTRAION BOOK, 홍릉과학 출판사 참조 리눅스와 다른 유닉스 계열 커널 비교 유닉스 계보 UNIX SYSTEM ADMINISTRAION BOOK, 홍릉과학 출판사 참조 Version 6 (1975) (1979) BSD (1977) XENIX (1979 ~) System III (1982) System V.2 (1984) System V.3 (1986) System V.4 (1988) OSF/1 (1992) 4.4 BSD (1993) 4.2 BSD 4.3 BSD (1985) 후속 버전 영향 AT&T Bell 연구소
UNIX SYSTEM ADMINISTRAION BOOK, 홍릉과학 출판사 참조 리눅스와 다른 유닉스 계열 커널 비교 기능상의 유닉스/리눅스 계보 UNIX SYSTEM ADMINISTRAION BOOK, 홍릉과학 출판사 참조 BSD4.4 System V.3 OSF/1 System V.4 (1982)1 UNIX 정의 SunOS UNIX 구현 SCO UNIX LINUX IRIX DEC OSF/1 Solaris AIX HP-UX 10
리눅스와 다른 유닉스 계열 커널 비교 리눅스와 상용(기존) 유닉스 커널 지원 및 연관 주교재 P.37 - P.39에 해당 리눅스와 다른 유닉스 계열 커널 비교 리눅스와 상용(기존) 유닉스 커널 지원 및 연관 리눅스 커널은 모놀리틱(monolithic) 커널 커널 쓰레드 사용 멀티쓰레드 응용프로그램을 지원 리눅스는 비선점형(nonpreemptive) 커널 멀티프로세서를 지원 리눅스에는 SVR4의 스트림 입출력 서브 시스템에 해당하는 것이 없음
리눅스와 다른 유닉스 계열 커널 비교 리눅스의 장점 아무런 비용도 없이 완전한 유닉스 시스템을 설치 주교재 P.40 - P.41에 해당 리눅스와 다른 유닉스 계열 커널 비교 리눅스의 장점 아무런 비용도 없이 완전한 유닉스 시스템을 설치 모든 구성 요소를 완전히 재구성 가능 성능이 좋지 않은 값싼 하드웨어 플랫폼에서도 동작 하드웨어 구성 요소의 기능을 완전히 활용할 정도로 강력 소스 코드 품질을 위해 표준을 준수 커널은 매우 작고 아담하게 구성 기존의 여러 운영체제와 호환 가능 다른 운영체제에 비해 갱신 및 패치 용이
Part II : 하드웨어 의존성?
./arch와 ./include 디렉토리에 존재 주교재 P.42에 해당 하드웨어 의존성? 하드웨어 의존적인 소스 코드와 하드웨어에 무관한 소스코드 분리 리눅스가 지원하는 9개의 하드웨어 플랫폼에 해당하는 9개의 서브 디렉토리 존재 arm : Acorn 개인용 컴퓨터 alpha : 컴팩 알파 워크스테이션 i386 : 인텔 80x86이나 IBM 호환 개인용 컴퓨터 m68k : 모토로라 MC680x0 마이크로를 탑재한 개인용 컴퓨터 mips : 실리콘 그래픽스의 MIPS 마이크로프로세서를 사용하는 워크스테이션 ppc : 모토로라 IBM의 파워PC 마이크로프로세서를 사용하는 워크스테이션 sparc : SUN 사의 SPARC 마이크로프로세서를 사용하는 워크스테이션 sparc64 :SUN 사의 Ultra SPARC 마이크로프로세서를 사용하는 워크스테이션 s390 : IBM 시스템/390 메인 프레임 ./arch와 ./include 디렉토리에 존재
주교재 P.43에 해당 리눅스 버전(커널 버전) 리눅스 버전 번호 교재 집필시 버전 : 2.3.99-pre8 프리 릴리즈 리눅스 커널 2.4는 2001년 1월에 공식 발표 가장 최근의 리눅스 커널 버전은 2.4.19/2.5 베타버전 2 . 2 . 14 버전 번호 짝수 번호는 안정된 커널 의미 안정된 릴리즈 번호 2 . 3 . 51 홀수 번호는 개발 커널 의미 개발 릴리즈 번호
Part III : 운영체제의 기초개념
운영체제의 기초 개념 = 운영체제의 기본적인 구현 두 가지 하드웨어 구성 요소와 상호 작용하여, 주교재 P.44에 해당 운영체제의 기초 개념 운영체제의 기본적인 구현 두 가지 하드웨어 구성 요소와 상호 작용하여, 하드웨어 플랫폼에 들어 있는 저수준의 프로그래밍 가능한 모든 요소를 서비스. 컴퓨터 시스템에서 동작하는 응용프로그램(또는 사용자 프로그램)을 위한 실행 환경 제공 가정 : 운영체제 = 커널 Nonprivileged mode Privileged mode user mode kernel mode CPU 측면 kernel 측면 =
운영체제의 기초 개념 멀티유저 시스템 정의 요구 사항 주교재 P.45 – P.46에 해당 운영체제의 기초 개념 멀티유저 시스템 정의 두 명 이상의 사용자가 각자 여러 응용 프로그램을 동시에 그리고 서로 독립적으로 실행할 수 있는 컴퓨터 요구 사항 사용자와 신원을 확인할 수 있는 인증 메커니즘 버그가 있는 프로그램이 시스템의 다른 응용프로그램에 대한 실행을 막을 수 있는 메커니즘 악의적인 사용자 프로그램이 다른 사용자의 활동을 방해하거나 염탐하는 것을 막을 수 있는 메커니즘 각 사용자에게 할당되는 자원의 양을 제한할 수 있는 회계(accounting) 메커니즘 각 응용프로그램이 다른 사용자가 실행한 응용프로그램이 어떤 일을 하는지 신경쓰지 않고 자신의 작업을 수행할 수 있음 같은 시간에 여러 응용프로그램이 동작 중인 상태에 있으며, CPU나 메모리, 하드디스크 같은 여러 자원을 사용하기 위해 경쟁
운영체제의 기초 개념 사용자와 그룹 UID(User ID) GID(Group ID) 주교재 P.46 – P.47에 해당 운영체제의 기초 개념 사용자와 그룹 UID(User ID) 각 사용자의 개인 영역을 식별하는 고유 번호로 구별 Login Name & Password로 사용자 확인 GID(Group ID) 사용자가 속한 그룹을 식별하는 고유 번호로 구별 시스템상의 각 파일은 하나의 그룹과 연관 각 파일에 대한 사용자 그룹의 권한 설정 superuser(root 또는 supervisor) 시스템 유지 작업을 위한 특별한 사용자 일반적인 보호 메커니즘을 적용하지 않음
운영체제의 기초 개념 프로세스 정의 프로세스 & 쓰레드 실행상태에 있는 프로그램의 인스턴스(instance) 주교재 P.47 – P.48에 해당 운영체제의 기초 개념 프로세스 정의 실행상태에 있는 프로그램의 인스턴스(instance) 실행하고 있는 프로그램의 실행 컨텍스트(context) 프로세스 & 쓰레드 CPU 레지스터 값; 프로세스의 총체적이고도 순간적인 상태 프로세스 주소공간 쓰레드 텍스트 컨텍스트 CPU 상태 스택 데이터 ‘OS 제작의 정석’ P.315 참조
‘Linux Kernel Programming’에서 참조 운영체제의 기초 개념 커널 커널의 정의 컴퓨터내의 자원을 사용자 프로그램이 사용할 수 있도록 관리하는 프로그램 기능 프로세스 관리 / 파일시스템 관리 / 메모리 관리 / 네트워크 관리 사용자 관점에서의 커널 ‘Linux Kernel Programming’에서 참조 User Application Library & Shell System Call Kernel
‘Linux Kernel Programming’에서 참조 운영체제의 기초 개념 Linux 커널의 기본구조 _ 기능적인 분류 ‘Linux Kernel Programming’에서 참조 User Programming & System Library CPU, RAM, DISK, CD, Console, Solaris & Parallel port, Network Card, Board specific feature, etc Process Management Architecture Dependency Memory Manager Device Driver (Character, Block) File System Tvoes Networking BSD Socket INET Network Protocol Interface Drivers User Kernel PHYSICAL
‘Linux Kernel Programming’에서 참조 운영체제의 기초 개념 커널 구조 Integrated Kernel vs. Micro Kernel ‘Linux Kernel Programming’에서 참조 System Service API Integrated Kernel Architecture Micro Kernel Architecture Server Security 통합 커널(또는 모놀리틱 커널) 마이크로 커널 각 커널 계층이 하나의 커널 프로그램으로 통합 프로세스를 대신하여 커널 모드에서 동작 수행속도가 빠르나 업그레이드가 어려움 적은 기능을 커널에 요구 마이크로 커널에 메모리 할당, 장치 드라이버, 시스템 콜 핸들러 기능 구현 속도가 느리나, 업그레이드가 쉬움
Part IV : 유닉스 파일시스템의 개요
유닉스 파일시스템의 개요 파일 유닉스 파일은 일련의 바이트로 이루어진 정보를 담는 그릇 주교재 P.50 – P.52에 해당 유닉스 파일시스템의 개요 파일 유닉스 파일은 일련의 바이트로 이루어진 정보를 담는 그릇 트리의 모든 노드(node)는 디렉토리명을 의미 / dev . . . home bin usr fd0
유닉스 파일시스템의 개요 하드 링크와 소프트 링크 하드 링크 소프트 링크 정의 하드 링크의 두 가지 제약 특성 주교재 P.52 – P.53에 해당 유닉스 파일시스템의 개요 하드 링크와 소프트 링크 하드 링크 정의 디렉토리에 있는 파일명을 파일 하드 링크(또는 링크) 하드 링크의 두 가지 제약 디렉토리에 대한 하드링크를 만들 수 없다. 링크는 동일한 파일시스템에 들어 있는 파일 사이에서만 만들 수 있다. 소프트 링크 다른 파일의 임의 경로명을 포함하는 짧은 파일 특성 경로명은 파일시스템 내의 어떠한 파일도 가리킬 수 있으며, 실제로 존재하지 않는 파일을 가리킬 수도 있다.
(17장. “ Ext2 파일시스템”에서 자세히 설명) 입출력 장치와 커널에 통합되어 있는 장치 드라이버와 연관 주교재 P.53에 해당 유닉스 파일시스템의 개요 파일 유형 유닉스 파일 유형 정규 파일 디렉토리(directory) 심볼릭 링크(symbolic link) 블록 장치에 해당하는 장치 파일 문자 장치에 해당하는 장치 파일 파이프(pipe)와 지정 파이프(named pipe : FIFO라고도 함) 소켓(socket) 모든 유닉스 파일시스템의 구성요소 (17장. “ Ext2 파일시스템”에서 자세히 설명) 입출력 장치와 커널에 통합되어 있는 장치 드라이버와 연관 (13장. “입출력 장치 관리”에서 자세히 설명) 프로세스간 통신을 위해 사용하는 특별한 파일 (13장. “입출력 장치 관리”에서 자세히 설명)
유닉스 파일시스템의 개요 파일 디스크립터와 아이노드 POSIX 표준에서 규정한 최소한의 속성 제공 주교재 P.53 – P.54에 해당 유닉스 파일시스템의 개요 파일 디스크립터와 아이노드 유닉스는 파일과 파일 디스크립터를 명확하게 구별 POSIX 표준에서 규정한 최소한의 속성 제공 파일 유형 파일과 연계되어 있는 하드 링크의 수 바이트 단위로 된 파일 길이 장치 ID (즉, 파일을 포함하고 있는 장치의 식별자) 파일시스템에 들어 있는 파일을 구별할 수 있는 아이노드 번호) 파일을 소유하고 있는 사용자의 ID 파일의 그룹 ID 아이노드 상태 관련 시간 기록 접근 권한과 파일 모드 (12장. “ 가상파일시스템”에서 자세히 설명)
“리눅스 매니아를 위한 커널 프로그래밍”에서 참조 유닉스 파일시스템의 개요 아이노드 구조 “리눅스 매니아를 위한 커널 프로그래밍”에서 참조 i_dev, i_ino, i_mode, i_nlink i_uid, i_gid i_rdev, i_size i_atime, ctime, mtime … 12 direct block 3 indirect block type (4bit) u g s S_IFSOCK S_IFLNK S_IFIFO
유닉스 파일시스템의 개요 접근 권한과 파일 모드 파일 사용자의 세 유형 파일 모드를 정의하기 위한 세 플래그 주교재 P.54 – P.55에 해당 유닉스 파일시스템의 개요 접근 권한과 파일 모드 파일 사용자의 세 유형 파일을 소유하고 있는 사용자 소유자를 제외하고 파일과 같은 그룹에 속해 있는 사용자 그 밖의 사용자 파일 모드를 정의하기 위한 세 플래그 suid : 어떤 파일을 실행하는 프로세스는 보통 프로세스 소유자의 UID를 갖음 sgid : 어떤 파일을 실행하는 프로세스는 보통 프로세스 그룹의 GID를 갖음 sticky : stick 플래그가 설정된 실행 파일은 실행 후 종료되더라도 메모리에 프로그램을 유지하도록 커널에 요청(현재에는 사용되지 않음)
유닉스 파일시스템의 개요 파일을 다루는 시스템 콜 파일 열기 파일 닫기 주교재 P.55 – P.59에 해당 유닉스 파일시스템의 개요 파일을 다루는 시스템 콜 파일 열기 fd = open(path, flag, mode); 열린 파일(open file) 객체를 생성 파일 디스크립터(file descriptor)를 반환 파일 닫기 res = close(fd); //파일 디스크립터의 fd에 해당하는 열린 팡리 객체를 해제 (8장. “시스템 콜과 12장. “ 가상파일시스템”에서 자세히 설명) 새로 생성할 파일의 접근 권한 지정 파일을 어떻게 열 것인지 결정 (읽기, 쓰기, 읽기/쓰기, 추가) 열 파일 경로명(상대/절대 경로)
유닉스 파일시스템의 개요 파일을 다루는 시스템 콜 열린 파일에 접근하기 파일명 변경과 파일 삭제 lseek() 시스템 콜 주교재 P.55 – P.59에 해당 유닉스 파일시스템의 개요 파일을 다루는 시스템 콜 열린 파일에 접근하기 lseek() 시스템 콜 newoffset = lseek(fd, offset, whence); read() 시스템 콜 nread = read(fd, buf. count); 파일명 변경과 파일 삭제 res = rename(oldpath, newpath); // 파일 링크 이름을 변경 res = unlink(pathname); // 파일의 링크 횟수를 줄이고, 해당 디렉토리 엔트리를 제거 (12장. “ 가상파일시스템”에서 자세히 설명)
‘Linux Core Kernel’에서 참조 유닉스 파일시스템의 개요 system_call 흐름도 ‘Linux Core Kernel’에서 참조 system_call v86_signal_return reschedule signal_return restore_all badsys tracesys tracesys_exit ret_from_sys_call ret_with_reschedule ret_from_exception handle_softirq ret_from_intr
Part V : 유닉스 커널 개요
유닉스 커널 개요 프로세스와 커널 모드 프로세스 구현 커널 프로세스 주교재 P.59 – P.61에 해당 유닉스 커널 개요 프로세스와 커널 모드 커널 프로세스 커널 주소 공간의 커널 모드에서 실행 사용자와 상호 작용을 하지 않는다. 따라서 터미널 장치가 불필요 일반적으로 시스템을 시작할 때 만들어지고, 시스템을 종료할 때까지 존재 프로세스 구현 프로세스의 실행 중단시, 커널에 의해 프로세스 디스크립터에 저장 프로그램 카운터와 스택 포인터 레지스터 범용 레지스터 부동 소수점 레지스터 프로세서 제어 레지스터 메모리 관리 레지스터
유닉스 커널 개요 사용자 모드와 커널 모드 사이의 전환 주교재 P.59 – P.61에 해당 프로세스 1 프로세스 1 프로세스 2 프로세스 2 사용자 모드 커널 모드 시스템 콜 핸들러 스케 줄러 인터럽트 핸들러
유닉스 커널 개요 프로세스 주소 공간 프로세스는 자신의 주소 공간에서 실행 주교재 P.65에 해당 유닉스 커널 개요 프로세스 주소 공간 프로세스는 자신의 주소 공간에서 실행 사용자 모드에서 실행되는 프로세스는 자신만의 스택과 데이터, 코드 영역 사용 재진입이 가능하므로 커널 제어 경로가 실행 주소 공간의 일부를 프로세스 사이에서 공유하는 경우 메모리의 절약을 위해 필요 Ex) 동일 프로그램 사용 공유 메모리 기법 사용 시스템 V 리눅스
유닉스 커널 개요 동기화와 임계 영역 비선점형 커널 인터럽트 금지 세마포어 스핀락 데드락 피하기 주교재 P.61 – P.69에 해당 유닉스 커널 개요 동기화와 임계 영역 비선점형 커널 프로세스가 실행 중이면 임의 보류나 프로세스 교체를 할 수 없음 인터럽트 금지 프로세스가 임계 영역에 들어가기 전에 모든 하드웨어 인터럽트 금지 프로세스가 임계 영역을 빠져나오면 인터럽트 허용 세마포어 자료 구조와 연계된 간단한 카운터 스핀락 세마포어와 유사하지만 프로세스 목록이 없음 프로세스가 사용하려고 하는 락을 다른 프로세스가 사용하려고 잠그면, 락이 풀릴 때까지 명령어를 실행하며 프로세스가 회전(spin) 데드락 피하기 (11장. “ 커널 동기화”에서 자세히 설명)
‘Linux Kernel Programing’에서 참조 주교재 P.69 – P.71에 해당 유닉스 커널 개요 시그널과 프로세스간 통신 정의 프로세스간의 의사 전달 수단 프로세스간에 실행을 동기적으로 맞출 수 있는 방법을 제공 리눅스에서 지원하는 프로세스간 통신 시그널, FIFO, 파이프 소켓 … 네트워크 세마포어, 메시지 큐, 공유메모리 … 시스템 V ‘Linux Kernel Programing’에서 참조
Kern_ipc_perm() 함수, flag 반환 주교재 P.69 – P.71에 해당 유닉스 커널 개요 프로세스간 통신 프로세스 시그널 파이프 FIFO 세마포어 메시지 큐 공유메모리 IPC 방법 = IPC 객체 Kern_ipc_perm() 함수 커널에 의해 생성 key uid gid cuid cgid mode seq Kern_ipc_perm() 함수, flag 반환
‘Linux Kernel Programing’에서 참조 주교재 P.69 – P.71에 해당 유닉스 커널 개요 시그널과 프로세스간 통신 signal 흐름 ‘Linux Kernel Programing’에서 참조 프로세스 시그널 핸들러 등록 시스템 콜 시그널 핸들러 시그널 전송 masking / unmasking pending 상태 중단 무시(ignore) core dump 현 상태 저장 이전 상태 복원 send_singal() sys_rt_signalpromask() sys_rt_sigpending() . p78. 표 참조 p79 . ~/kernel/singal.c 코드 참조
유닉스 커널 개요 메모리 관리 가상메모리 가상 메모리의 단점 주교재 P.73 – P.77에 해당 유닉스 커널 개요 메모리 관리 가상메모리 추상적 메모리 개념으로 메모리 관리 유닛(MMU) 사이에 논리적 계층으로 동작 가상 주소 공간(virtual address space) 개념 가상 메모리의 장점 여러 프로세스를 동시에 실행 물리 메모리보다 더 많은 메모리를 요구하는 응용프로그램 실행 프로그램 코드의 일부분을 메모리에 로드하여 프로세스 실행 각 프로세스가 사용 가능한 물리 메모리의 부분 집합에 접근 가능 프로세스가 라이브러리나 단일 메모리 이미지에 대한 공유가 가능 재배치(relocation)이 가능 하드웨어에 의존하지 않는 코드의 작성 가능 가상 메모리의 단점 메모리 단편화 연속된 메모리 영역을 사용하는 경우에 단편화 되어 있으면 메모리 요구가 실패
BSS : Block Shared by Symbol 주교재 P.73 – P.77에 해당 유닉스 커널 개요 가상 메모리 구조 발표 자료 #39에서도 참조가능 kernel stack text data bss kernel space : 1 GB user space : 3 GB 가상 메모리 : 4 GB 3 GB heap /*지역 변수*/ argc, argv, etc.. /*전역 변수*/ a, b, etc.. /*명령어*/ BSS : Block Shared by Symbol
유닉스 커널 개요 메모리 관리 커널 메모리 할당자 메모리 할당자가 가져야 할 특징 커널 메모리 할당자의 종류(76페이지 참조) 주교재 P.73 – P.77에 해당 유닉스 커널 개요 메모리 관리 커널 메모리 할당자 시스템의 모든 부분에서 메모리 영역에 관련한 요청을 처리하는 서브시스템 커널 서브시스템 또는 사용자 프로그램이 시스템 콜을 요청하여 호출 메모리 할당자가 가져야 할 특징 빠른 수행속도 낭비되는 메모리 양의 최소화 메모리 단편화의 최소화 다른 메모리 관리 서브시스템과의 협력 커널 메모리 할당자의 종류(76페이지 참조)
유닉스 커널 개요 메모리 관리 프로세스의 가상 주소 공간 다루기 메모리 영역으로 구성한 가상 주소 공간 할당 주교재 P.73 – P.77에 해당 유닉스 커널 개요 메모리 관리 프로세스의 가상 주소 공간 다루기 커널은 프로세스의 가상 주소 공간을 메모리 영역 디스크립터 목록으로 저장 메모리 영역으로 구성한 가상 주소 공간 할당 실행 코드 초기화 데이터 초기화되지 않은 데이터 초기 프로그램 스택 공유 라이브러리에 필요한 실행 코드와 데이터 힙
(16장. “ 스와핑 : 메모리 해제 방법”에서 자세히 설명) 주교재 P.73 – P.77에 해당 유닉스 커널 개요 메모리 관리 스와핑과 캐싱 스와핑 프로세스가 사용할 수 있는 가상 주소 공간의 크기를 확장 페이지 프레임 내용을 기본 스와핑 단위로 취급 스왑 아웃된 페이지 접근시 예외 발생 에외 핸들러가 새로운 페이지 프레임 할당후, 이전 내용으로 초기화 캐싱 메모리에 비해 하드디스크가 느리기 때문에 병목현상 발생 디스크의 읽은 블록에 대응하는 디스크 버퍼를 램에 로드 디스크에 기록하는 것을 나중으로 미루는 정책 주기적으로 바뀐 버퍼를 디스크에 기록 (16장. “ 스와핑 : 메모리 해제 방법”에서 자세히 설명)
유닉스 커널 개요 장치 드라이버 장치 드라이버 사용시의 이점 커널은 장치 드라이버를 통해 입출력 장치와 상호 작용 주교재 P.78 – P.79에 해당 유닉스 커널 개요 장치 드라이버 커널은 장치 드라이버를 통해 입출력 장치와 상호 작용 장치를 제어하는 자료 구조와 함수로 이루어짐 장치 드라이버 사용시의 이점 장치 고유의 코드를 특정 모듈에 삽입 가능 인터페이스 명세만으로 새로운 장치 추가 가능 모든 장치를 동일하게 취급하고, 같은 인터페이스로 접근 시스템을 재부팅하지 않고도 동적으로 로드할 수 있는 모듈로 장치 드라이버를 만들 수 있음
(Device Driver Interface) 주교재 P.78 – P.79에 해당 유닉스 커널 개요 장치 드라이버 인터페이스 P 시스템 콜 인터페이스 가상 파일시스템 문자 장치 파일 블록 장치 파일 tty 드라이버 테이프 디스크 커널 DDI (Device Driver Interface)
Part VI : 참고문헌 Understanding the LINUX KERNEL, O’REILLY Add-on Linux Kernel Programming, 글로벌 LINUX KERNEL INTERNALS , F1에프원 리눅스 매니아를 위한 커널 프로그래밍, 교학사 UNIX SYSTEM ADMINISTRAION BOOK, 홍릉과학 출판사 LINUX DEVICE DRIVERS, O’REILLY OS 제작의 정석, 가남사 Linux Core Kernel, Maxwell
Part VII : Q & A