슬라이드 1

Download Report

Transcript 슬라이드 1

init/main.c
1) (struct task_struct) 의 슬랩을 생성
2) 전역 변수인 max_threads 의 값을 정한다. (생성할수 있는 스
레드 최대 갯수)
3) 현재 부팅을 주도하고있는 init_task가 생성할 수 있는 스레드
갯수를 정해준다. (init_task.signal.rlim[RLIMIT_NPROC] 값 설정)
4) 현재 부팅을 주도하고있는 init_task의 최대 pending signal
갯수를 정해준다. (init_task.signal.rlim[RLIMIT_SIGPENDING] 값
설정)
fork_init
kernel/fork.c
int max_thread
arch/arm/kernel/init_task.c
struct task_struct init_task
struct task_struct
...
struct signal_struct *signal
struct task_struct
...
...
struct rlimit rlim[RLIM_NLIMITS]
...
Include/asm-generic/resource.h
...
#define RLIMIT_NPROC
#define RLIMIT_SIGPENDING
#define RLIM_NLIMITS
...
6 /* max number of processes */
11 /* max number of pending signals */
16 // maximum file locks held
init/main.c
1. 여러종류의 슬랩(slab) 캐시를 생성한다.
(struct shighand_struct, struct signal_struct, struct files_struct, struct
fs_struct, struct mm_struct, struct vm_area_struct 등)
2. percpu_counter구조체의 counter세팅, counters의 메모리 할당,
lock class등록을 한다.
proc_caches_init
kmem_cache_create("sighand_cache“, . . . )
슬랩 캐시 생성
kmem_cache_create("signal_cache", . . . )
kmem_cache_create("files_cache", . . . )
kmem_cache_create("fs_cache", . . . )
TODO: slob, slab, slub 내용 정리
TODO: struct kmem_cache 자료구조
정리
kmem_cache_create("mm_struct", . . . )
kmem_cache_create("vm_area_struct", . . . )
mmap_init()
- percpu_counter 값을 0으로 세팅
- percpu_counter lock을 lock class로 등록
init/main.c
buffer_init
- (struct buffer_head) 슬랩 캐시를 생성한다.
- 시스템에서 가질 수 있는 buffer_head의 최대 갯수를 정해서
max_buffer_heads 전역 변수에 저장한다.
- max_buffer_heads의 개수 이상의 buffer_head가 생성될땐,
writeback 이 실행된다.
(Once the number of bh's in the machine exceeds this level, we
start stripping them in writeback.)
kmem_cache_create("buffer_head", . . . )
슬랩 캐시 생성
fs/buffer.c
struct kmem_cache *bh_cachep
int max_buffer_heads
notifier 함수 등록
hotcpu_notifier(buffer_cpu_notify, 0)
struct notifier_block
int (*notifier_call)( )
struct notifier_block *next
int priority
init/main.c
- key_jar라는 이름의 key 구조체 슬랩캐시 생성
- key_type들을 가지고 있는 리스트 key_types_list에 key type, keyring,
dead, user를 추가한다.
- key_user_tree라는 레드블랙트리에 root_key_user.node를 추가시킨
다.parent인자가 NULL이므로 root_key_user.node가 root가 된다.
- 노드를 추가했으므로 트리를 rebalance한다
key_init
kmem_cache_create("key_jar", . . . )
key_jar라는 이름의 슬랩캐시 생성
security/keys/key.c
struct kmem_cache *key_jar
list_add_tail(&key_type_keyring, . . . )
list_add_tail(&key_type_dead, . . . )
list_add_tail(&key_type_user, . . . )
rb_link_node
rb_insert_color
key_types_list의 맨 뒤에 3가지
키타입을 차례대로 추가
key_user_tree라는 레드블랙트리에
root_key_user.node를 추가
rebalance tree
init/main.c
security_init
- CONFIG_SECURITY가 정의되어 있을 경우에만
default_security_ops 구조체의 함수포인터 초기화
- __security_initcall_start 부터 __security_initcall_end까지의
함수를 호출
security_fixup_ops(&default_security_ops)
do_security_initcalls
인자로 넘긴 default_security_ops의 각 멤버
(ptrace_may_access..)를 아래와 같은 방법으
로 assign
set_to_cap_if_null(ops, ptrace_may_access);
...
set_to_cap_if_null(ops, ptrace_traceme);
__security_initcall_start 부터
__security_initcall_end까지의 함수를 호출
SELinux 모델의 경우 함수를 위 섹션으로
정의해 놓음
따라서 default_security_ops에 세팅된 모든
함수를 call할 수 있음
init/main.c
- num_physpages : 시스템의 전체 페이지프레임 갯수
- 구조체 names_cache,dentry, inode, vfsmount, sysfs_dirent,
bdev_inode, file의 슬랩캐시 생성
- 가용한 메모리 상에서 최대 file개수 10%를 max file개수로 설정
- sys_fs, rootfs, bdev fs 파일시스템을 등록하고 마운트한다
- fs라는 최상위 kobject를 생성하고 추가한다
- 문자디바이스를 위한 cdev_map을 하나 할당받아 초기화
vfs_caches_init
(num_physpages)
kmem_cache_create("names_cache“, . . . )
dcache_init()
inode_init()
files_init()
mnt_init()
슬랩 캐시 생성
dentry 구조체의 슬랩캐시 생성
dcache_shrinker 구조체를 shrinker_list에 추가
shrinker구조체의 nr 초기화
shrinker_list의 끝에 shrinker추가
inode 구조체의 슬랩캐시 생성
icache_shrinker 구조체를 shrinker_list에 추가
shrinker구조체의 nr 초기화
shrinker_list의 끝에 icache_shrinker추가
가용한 메모리 상에서 최대 file개수 10%를
max file개수로 설정
filp이라는 file구조체 슬랩캐시 생성
fdtable_defer_list의 wq에 free_fdtable_work()
를 assign
percpu_counter구조체 nr_files의 counter세팅,
counters의 메모리 할당,lock class등록을 한다
init/main.c
vfs_caches_init
(num_physpages)
mnt_init()
bdev_cache_init
chrdev_init
vfsmount구조체, sysfs_dirent 구조체의 슬랩캐시 생성
sysfs_backing_dev_info의 멤버를 초기화
sys_fs 파일시스템을 등록하고 마운트한다
fs라는 최상위 kobject를 생성하고 추가한다
ramfs_backing_dev_info를 초기화 한 후 rootfs file
system을 등록하고 마운트한다.
rootfs를 위한 namespace ns를 할당받아 멤버를 초기
화한다
rootfs, init_task가 속한 namespace로 ns를 설정한다.
path구조체 설정, current->fs의 pwd, mnt 관련 멤버를
초기화한다
bdev_inode 구조체의 슬랩캐시 생성
bdev fs를 등록하고 마운트 한다
bdev의 superblock을 전역변수에 설정
문자디바이스를 위한 cdev_map을 하나 할
당받아 초기화
directly_mappable_cdev_bdi 초기화
init/main.c
radix_tree_node 구조체의 슬랩캐시 생성
radix tree의 예)
- page I/O 에 앞서 page cache가 존재 하는지 확인하기 위해서
메모리 상에 존재하는 모든 page 를 search 할 필요가 있는데, 이
overhead를 줄이기 위해서 radix tree를 이용한다.
radix_tree_init
signal_init
sigqueue 구조체의 슬랩캐시 생성
1) 특정시간에 해당 타이머가 expire되도록 세팅, 타이머에 등록된
함수 wb_timer_fn()이 호출될것이다.
2) ratelimit_nb를 cpu_notifier chain에 등록
3) dirty_ratio에 대한 period를 구한다
4) prop_descriptor 구조체 변수인 vm_completions, vm_dirties의
멤버변수값들을 셋팅한다
page_writeback_init
mod_timer(&wb_timer, . . .)
register_cpu_notifier(&ratelimit_nb)
calc_period_shift()
특정시간에 해당 타이머가 expire되도록 세팅
타이머에 등록된 함수 wb_timer_fn()이 호출
ratelimit_nb를 cpu_notifier chain에 등록
init/main.c
page_writeback_init
calc_period_shift()
prop_descriptor_init()
prop_descriptor_init()
init/main.c
proc_root_init
1) proc_inode 구조체의 슬랩캐시 proc_inode_cache를 생성한다
2) proc을 파일시스템으로 등록하고 마운트한다
3) /proc/self/mounts의 심볼릭링크 mounts를 /proc에 생성한다
4) /proc/self/net의 심볼릭링크 /proc/net을 생성한다
5) network namespace 서브시스템을 등록한다
6) proc 파일시스템에 디렉토리 sysvipc,fs,driver, fs/nfsd,
openprom,bus를 생성한다
7) proc 파일시스템에 device-tree 디렉토리를 생성하고 devicetree 아래에 open firmware의 child device node들을 add한다.
8) proc/tty 서브트리를 생성,초기화한다.
9) /proc/sys를 생성하고 iops, fops,nlink를 초기화한다.