/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 */
예제 코드
예제코드 실행결과
[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 |