Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
m-joon-ixix opened this issue Apr 20, 2024 · 4 comments
Labels
solved Question solved

Comments

@m-joon-ixix
Copy link

m-joon-ixix commented Apr 20, 2024

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


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

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

@m-joon-ixix
Copy link
Author

스스로 찾아낸 문제점인데... 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 매크로가 잘 작동하는 것으로 확인됩니다.

@m-joon-ixix m-joon-ixix changed the title 정의되어 있는 PUT 매크로 사용에 관하여 정의되어 있는 PUT 매크로 사용과 dataseg 초기 할당시 PROT에 관하여 Apr 20, 2024
@col000
Copy link

col000 commented Apr 20, 2024

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

@freqinfi
Copy link

저도 같은 문제를 겪고 있습니다. 단순히 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
Copy link
Author

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

@kwonsw055 kwonsw055 added the solved Question solved label Apr 21, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
solved Question solved
Development

No branches or pull requests

4 participants