본문 바로가기

Programming/Linux_Kernel

Ram Memory 설정하기

안녕하세요.
오늘은 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