remap_file_pages

REMAP_FILE_PAGESÐ2ÑководÑÑво пÑогÑаммиÑÑа LiREMAP_FILE_PAGES(2)



ÐÐЯ
       remap_file_pages - ÑоздаÑÑ Ð½ÐµÐ»Ð¸Ð½ÐµÐ¹Ð½Ð¾Ðµ Ñайловое
       оÑобÑажение

ÐÐÐÐÐ
       #define _GNU_SOURCE         /* СмоÑÑиÑе feature_test_macros(7) */
       #include <sys/mman.h>

       int remap_file_pages(void *addr, size_t size, int prot,
                            size_t pgoff, int flags);

ÐÐÐСÐÐÐÐ
       ÐамеÑание: даннÑй ÑиÑÑемнÑй вÑзов (наÑÐ¸Ð½Ð°Ñ Ñ
       Linux 3.16) ÑÑÑаÑел и вÑкоÑе бÑÐ´ÐµÑ Ð·Ð°Ð¼ÐµÐ½Ñн на
       более медленнÑÑ ÑмÑлÑÑÐ¸Ñ ÑдÑом. Ð
       пÑиложениÑÑ, где он иÑполÑзÑеÑÑÑ, нÑжно
       пÑименÑÑÑ Ð°Ð»ÑÑеÑнаÑивнÑе вÑзовÑ.

       СиÑÑемнÑй вÑзов remap_file_pages() иÑполÑзÑеÑÑÑ Ð´Ð»Ñ
       ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½ÐµÐ»Ð¸Ð½ÐµÐ¹Ð½Ð¾Ð³Ð¾ оÑобÑажениÑ, Ñо еÑÑÑ
       оÑобÑажениÑ, в коÑоÑом ÑÑÑаниÑÑ Ñайла
       оÑобÑажаÑÑÑÑ Ð² памÑÑÑ Ð½ÐµÐ¿Ð¾ÑледоваÑелÑно.
       ÐÑеимÑÑеÑÑво иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ remap_file_pages() по
       ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð²ÑоÑением вÑзовов mmap(2) в Ñом,
       ÑÑо пеÑвÑй не ÑÑебÑÐµÑ Ð¾Ñ ÑдÑа ÑозданиÑ
       дополниÑелÑнÑÑ ÑÑÑÑкÑÑÑ Ð´Ð°Ð½Ð½ÑÑ VMA (облаÑÑей
       виÑÑÑалÑной памÑÑи).

       ÐÐ»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½ÐµÐ»Ð¸Ð½ÐµÐ¹Ð½Ð¾Ð³Ð¾ оÑобÑажениÑ
       вÑполниÑе ÑледÑÑÑее:

       1. СоздайÑе оÑобÑажение (пока линейное) Ñ
          помоÑÑÑ mmap(2). Ðанное оÑобÑажение должно
          ÑоздаваÑÑÑÑ Ñ Ñлагом MAP_SHARED.

       2. ÐÑполниÑе пеÑеÑпоÑÑдоÑивание ÑооÑвеÑÑÑвиÑ
          Ð¼ÐµÐ¶Ð´Ñ ÑÑÑаниÑами оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸ ÑÑÑаниÑами
          Ñайла Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ или неÑколÑкиÑ
          вÑзовов remap_file_pages(). Ðозможно оÑобÑажаÑÑ
          Ð¾Ð´Ð½Ñ ÑÑÑаниÑÑ Ñайла в неÑколÑко меÑÑ
          оÑобÑажаемой облаÑÑи.

       РаÑгÑменÑÐ°Ñ pgoff и size ÑказÑваеÑÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ
       Ñайла, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¿ÐµÑенеÑÑна  в
       оÑобÑажение: в pgoff задаÑÑÑÑ ÑмеÑение в
       Ñайле, измеÑÑемое в ÑазмеÑÐ°Ñ ÑиÑÑемнÑÑ
       ÑÑÑаниÑ; в size задаÑÑÑÑ Ð´Ð»Ð¸Ð½Ð° облаÑÑи в байÑаÑ.

       ÐÑгÑÐ¼ÐµÐ½Ñ addr пÑедназнаÑен Ð´Ð»Ñ Ð´Ð²ÑÑ Ñелей.
       Ðо-пеÑвÑÑ, им опÑеделÑеÑÑÑ Ð¾ÑобÑажение, ÑÑи
       ÑÑÑаниÑÑ Ð¼Ñ ÑоÑим пеÑенеÑÑи. То еÑÑÑ Ð² addr
       должен бÑÑÑ Ñказан адÑÐµÑ Ð² облаÑÑи, коÑоÑаÑ
       бÑла Ñанее оÑобÑажена Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð²Ñзова mmap(2).
       Ðо-вÑоÑÑÑ, в addr ÑказÑваеÑÑÑ Ð°Ð´ÑеÑ, по коÑоÑомÑ
       Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¿Ð¾Ð¼ÐµÑÐµÐ½Ñ ÑайловÑе ÑÑÑаниÑÑ,
       заданнÑе pgoff и size.

       ÐнаÑениÑ, ÑказаннÑе в addr и size, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ
       кÑаÑÐ½Ñ ÑазмеÑÑ ÑиÑÑемной ÑÑÑаниÑÑ. ÐÑли ÑÑо не
       Ñак, Ñо ÑдÑо окÑÑглÑÐµÑ Ð¾Ð±Ð° знаÑÐµÐ½Ð¸Ñ Ð² менÑÑÑÑ
       ÑÑоÑÐ¾Ð½Ñ Ð´Ð¾ ближайÑего ÑиÑла, кÑаÑного
       ÑазмеÑÑ ÑÑÑаниÑÑ.

       ÐнаÑение аÑгÑменÑа prot должно бÑÑÑ 0.

       ÐÑгÑÐ¼ÐµÐ½Ñ flags пÑедназнаÑен Ð´Ð»Ñ Ñого же, ÑÑо и
       в mmap(2), но вÑе Ñлаги, кÑоме MAP_NONBLOCK,
       игноÑиÑÑÑÑÑÑ.

ÐÐÐÐÐ ÐЩÐÐÐÐÐ ÐÐÐЧÐÐÐÐ
       ÐÑи ÑдаÑном вÑполнении remap_file_pages()
       возвÑаÑаеÑÑÑ 0. ÐÑи оÑибке возвÑаÑаеÑÑÑ -1, а
       знаÑение errno ÑÑÑанавливаеÑÑÑ ÑооÑвеÑÑÑвÑÑÑим
       обÑазом.

ÐШÐÐÐÐ
       EINVAL ÐнаÑение addr не ÑÑÑлаеÑÑÑ Ð½Ð° допÑÑÑимое
              оÑобÑажение, Ñозданное Ñ Ñлагом
              MAP_SHARED.

       EINVAL ÐекоÑÑекÑное знаÑение в addr, size, prot или
              pgoff.

ÐÐРСÐÐ
       СиÑÑемнÑй вÑзов remap_file_pages() поÑвилÑÑ Ð² Linux
       2.5.46; поддеÑжка в glibc наÑалаÑÑ Ñ Ð²ÐµÑÑии 2.3.3.

СÐÐТÐÐТСТÐÐРСТÐÐÐÐРТÐÐ
       СиÑÑемнÑй вÑзов remap_file_pages() еÑÑÑ ÑолÑко в Linux.

ÐÐÐÐЧÐÐÐЯ
       ÐаÑÐ¸Ð½Ð°Ñ Ñ Linux 2.6.23, remap_file_pages() ÑоздаÑÑ
       нелинейнÑе оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑолÑко Ð´Ð»Ñ ÑайловÑÑ
       ÑиÑÑем в опеÑаÑивной памÑÑи, ÑÐ°ÐºÐ¸Ñ ÐºÐ°Ðº tmpfs,
       hugetlbfs или ramfs. ÐÐ»Ñ ÑайловÑÑ ÑиÑÑем Ñ
       ÑÑанилиÑем remap_file_pages() не намного
       ÑÑÑекÑивнее Ñем mmap(2), Ñак как ÑаÑÑÑиÑÑваеÑ
       адÑеÑа Ð´Ð»Ñ ÑаÑÑей Ñайла.

СÐÐТРÐТРТÐÐÐÐ
       getpagesize(2), mmap(2), mmap2(2), mprotect(2), mremap(2), msync(2)



Linux                             2014-05-28               REMAP_FILE_PAGES(2)