Post

/proc//maps

proc filesystem

man proc

procfs ( proc filesystem )은 유닉스 기반 OS에서 프로세스에 대한 정보나, 시스템 정보를 파일 형식으로 제공하는 것을 말한다.

/proc/의 파일들을 확인해보면 크기가 0인데, 이는 procfs 파일은 내부 자료구조에 접근하기 위한 인터페이스에 가깝기 때문이다. procfs 파일을 출력하려는 순간, procfs driver가 system call을 수행하여 procfs 파일에 대한 결과값으로 출력할 내용을 생성하게 되고, 이를 procfs 파일을 통해 출력하는 것이다. 때문에 출력되는 procfs의 내용은 디스크에 존재하지도 않고, 메모리에 적재되어 있는 것도 아니며 크기가 얼마가 될지는 런타임에 결정되기 때문에 알 수 없어 0으로 잡힌다.

/proc//maps

최근 OS에서는 실행 파일에 대한 r 권한이 없다면 procfs도 읽을 수 없도록 되어있다. *address

perms offset dev inode pathname*

맨 위 세 항목이 Text segment, Data segment, BSS segment일 것 같지만 아니다.

readelf로 각 section이 어느 위치에 mapping될지 조회해 보면,

첫번째 r-xp 영역 은 .interp ~.init .plt .plt.got.text .fini .rodata ~ .eh_frame

두번째 r–p 영역 은 .init_array ~ .got 세번째 rw-p 영역 은 .got.plt.data .bss

r-xp 영역은 text segment를 포함하고 있다고 말하는게 더 정확한 표현이지만 그냥 text segment라고 부르기도 한다. data segment와 bss segment는 모두 rw-p 영역에 속해있다. 실제로 초기화 된 static variable과 초기화 안된 static variable 주소를 출력해 보면 둘 다 0x804a???으로 출력된다. 실제 got는 rw-p에 있는 .got.plt다. (.got는 00000000이 들어있다. 4byte.) segment에 대한 더 자세한 정보는

2016/11/21 - [System/etc] - Memory Layout, Segment

This post is licensed under CC BY 4.0 by the author.