DLL 의 Memory Mapping 에 대하여.

superdma의 이미지

WinNT에서
A.exe, B.exe 두 개의 실행파일이 동일한 DLL 인 same.dll 을 Import한다고 가정할때,

A.exe 가 먼저 same.dll 을 자신의 가상메모리상에 매핑시키고 물리메모리에 올린 후,
B.exe를 실행하면 B.exe는 same.dll을 물리메모리에 올리지 않고,
자신의 가상메모리(B.exe)에 방금 전 A.exe가 올린 same.dll 의 물리메모리에 매핑시킨다고 알고 있습니다.

이는 결국 A.exe 프로세스와 B.exe 프로세스의 가상메모리가 같은 주소를 할당 한다고 생각해 볼수 있는데요.

이떄 B.exe 프로세스는 A.exe의 same.dll 관련 page를 카피하는 건가요?
만일 page를 카피하는 거라면, A.exe 프로세스의 Linear Address를 얻기위해 A.exe 프로세스의 세그먼트에 접근한다는 것인데
보호메커니즘으로 태스크간 세그먼트가 보호되는 상황에서 이것이 가능한 일인가요?..

klutzy의 이미지

두 가상 메모리를 같은 물리 메모리로 매핑하는 것이 가장 일반적인 방식입니다. 예를 들어 페이징 방식이라면 A 프로세스의 a 페이지와 B 프로세스의 b 페이지가 같은 물리 페이지 x를 가리키고 있는 것이죠.
물론 이렇게 할 때 A나 B가 서로의 페이지를 변경할 수 있으면 안 되겠고, 그래서 이를 방지하기 위한 구현이 몇 가지 있습니다. 가장 간단하게는 페이지 테이블에서 공유 라이브러리 영역에는 모두 읽기 전용 속성을 걸어 두거나, 아니면 공유된 페이지에 변경을 하려는 경우 그 페이지를 그 때 복사하는 방법(copy-on-write)이 있습니다. (fork()같은 경우 프로세스 메모리를 모두 복사하는 게 비싸기 때문에 많은 구현에 copy-on-write를 사용합니다.)

윈도에서의 구체적인 동작은 저도 모르고 있었는데, 검색해 보니까 라이브러리 로딩 시에 필요한 경우 copy on write를 쓰네요. http://support.microsoft.com/?scid=kb%3Ben-us%3B103858&x=16&y=16

drinkme의 이미지

http://msdn.microsoft.com/en-us/library/ms682594(VS.85).aspx

DLL text의 physical memory는 공유할 지언정,
virtual memory상에서의 mapping이 각 process마다 될 것이고,
data도 각 process 상에서 mapping이 되기 때문에
기본적으로 공유는 안됩니다. 따로 놉니다.

하지만,
위의 URL에서 말하듯이, 방법이 있을수 있겠죠.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.