pkey_alloc

PKEY_ALLOC(2)   Ð ÑководÑÑво пÑогÑаммиÑÑа Linux   PKEY_ALLOC(2)



ÐÐЯ
       pkey_alloc, pkey_free - вÑделÑÐµÑ Ð¸Ð»Ð¸ оÑвобождаеÑ
       клÑÑ Ð·Ð°ÑиÑÑ

ÐÐÐÐÐ
       #include <sys/mman.h>

       int pkey_alloc(unsigned long flags, unsigned long access_rights);
       int pkey_free(int pkey);

ÐÐÐСÐÐÐÐ
       ÐÑзов pkey_alloc() вÑделÑÐµÑ ÐºÐ»ÑÑ Ð·Ð°ÑиÑÑ (pkey),
       коÑоÑÑй можно пеÑедаваÑÑ Ð² pkey_mprotect(2).

       ÐÑгÑÐ¼ÐµÐ½Ñ flags вÑзова pkey_alloc() заÑезеÑвиÑован
       Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² бÑдÑÑем и в наÑÑоÑÑее
       вÑÐµÐ¼Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑавнÑÑÑÑÑ 0.

       ÐÑгÑÐ¼ÐµÐ½Ñ access_rights вÑзова pkey_alloc() можеÑ
       ÑодеÑжаÑÑ Ð½Ð¾Ð»Ñ Ð¸Ð»Ð¸ более запÑеÑиÑелÑнÑÑ
       опеÑаÑий:

       PKEY_DISABLE_ACCESS
              ÐапÑеÑиÑÑ Ð´Ð¾ÑÑÑп ко вÑем даннÑм памÑÑи,
              на коÑоÑÑÑ Ð½Ð°Ð»Ð¾Ð¶ÐµÐ½ возвÑаÑаемÑй клÑÑ.

       PKEY_DISABLE_WRITE
              ÐапÑеÑиÑÑ Ð´Ð¾ÑÑÑп на запиÑÑ Ð² памÑÑÑ, на
              коÑоÑÑÑ Ð½Ð°Ð»Ð¾Ð¶ÐµÐ½ возвÑаÑаемÑй клÑÑ.

       ÐÑзов pkey_free() оÑÐ²Ð¾Ð±Ð¾Ð¶Ð´Ð°ÐµÑ ÐºÐ»ÑÑ Ð·Ð°ÑиÑÑ Ð¸
       Ð´ÐµÐ»Ð°ÐµÑ ÐµÐ³Ð¾ доÑÑÑпнÑм Ð´Ð»Ñ Ð±ÑдÑÑего вÑделениÑ.
       ÐоÑле оÑÐ²Ð¾Ð±Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ ÐºÐ»ÑÑа заÑиÑÑ Ð¾Ð½ можеÑ
       болÑÑе не иÑполÑзоваÑÑÑÑ Ð² опеÑаÑиÑÑ Ð¿Ð¾
       заÑиÑе клÑÑом.

       ÐÑиложение не должно вÑзÑваÑÑ pkey_free() Ñ
       клÑÑом заÑиÑÑ, коÑоÑÑй бÑл назнаÑен адÑеÑномÑ
       Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ pkey_mprotect(2) и коÑоÑÑй
       пока иÑполÑзÑеÑÑÑ. ÐÑо вÑзÑваеÑ
       непÑедÑказÑемое поведение и можеÑ
       пÑивеÑÑи к оÑибке.

ÐÐÐÐÐ ÐЩÐÐÐÐÐ ÐÐÐЧÐÐÐÐ
       ÐÑи ÑÑпеÑном вÑполнении pkey_alloc() возвÑаÑаеÑÑÑ
       положиÑелÑное знаÑение клÑÑа заÑиÑÑ. ÐÑи
       ÑÑпеÑном вÑполнении pkey_free() возвÑаÑаеÑÑÑ
       нолÑ. ÐÑи оÑибке возвÑаÑаеÑÑÑ -1 и errno
       пÑиÑваиваеÑÑÑ ÑооÑвеÑÑÑвÑÑÑее знаÑение.

ÐШÐÐÐÐ
       EINVAL ÐевеÑное знаÑение pkey, flags или access_rights.

       ENOSPC (pkey_alloc()) ÐÑе клÑÑи заÑиÑÑ, доÑÑÑпнÑе
              ÑекÑÑÐµÐ¼Ñ Ð¿ÑоÑеÑÑÑ Ñже ÑаÑпÑеделенÑ.
              ÐолиÑеÑÑво доÑÑÑпнÑÑ ÐºÐ»ÑÑей завиÑÐ¸Ñ Ð¾Ñ
              аÑÑиÑекÑÑÑÑ Ð¸ ÑеализаÑии и Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ
              менÑÑим из-за иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾ÑделÑнÑÑ
              клÑÑей Ñамим ÑдÑом. РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð½Ð°
              x86 Ð´Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑелÑÑкой пÑогÑаммÑ
              доÑÑÑпно 15 клÑÑей.

              Также ÑÑа оÑибка возвÑаÑаеÑÑÑ, еÑли
              пÑоÑеÑÑÐ¾Ñ Ð¸Ð»Ð¸ опеÑаÑÐ¸Ð¾Ð½Ð½Ð°Ñ ÑиÑÑема не
              поддеÑживаÑÑ ÐºÐ»ÑÑи заÑиÑÑ. ÐÑиложениÑ
              вÑегда Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð³Ð¾ÑÐ¾Ð²Ñ Ðº полÑÑениÑ
              ÑÑой оÑибки, Ñак как пÑиложение не
              Ð¼Ð¾Ð¶ÐµÑ ÐºÐ¾Ð½ÑÑолиÑоваÑÑ ÑокÑаÑение
              колиÑеÑÑва доÑÑÑпнÑÑ pkey.

ÐÐРСÐÐ
       ÐÑÐ·Ð¾Ð²Ñ pkey_alloc() и pkey_free() бÑли Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ñ Ð²
       Linux 4.9; поддеÑжка в glibc доÑÑÑпна Ñ Ð²ÐµÑÑии 2.27.

СÐÐТÐÐТСТÐÐРСТÐÐÐÐРТÐÐ
       СиÑÑемнÑе вÑÐ·Ð¾Ð²Ñ pkey_alloc() и pkey_free() еÑÑÑ ÑолÑко
       в Linux.

ÐÐÐÐЧÐÐÐЯ
       ÐÑзов pkey_alloc() вÑегда безопаÑен в
       незавиÑимоÑÑи Ð¾Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки клÑÑей
       опеÑаÑионной ÑиÑÑемой. Ðго можно
       иÑполÑзоваÑÑ ÐºÐ°Ðº меÑанизм опÑеделениÑ
       поддеÑжки pkey; он вÑегда пÑоÑÑо возвÑаÑаеÑ
       оÑÐ¸Ð±ÐºÑ ENOSPC, еÑли опеÑаÑÐ¸Ð¾Ð½Ð½Ð°Ñ ÑиÑÑема не
       поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ pkey.

       ЯдÑо гаÑанÑиÑÑеÑ, ÑÑо ÑодеÑжимое аппаÑаÑнÑÑ
       ÑегиÑÑÑов пÑав (PKRU) бÑÐ´ÐµÑ ÑоÑÑанено ÑолÑко длÑ
       вÑделеннÑÑ ÐºÐ»ÑÑей заÑиÑÑ. Ðока клÑÑ Ð½Ðµ
       вÑделен (до пеÑвого вÑзова, возвÑаÑаÑÑего
       ÑÑÐ¾Ñ ÐºÐ»ÑÑ pkey_alloc(), или поÑле его
       оÑÐ²Ð¾Ð±Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ pkey_free()), ÑдÑо можеÑ
       вноÑиÑÑ Ð¿ÑоизволÑнÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑаÑÑи
       ÑегиÑÑÑов пÑав, оÑноÑÑÑиÑÑÑ Ðº ÑÑÐ¾Ð¼Ñ ÐºÐ»ÑÑÑ.

ÐÐ ÐÐÐÐ
       СмоÑÑиÑе pkeys(7).

СÐÐТРÐТРТÐÐÐÐ
       pkey_mprotect(2), pkeys(7)



Linux                             2018-02-02                     PKEY_ALLOC(2)