Open m-joon-ixix opened 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
매크로가 잘 작동하는 것으로 확인됩니다.
README에 작성된 바와 같이 dataseg.c/h
파일은 수정하시면 안되십니다.
말씀하신대로 segementation fault가 권한이 없는 메모리에 접근할 경우에도 발생하지만,
유효하지 않거나 할당되지 않은 메모리를 가르키는 경우와 같이 잘못된 포인터를 사용하는 경우에도 발생하게 됩니다.
PUT(p, v)
에 넣은 p
가 올바른 곳을 가르키고 있는지 확인해보시면 좋을거 같습니다.
저도 같은 문제를 겪고 있습니다. 단순히 ds_heap_stat 함수에서 받아온 ds_heap_start에서 initialize 그림대로 initial sentinal_block을 집어넣을 수 있는 32 byte alligned된 heap_start라는 void pointer를 설정하고, 이에 unsigned long value인 v를 PUT하였는데 segmentation error가 발생합니다. 혹시 제가 잘못한 부분이 있을까요?
@col000 dataseg 쪽을 제가 제대로 안 읽어본 것 같습니다. 해결가능할 것 같습니다 🙏 @freqinfi 저랑 같은 과정을 겪고 계신것 같은데 😄 dataseg.c 에 적혀있는 설명 차근차근 읽어보시면 이해되실 것 같습니다
(질문을 올려놓고 나서 따로 발견한게 있는데, 아래 코멘트와 함께 확인해주시면 감사하겠습니다.)
미리 정의해주신 PUT(p, v) 매크로를 사용하는데, p가 나타내는 address가 분명 dataseg 코드에서 mmap으로 할당해준 메모리인데도,
PUT(p, v)
할 때 계속segmentation fault (core dumped)
가 발생하고 있습니다. p로는void*
, v로는TYPE
을 집어넣었습니다. (혹시 이게 올바르지 못한 사용법인가요?)segmentation fault는 주로 "접근이 허가되지 않은 메모리 영역에 조작을 가하려 할때" 발생하는 것으로 알고 있는데요, 제공된 PUT 매크로를 사용하기 전에 뭔가 추가적으로 메모리에 준비를 해줘야 하는 게 있을까요?