코드로 읽는 리눅스 드라이버 2장

부팅 순서

X86기반에서는 BIOS->GRUB->실제모드커널->보호모드커널->init프로세스->사용자 프로세스와데몬

Low-mem

일반적으로 주소 지정이 가능한 커널 메모리 영역. kalloc()이 이 영역의 주소를 반환한다.

initrd

메모리에 상주하는 가상 디스크 이미지로, 부트로더가 올린다.

커널 시동 직후 초기 루트 파일 시스템

커널2.6에서는 initrd에 비해 여러가지 장점이 많은 initramfs기능이 추가됨

I/O 스케줄러

2.6에서는 데드라인, 예측(Default), CFQ, Noop이라는 4가지 I/O 스케줄러를 제공

init

소스중에서 ini/main.c코드를 보면 initramfs에서 init을 찾는다

init은 /etc/rc.sysinit의 초기화 스크립트를 수행한다

jiffies

시스템 시동 이후 시스템 타이머를 호출한 횟수를 저장한다

따라서 초당 jiffies가 올라가는 수는 타이머 해상도에 의존적이다

jiffies와 관련된 함수중 tme_after()는 값을 비교해주는 매크로이며, 오버플로우를 고려했다

timeafter(), timebefore(), timeaftereq(), timebeforeeq()

getjiffies64() 라는 함수가 있음

긴 지연

jiffies 단위의 지연을 긴 지연이라고 한다.

busy-wait방식:

while(time_before(jiffies, timeout)) continue;

sleep방식:

schedule_timeout();

(주의)타임 아웃의 하한값만 보장함, 더 잘수도 있다

또 다른 함수는, waiteventtimeout(), msleep()

sleep방식은 process문맥에서만 가능

타이머

미래에 특정 시점에 호출하려는 API

관련함수 : inittimer(), addtimer(), timerpending(). modtimer(), del_timer()

한번만 호출되므로 주기적호출을 하기 위해서는 다시 생성

사용자 영역 함수 : setitimer(), getitimer()

짧은 지연

jiffy 미만의 지연을 말함, 유일한 방법 Busy-wait

관련 API : mdelay(). udelay(), ndelay()

현재 시간

하드웨어가 지원하는 가장 높은 해상도로 시각을 읽으려면

do_gettimeofday()

그 외, time(), localtime(), mktime(), gettimeofday()

원자적 함수

atomic_inc() 같이, 따로 처리를 안해줘도 원자적인 수행이 가능한 함수가 있다

해당 함수들의 목록은 include/asm/atomic.h 에 있음

read-write lock

읽기 쓰기 잠금, 하나의 인스턴스로 read, write를 분리해서 임계 영역을 설정

readlock(), readunlock(), writelock, writeunlock()

seqlock

읽기보다 쓰기가 빈번한 곳에서 사용하면 좋다

리눅스 메모리 할당

x86에서는 Kernel 1G / User 3G를 설정한다.

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

w

%s에 연결하는 중