Already learned : System Programming
- Usage of utility programs :
- ls, cat, cp, pwd, ps, grep, …
- Usage of system call :
- read, write, fork, select, exit, …
- Usage of utility programs :
📝 Studying about :
- Reading/Understanding/Modifying OS kernel code to understand 5 concepts of OS
- interrupt
- process
- file
- memory
- I/O
System env setting
- 가상환경 : VirtualBox
- 리눅스 배포판 : Gentoo
- linux kernel + extra software(compiler,editor…)
- 리눅스 커널 버전 : 2.6
Linux Command
- $… | less : 방향키로 커서 이동 / 페이지 출력
- $… | grep -option “…” : 명령어 출력에서 원하는 string의 출력 결과만 get
- $find -name “…” : 문자열에 해당하는 directory나 file을 모두 찾는다. ‘find .’의 경우는 현재 directory 에서 찾는다. 표현식은 type, size, delete 등이 있음.
1. Kernel Reading
- Linux File tree
- bin : 리눅스 명령어의 실행 파일이 내장되어있다. (ls,chmod,pwd,grep …)
- etc : 시스템 구성 파일이 내장되어 있다. (password, hostname …)
- root : root user의 home directory로 리눅스 커널이 내장되어있다.
- linux-2.6.25.10 (리눅스 커널)
- init : 리눅스 초기세팅(부팅) 코드 내장
- arch : interrupt code 내장
- kernel : process code 내장
- fs : file code 내장
- mm : memory code 내장
- drivers : I/O code 내장
- linux-2.6.25.10 (리눅스 커널)
- usr : 라이브러리, 헤더파일 내장
- 리눅스 커널 부팅 시 /init/main.c 내부의 start_kernel() 함수 동작
- trap_init() : 시스템 초기 세팅
- init_IRQ() : interrupt 설정하고 동작시킴.
- sched_init() : init task가 사용하는 cpu 번호 할당, pid hash table을 초기화
- time_init() : 현재 시간에 대한 정보 제공
- console_init() : console을 사용하기 위한 시리얼 장치 초기화
- mem_init() : 사용 가능한 memory 초기화
- rest_init() : kernel_thread()함수 호출하여 별도 스레드 생성. kernel_init() 실행하여 idle process가 된다.
→ start_kernel() 함수의 이름처럼 커널을 실행하기 위한 init, 즉 기초 세팅에 대한 함수가 실행된다.
- 함수 내부에 printf 가 아닌 printk를 쓰는 이유
- printf가 내장된 Standard C 라이브러리를 사용할 수 없으므로 커널 이미지 내 정의된 log level의 printk 함수 사용
- Linux File tree
2. Compiling Linux Kernel
- Linux File tree
- bin : 리눅스 명령어의 실행 파일이 내장되어있다. (ls,chmod,pwd,grep …)
- etc : 시스템 구성 파일이 내장되어 있다. (password, hostname …)
- root : root user의 home directory로 리눅스 커널이 내장되어있다.
- linux-2.6.25.10 (리눅스 커널)
- init : 리눅스 초기세팅(부팅) 코드 내장
- arch : interrupt code 내장
- kernel : process code 내장
- fs : file code 내장
- mm : memory code 내장
- drivers : I/O code 내장
- linux-2.6.25.10 (리눅스 커널)
- usr : 라이브러리, 헤더파일 내장
- 리눅스 커널 부팅 시 /init/main.c 내부의 start_kernel() 함수 동작
- trap_init() : 시스템 초기 세팅
- init_IRQ() : interrupt 설정하고 동작시킴.
- sched_init() : init task가 사용하는 cpu 번호 할당, pid hash table을 초기화
- time_init() : 현재 시간에 대한 정보 제공
- console_init() : console을 사용하기 위한 시리얼 장치 초기화
- mem_init() : 사용 가능한 memory 초기화
- rest_init() : kernel_thread()함수 호출하여 별도 스레드 생성. kernel_init() 실행하여 idle process가 된다.
→ start_kernel() 함수의 이름처럼 커널을 실행하기 위한 init, 즉 기초 세팅에 대한 함수가 실행된다.
- 함수 내부에 printf 가 아닌 printk를 쓰는 이유
- printf가 내장된 Standard C 라이브러리를 사용할 수 없으므로 커널 이미지 내 정의된 log level의 printk 함수 사용
- Linux File tree
3. Interrupt (external event)
- interrupt
- 정의 : external event를 의미. 각 interrupt마다 번호가 붙어있음
- hw interrupt :
- keyboard(33), mouse moved(44), timer ticks, packet arrives, … etc
- sw interrupt :
- system function call (128)
- exception (ex. divide by zero : 0)
- ISR (Interrupt Service Routine)
- 정의 : hw/sw interrupt가 발생했을 때 실행되는 함수 또는 루틴
- 종류 :
- ISR1
- 정의 : 첫번쨰로 발생한 interrupt 처리 함수/루틴
- 위치 : arch/x86/kernel/entry_32.S
- ISR2
- 두번째로 발생한 interrupt 처리 함수/루틴
- 위치 : interrupt 종류마다 상이.
ex) do_divide_error : arch/x86/kernel/traps_32.c
- ISR1
- 예시 : ISR1은 키보드 입력을 감지하면 실행.
만약, 조합키(Ctrl,Shift,Alt)가 있는 경우 ISR2가 실행됨.
- IDT (Interrupt Descriptor Table)
- 정의 : interrupt 및 예외를 처리하기 위한 시스템 데이터 구조(talbe)
- 예시 : 특정 인터럽트 발생 시 프로세서는 해당 interrupt number를 사용하여 IDT에서 해당 ISR로 분기하여 처리
keyboard 입력(INT33) → IDT[33] → ISR1 → ISR2
- cpu execution cycle : detect interrupt
- Handle INT x
- Interrupt 발생 (press ‘r’)
- stop current process & save
- 현재 프로세스 멈추고, 발생한 interrupt가 끝나면 돌아가기 위함
- jump to interrupt[1]
- IDT에서 키보드 입력(INT 33)에 해당하는 ISR로 분기
- atkbd_interrupt
- ISR2로 분기하여, screen에 ‘r’을 출력
- interrupt
Uploaded by N2T