SNU-ARC / 2024_spring_sysprog_Lab3

8 stars 0 forks source link

정의되어 있는 `PUT` 매크로 사용과 dataseg 초기 할당시 PROT에 관하여 #20

Open m-joon-ixix opened 2 months ago

m-joon-ixix commented 2 months ago

(질문을 올려놓고 나서 따로 발견한게 있는데, 아래 코멘트와 함께 확인해주시면 감사하겠습니다.)


미리 정의해주신 PUT(p, v) 매크로를 사용하는데, p가 나타내는 address가 분명 dataseg 코드에서 mmap으로 할당해준 메모리인데도, PUT(p, v) 할 때 계속 segmentation fault (core dumped) 가 발생하고 있습니다. p로는 void*, v로는 TYPE 을 집어넣었습니다. (혹시 이게 올바르지 못한 사용법인가요?)

segmentation fault는 주로 "접근이 허가되지 않은 메모리 영역에 조작을 가하려 할때" 발생하는 것으로 알고 있는데요, 제공된 PUT 매크로를 사용하기 전에 뭔가 추가적으로 메모리에 준비를 해줘야 하는 게 있을까요?

m-joon-ixix commented 2 months ago

스스로 찾아낸 문제점인데... dataseg.c 에 수정이 필요한 것 같아서 제보드립니다. dataseg에서 mmap으로 datasegment 메모리 할당 받는 부분에서 (mmap으로) PROT_NONE 플래그가 사용되는 것을 확인했습니다. PROT 관련 각 플래그의 정의는 다음과 같은 것으로 확인되는데요,

#define PROT_NONE       0x00    /* [MC2] no permissions */
#define PROT_READ       0x01    /* [MC2] pages can be read */
#define PROT_WRITE      0x02    /* [MC2] pages can be written */
#define PROT_EXEC       0x04    /* [MC2] pages can be executed */

PROT_READ|PROT_WRITE|PROT_EXEC 로 바꿔서 해당 메모리 영역을 manipulate 할 수 있도록 설정해야 하는 것이 아닌가 싶습니다. 실제로 dataseg.c 파일 (제가 링크걸어둔 부분)에서 이렇게 PROT 플래그를 바꿔주니까 PUT 매크로가 잘 작동하는 것으로 확인됩니다.

col000 commented 2 months ago

README에 작성된 바와 같이 dataseg.c/h 파일은 수정하시면 안되십니다. 말씀하신대로 segementation fault가 권한이 없는 메모리에 접근할 경우에도 발생하지만, 유효하지 않거나 할당되지 않은 메모리를 가르키는 경우와 같이 잘못된 포인터를 사용하는 경우에도 발생하게 됩니다. PUT(p, v) 에 넣은 p 가 올바른 곳을 가르키고 있는지 확인해보시면 좋을거 같습니다.

freqinfi commented 2 months ago

저도 같은 문제를 겪고 있습니다. 단순히 ds_heap_stat 함수에서 받아온 ds_heap_start에서 initialize 그림대로 initial sentinal_block을 집어넣을 수 있는 32 byte alligned된 heap_start라는 void pointer를 설정하고, 이에 unsigned long value인 v를 PUT하였는데 segmentation error가 발생합니다. 혹시 제가 잘못한 부분이 있을까요?

m-joon-ixix commented 2 months ago

@col000 dataseg 쪽을 제가 제대로 안 읽어본 것 같습니다. 해결가능할 것 같습니다 🙏 @freqinfi 저랑 같은 과정을 겪고 계신것 같은데 😄 dataseg.c 에 적혀있는 설명 차근차근 읽어보시면 이해되실 것 같습니다