ELF 섹션과 프로그램헤더의 권한질문
ELF 포맷에서(PE 도 마찬가지로)
여러개의 섹션이 모여서 하나의 프로그램 헤더가 된다고 합니다
그런데 readelf 커맨드를 써보면
섹션도 섹션마다 RWX 권한부여가 되어있고
프로그램 헤더도 RWX 권한부여가 되어있습니다
1. 서로다른 권한을 가진 섹션 여러개가 하나의 프로그램 헤더가 된다면
권한은 어떤 규칙으로 처리되는걸까요?
2. 그리고 아래같은 경우 첫번째 LOAD 헤더랑 NOTE 헤더가 매핑되는 가상메모리 영역이
중첩되는데 권한은 서로 다릅니다(RE, R)
어떻게 된걸까요?
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0x000034 0x08048034 0x08048034 0x000e0 0x000e0 R E 0x4
INTERP 0x000114 0x08048114 0x08048114 0x00013 0x00013 R 0x1
[Requesting program interpreter: /lib/ld-linux.so.2]
LOAD 0x000000 0x08048000 0x08048000 0x06bbc 0x06bbc R E 0x1000
LOAD 0x007000 0x0804f000 0x0804f000 0x001e8 0x00880 RW 0x1000
DYNAMIC 0x007014 0x0804f014 0x0804f014 0x000d8 0x000d8 RW 0x4
NOTE 0x000128 0x08048128 0x08048128 0x00044 0x00044 R 0x4
3. 커널 페이지테이블의 write 비트랑 여기에서의 write 권한은 관계가 있는걸까요?
4. 프로그램에서 특정 메모리 영역에 대한 권한설정 정보는 커널 task_struct 구조체속의
struct mm 링크드 리스트속에 없는거같던데 혹시 있나요?
mm 속에 pgd_t 의 포인터가 있는데 이게 왜 있어야 할까요?? pgt_t 는 프로세스별로 하나씩 있으면 되지않나요?
struct_mm 에서 자신이 속한 task 를 찾은다음 pgt_t 를 또 찾기가 번거로워서 포인터를 둔것같기도한데...
5. 그런데 생각해보면 mprotect 로 메모리 권한설정할때 페이지의 배수단위로만 처리가 가능한걸
고려하면 권한 설정이 페이지 테이블에 들어가는거 같은데...
그렇다면 10바이트의 메모리 10개에 권한을 각각 다르게 주면 이건 서로다른 10개의 페이지에
나뉘어서 들어가게 될까요?
조언 부탁드립니다, malloc 의 디테일한 내부 수행과정에 관한
리눅스 메모리관리 관련문서나 자료추천도 감사하겠습니다~
understanding linux kernel
understanding linux virtual memory management
이 두책은 이미 대강 봣습니다만 어려워서 그런지 별 도움이 안되는거같더군요;;
댓글 달기