본문 바로가기

Programming/Linux_Kernel

사용가용한 physical memory block 을 얻어오는 방법

/sys/devices/system/memory/ 의 메모리들


/sys/devices/system/memory# ls

block_size_bytes   memory14  memory32  memory4   memory47  memory54  memory61  memory8

hard_offline_page  memory15  memory33  memory40  memory48  memory55  memory62  memory9

memory0            memory16  memory34  memory41  memory49  memory56  memory63  probe

memory1            memory17  memory35  memory42  memory5   memory57  memory64  soft_offline_page

memory10           memory18  memory36  memory43  memory50  memory58  memory65

memory11           memory19  memory37  memory44  memory51  memory59  memory66

memory12           memory2   memory38  memory45  memory52  memory6   memory67

memory13           memory3   memory39  memory46  memory53  memory60  memory7


       /sys/devices/system/memory/block_size_bytes 

               각 메모리 section(block)의 사이즈

               cat /sys/devices/system/memory/block_size_bytes 

               0x8000000

               는 128Mbyte 를 뜻한다.


       각 memory section(block)의 physical start address 는

               memory0

               memory1

               memory2

               memory3

               memory4

               memory5

               base address 는 memory<숫자> * block_size_bytes

unsigned long long num_bytes = (unsigned long long)(num_blocks) * (unsigned long long)(block_size_bytes);

unsigned long long base_addr = (unsigned long long)(reg_start) * (unsigned long long)(block_size_bytes);


printf("num_blocks : %llu\n", num_blocks); /* num of block to allocate */

printf("reg_start : %llu\n", reg_start); /* block index number */

printf("block_size_bytes : %llu\n", block_size_bytes); /* size of one block */


printf("Giving Palacios %lluMB of memory at (%p) \n", 

      num_bytes / (1024 * 1024), base_addr);


mem.base_addr = base_addr; /* block start address */

mem.pages = num_bytes / 4096; /* page number */


예제 코드

petmem.c


예제코드 실행결과

[root@localhost petmem]# ./user/petmem

usage: v3_mem <memory size (MB)>

[root@localhost petmem]# ./user/petmem 128

Trying to find 128MB (134217728 bytes) of memory

Memory block size is 128MB (134217728 bytes)

Looking for 1 blocks of memory

Checking /sys/devices/system/memory/memory0/removable...Not removable

Checking /sys/devices/system/memory/memory1/removable...Removable

Checking /sys/devices/system/memory/memory2/removable...Removable

Checking /sys/devices/system/memory/memory3/removable...Not removable

Checking /sys/devices/system/memory/memory4/removable...Not removable

Checking /sys/devices/system/memory/memory5/removable...Not removable

Checking /sys/devices/system/memory/memory6/removable...Not removable

Checking /sys/devices/system/memory/memory7/removable...Not removable

Offlining block 1 (/sys/devices/system/memory/memory1/state)

Checking offlined block 1 (/sys/devices/system/memory/memory1/state)...OK

num_blocks : 1

reg_start : 1

block_size_bytes : 134217728

Giving Palacios 128MB of memory at (0x8000000) 

send ADD_MEMORY


사용가용한 phsical memory section 을 얻어서 사용하는 방법.

1. /sys/devices/system/memory/memoryX/removable 이 1인 memory section 을 찾는다.

2. /sys/devices/system/memory/memoryX/state 을 offline 으로 변경한다.

3. /sys/devices/system/memory/memoryX/removable 을 0으로 변경한다.

4. 위 계산 방법으로 physical base address 를 알아내고, 접근해서 활용한다.


< ABI/testing/sysfs-devices-memory 문서의 내용 >

kernel memory blocks 의 내부 state.

file 을 통한 hot-add / remove operation 에 대해서 control 가능하다.

       - 각 변수들

               /sys/devices/system/memory/memoryX/removable

                       이 momory block 이 (kernel system으로부터) removable 한지 여부를 나타낸다.

                       즉, 삭제 가능하다는 것은 kernel system 에 의해서 (아직?) 사용되지 않고 있다는 것을 뜻하는 것으로 보인다.

                       이는 매우 힘들게 수행될지 모르는 hot-remove memory operation 시도 전에, 삭제 가능한 memory section 들을 구별할 수 있도록 해 준다.

/sys/devices/system/memory/memory32# cat removable 

1

               /sys/devices/system/memory/memoryX/phys_device

                       read-only

                       name of physical memory device

                       

               /sys/devices/system/memory/memoryX/phys_index

                       read-only

                       contains the section ID in hexadecimal

/sys/devices/system/memory/memory32# cat phys_index 

00000020


               /sys/devices/system/memory/memoryX/state

                       이 memory section 이 online / offlinde 인지 알려준다.

                       (이 의미는, 지금 kernel system 에 가용 자원으로 잡혀 있는지를 뜻하는 듯 하다.)

                       만약 이 memory section 이 removable 하면, (removable 변수가 1 이면)

                       root 권한을 가진 사용자는 이것의 상태를 변경할 수 있다.

# echo online > /sys/devices/system/memory/memoryX/state

# echo offline > /sys/devices/system/memory/memoryX/state

                       (이것을 offline 으로 변경하면, 당연히 kernel system 에서는 이 memory section 을 사용하지 못할 것이다.)

               

               /sys/devices/system/node/nodeX/memoryY

                       CONFIG_NUMA 가 enable 되어 있을때만 쓸 수 있다.

                       각 node 들에 어떤 memory section 이 link 되어 있는지 알 수 있다.

ls /sys/devices/system/node/node0/

compact                 memory13/               memory41/               memory59/

cpu0/                   memory14/               memory42/               memory6/

cpu1/                   memory15/               memory43/               memory60/

cpu2/                   memory16/               memory44/               memory61/

cpu3/                   memory17/               memory45/               memory62/

cpu4/                   memory18/               memory46/               memory63/

cpu5/                   memory19/               memory47/               memory64/

cpu6/                   memory2/                memory48/               memory65/

cpu7/                   memory3/                memory49/               memory66/

cpulist                 memory32/               memory5/                memory67/

cpumap                  memory33/               memory50/               memory7/

distance                memory34/               memory51/               memory8/

hugepages/              memory35/               memory52/               memory9/

meminfo                 memory36/               memory53/               numastat

memory0/                memory37/               memory54/               scan_unevictable_pages

memory1/                memory38/               memory55/               vmstat

memory10/               memory39/               memory56/               

memory11/               memory4/                memory57/               

memory12/               memory40/               memory58/ 


ls /sys/devices/system/node/node0/memory9 -al

lrwxrwxrwx 1 root root 0 Mar 31 12:01 /sys/devices/system/node/node0/memory9 -> ../../memory/memory9


'Programming > Linux_Kernel' 카테고리의 다른 글

linux kernel 에서 사용 할 수 있는 file io functions  (0) 2014.04.18
linux user semaphore  (0) 2014.04.11
poll, sysfs sample code  (0) 2014.04.07
class 에 sysfs node 등록하여 사용하기  (0) 2014.04.02
demand paging  (0) 2014.04.01