Transcript Document

init/main.c
mm_init_owner()
command_line - setup_arch()에서 처리못한
cmdline을 가리키고 있음
ex) console=ttySAC0,115200 root=/dev/ram
init=/bin/bash initrd=0x51000000,4M
파싱전의 full command line(untouched)와 파
싱하지 않은 나머지 command line(touched)
을 각각 저장해놓는다.
possible맵의 set된 마지막 bit값+1 구한다.
비트맵의 0번비트부터 셋될것이므로 +1을 하
면 possible한 cpu 개수를 의미
setup_per_cpu_areas()
따라서 기본적으로는 프로세스는 두 구조체를 각각 1
개씩 가지고 있고 서로를 가르키도록 되어있다. N개
의 프로세스가 공간을 공유하는 경우 N개의
task_struct가 1개의 mm_struct를 가리키게 된다. 이
때 그렇다면 mm_struct는 N개의 task_struct중 누구
를 가리키는가?
setup_nr_cpu_ids()
.data.percpu섹션에 저장된 percpu변수들을 cpu개수
만큼 메모리를 할당받아 복사한다.
setup_command_line()
smp_prepare_boot_cpu()
1.각 cpu의 runqueue,cfs_rq,rt_rq를 초기화
2. SCHED_SOFRIRQ가 발생시 호출될 함수로
run_rebalance_domains를 지정
3. current thread를 idle thread로 바꾸고
sched_class만 다시 assign하여 부트타임에
normal task로 인식되게 한다
4.scheduler_running을 1로 세팅하여 사용가능
함을 알린다
init_mm(mm_struct 구조체)의 멤버변수 owner를
init_task(task_struct 구조체)로 초기화함
task_struct 구조체 -> 프로세스에 대한 정보가 기술
되어 있음
mm_struct 구조체 -> 프로세스의 메모리공간이 기술
되어 있음
smp_prepare_boot_cpu()
cache coherency로 인해 발생할 수 있는 성능 저하를
최소화하기 위해 cpu 별로 할당되는 percpu섹션
(.data.percpu)에 저장된다. percpu는 각 cpu마다 각
자 사용하는 데이터를 의미한다.
현재 스레드가 실행되고 있는 cpu번호 구함
위에서 구한 cpu의 per_cpu 데이터인 cpu_data의
current를 assign함
current는 현재 프로세스의 task_struct
init/main.c
preempt_disable()
선점을 비활성화 한다.
build_all_zonelists()
set_zonelist_order()
online상태인 모든 노드에 각각 두개의 zonelist를
만든다.
pgdat->zonelist[0] - set_zonelist_order()에서 선택
된 정렬방식에 따라 생성
pgdat->zonelist[1] - 해당 node의 존들만 정렬해
서 생성
캐시용도로 fullzones 비트맵과 z_to_n배열을 생성
한다
fullzones 비트맵 -> fallback list의 모든 존의 상태
를(full=1,not full=0) 비트맵으로 표현함. 이 비트맵
의 clear상태인 leftmost bit를 찾아내서 z_to_n배열
을 인덱싱하면 가용한 best node를 빠르게 찾아낼
수 있다.
current task의 mems_allowed 비트맵에 시스템의
모든 노드에 해당하는 비트를 set함. current task가
모든 노드에게 메모리요청을 할 수 있음을 의미
__build_all_zonelists()
mminit_verify_zonelist()
cpuset_init_current_mems_allo
wed()
Page group by mobility check
시스템의 메모리크기가 page group by mobility메
카니즘이 동작할 정도로 큰지 검사한 후 설정한다
build_all_zonelists()에서 생성할 zonelist의
정렬방식을 결정한다.
ZONE ORDER NODE0.ZONE_NORMAL,NODE1.ZONE_NOR
MAL,NODE2>ZONE_NORMAL,NODE0.ZON
E_DMA,NODE1.ZONE_DMA...
장점= OOM문제발생이 쉽게 되지 않음, 단
점 = best locality를 제공하지 못함
NODE ORDER NODE0.ZONE_NORMAL,NODE0.ZONE_DMA
,NODE1.ZONE_NORMAL,NODE1.ZONE_DM
A,NODE2.ZONE_NORMAL...
장점=best locality 단점 = OOM문제가 발생
할 소지가 있음
따라서 DMA,DMA32존의 전체페이지가 시
스템 전체페이지의 절반 이상이라면 OOM문
제에서 상대적으로 안전하다고 보고 NODE
ORDER방식을 선택하고, 절반 이하라면
ZONE ORDER 방식을 선택한다.
시스템의 모든 존의 정보를 출력한다.
이때 online인 노드에 속하고 present page
가 존재해야 하는 존만 대상으로 한다.
그리고 command line으로 mminit_loglevel
값으로 MMINIT_VERIFY이상이 넘어왔을때만
출력한다
init/main.c
untouched command line을 가지고 있는
boot_command_line을 출력
page_alloc_init()
printk(.., boot_command_line);
parse_early_param()
static_commnad_line에서 처리하지 못한 파라
미터는 envp_init[]에 저장해서 init에서 처리하
도록 한다
parse_args("Booting kernel“..)
page_alloc_cpu_notify_nb라는 notifier block을 만들
어raw_notifier_chain인 cpu_chain에 등록한다.
이때 page_alloc_cpu_notify()를 callback 함로,
priority는 0으로 설정한다.
do_early_param()을 호출해서 boot_command_line에
서 console인 파라미터만 파싱한다