오늘은 linux kernel 에서 ram 사용 setting 에 대해 아주 조금만 적어보겠습니다.
커널이 부팅할때 boot param 으로 셋팅이 넘어가게 되는데요.
이 영역은 vmlinux.lds 라는 파일에 다음과 같이 기술되어 있습니다.
linux-2.6.29.4/arch/arm/kernel/vmlinux.lds
...
*(.init.setup)
__setup_end = .;
__early_begin = .;
*(.early_param.init)
__early_end = .;
...
setup.c 에 보면
__early_param("mem=", early_mem);
이라는 메크로가 나오는데요. 이를 해석하면 다음과 같습니다.
#define __early_param(name,fn) \
static struct early_params __early_##fn __used \
__attribute__((__section__(".early_param.init"))) = { name, fn }
즉, 아래와 같이 기술 하였다면
__early_param("mem=", early_mem);
이렇게 해석이 됩니다.
static struct early_params __early_early_mem __used __attribute__((__section__(".early_param.init"))) = { "mem=", early_mem }
struct early_params 는 아래와 같은 구조이구요..
struct early_params {
const char *arg;
void (*fn)(char **p);
};
"__attribute__((__section__ .."
으로 진행되는 부분은 c표준은 아니고 gcc 컨파일러에서 해당 변수를 넣을 섹션을 지시하는 명령어 입니다.
이것에 관련된 내용은 아래 부분을 참고 하세요.
다 쓰기 귀찮네요.. ^^;
관련 url : http://rootfriend.tistory.com/entry/asmlinkage-attribute
즉 early_params 라는 구조체의 객체를 early_param.init 이라는 섹션에 넣겠다는 의미 입니다.
이렇게 하는 이유는 일정한 부트로더에서 커널로 점프할때 서로 다른 주소 공간을 가지게 되는데 일정한 영역에 저장하여, 파라미터를 공유하기 위해서 입니다.
이 파라미터 내용을 확인하는 방법은 커널이 부팅할때
setup.c 에
static void __init early_mem(char **p)
함수에서 p 를 출력해 보셔도 되구요.
부팅 후에 다음 정보를 보셔도 됩니다.
cat /proc/cmdline
root=139:7 rootfstype=cramfs console=ttySAC2,115200 mem=80M,256M@0x40000000,128M@0x50000000 version=Sbl(3.0.0) 2010-05-29 21:27:05 switch_sel=3 boot_mode=0 factory_cable=0
여기서 RAM setting 에 관련된 부분은
mem=80M,256M@0x40000000,128M@0x50000000
이 부분 인데요
0x0 부터 80Mbyte
0x40000000 부터 256Mbyte
0x50000000 부터 128Mbyte
를 사용하겠다는 의미 입니다.
이렇게 3개로 나누어서 셋팅하면 실제로는 3개의 Node 가 잡히게 됩니다.
이 Node 의 세부 정보는 아래에서 열람할 수 있습니다.
디 정보에서 각 spanned 가 실제 각 Node 의 size 정보 입니다.
한 page 에 4K 이니까
20480 * 4 = 81920 kbyte
81920 kbyte / 1024 = 80Mbyte
로 잘 나오는 것을 확인할 수 있죠~
# cat /proc/zoneinfo
Node 0, zone DMA
pages free 146
min 118
low 147
high 177
scanned 0 (aa: 0 ia: 0 af: 0 if: 0)
spanned 20480
present 20320
nr_free_pages 146
nr_inactive_anon 0
nr_active_anon 481
nr_inactive_file 5973
nr_active_file 2112
nr_unevictable 0
nr_mlock 0
nr_anon_pages 464
nr_mapped 1276
nr_file_pages 8102
nr_dirty 1
nr_writeback 0
nr_slab_reclaimable 719
nr_slab_unreclaimable 1135
nr_page_table_pages 61
nr_unstable 0
nr_bounce 0
nr_vmscan_write 0
nr_writeback_temp 0
protection: (0, 0, 0)
pagesets
cpu: 0
count: 16
high: 18
batch: 3
all_unreclaimable: 0
prev_priority: 12
start_pfn: 196608
inactive_ratio: 1
Node 1, zone DMA
pages free 465
min 378
low 472
high 567
scanned 0 (aa: 0 ia: 0 af: 0 if: 0)
spanned 65536
present 65024
nr_free_pages 465
nr_inactive_anon 0
nr_active_anon 17197
nr_inactive_file 22403
nr_active_file 4108
nr_unevictable 0
nr_mlock 0
nr_anon_pages 15399
nr_mapped 13233
nr_file_pages 28309
nr_dirty 1
nr_writeback 0
nr_slab_reclaimable 471
nr_slab_unreclaimable 621
nr_page_table_pages 635
nr_unstable 0
nr_bounce 0
nr_vmscan_write 0
nr_writeback_temp 0
protection: (0, 0, 0)
pagesets
cpu: 0
count: 82
high: 90
batch: 15
all_unreclaimable: 0
prev_priority: 12
start_pfn: 262144
inactive_ratio: 1
Node 2, zone DMA
pages free 14896
min 187
low 233
high 280
scanned 0 (aa: 0 ia: 0 af: 0 if: 0)
spanned 32512
present 32258
nr_free_pages 14896
nr_inactive_anon 0
nr_active_anon 8279
nr_inactive_file 6248
nr_active_file 724
nr_unevictable 0
nr_mlock 0
nr_anon_pages 6739
nr_mapped 3781
nr_file_pages 8514
nr_dirty 1
nr_writeback 0
nr_slab_reclaimable 191
nr_slab_unreclaimable 315
nr_page_table_pages 377
nr_unstable 0
nr_bounce 0
nr_vmscan_write 0
nr_writeback_temp 0
protection: (0, 0, 0)
pagesets
cpu: 0
count: 11
high: 42
batch: 7
all_unreclaimable: 0
prev_priority: 12
start_pfn: 327680
inactive_ratio: 1
#
적은 내용인데 세부적으로 쓰다보니 길어 졌네요.
요즘 검색을 하다보면 제 글을 임의로 퍼가시고 링크도 없는 경우가 있던데
가급적 원본 링크 남겨주시고, 댓글도 쓰고 퍼 가시면 제가 글 쓸 힘이 나겠죠?
'Programming > Linux_Kernel' 카테고리의 다른 글
Kprobe 를 이용한 kernel debugging (0) | 2010.08.06 |
---|---|
linux kernel 2.6.30, 31, 32 change list (0) | 2010.08.03 |
work queue & kworker (0) | 2010.08.02 |
wait queue (0) | 2010.08.02 |
restart_syscall 의 호출 경로 - 작성중 (1) | 2010.07.13 |