Unix Man (Ñïðàâî÷íîå ðóêîâîäñòâî)

         

EXECSEG(3)


EXECSEG(3)
XENIX System V (21 èþíÿ 1987)

ÈÌß


execseg - äeëaeò y÷acòoê äaííûx âûïoëíÿeìoé ïpoãpaììoé

ÑÈÍÒÀÊÑÈÑ

#include

excode_t execseg (oldaddr, size) exdata_t oldaddr; unsigned size;

int unexecseg (addr) excode_t addr;

ÎÏÈÑÀÍÈÅ


execseg ïoëy÷aeò òeêyùèe aäpec è paçìep y÷acòêa ïaìÿòè, êoòopûé äoëæeí áûòü âûïoëíeí, è âoçâpaùaeò còapòoâûé aäpec y÷acòêa, â êoòopoì, ïo êpaéíeé ìepe, size áaéòoâ è êoòopoìy ìoæío ïepeäaòü yïpaâëeíèe. B cëy÷ae ïpoöeccopoâ Intel 8086 è 80286 ceãìeíòíûé peãècòp CS accoöèèpyeòcÿ c ceãìeíòoì äaííûx, â êoòopoì pacïoëoæeí y÷acòoê oldaddr. Ýòo oçía÷aeò, ÷òo cìeùeíèÿ äo òpeáyeìûx áaéòoâ â âûïoëíÿeìoì ceãìeíòe è ceãìeíòe äaííûx coâïaäaþò, ío ceëeêòopû y íèx paçíûe.

B cëy÷ae 8086 è 80286 òèïû "excode_t" è "exdata_t" ÿâëÿþòcÿ äëèííûìè (far) yêaçaòeëÿìè. B cëy÷ae apxèòeêòyp, ãäe còpaíèöû paçíûx ceãìeíòoâ çaùèùaþòcÿ ïo ÷òeíèþ/çaïècè/âûïoëíeíèþ, âoçâpaùaeìûé aäpec èäeíòè÷eí apãyìeíòy, ïepeäaâaeìoìy execseg.

Peêoìeíäyeòcÿ, ÷òoáû ïpè ècïoëüçoâaíèè ýòoé ôyíêöèè ïpoãpaììû äëÿ 8086 èëè 80286 èìeëè áoëüøyþ ìoäeëü ïaìÿòè; èía÷e ïpoãpaììècò äoëæeí xopoøo opèeíòèpoâaòücÿ â cìeøaííûx ìoäeëÿx è äëèííûx yêaçaòeëÿx.

Ïpè oáíapyæeíèè oøèáêè execseg âoçâpaùaeò ((excode_t)-1) è çaíocèò â errno êoä oøèáêè ENONEM. Oøèáêoé c÷èòaeòcÿ íeêoppeêòíûé aäpec äaííûx èëè size, a òaêæe íeâoçìoæíocòü paçìecòèòü íoâûé ceëeêòop äaííûx.

unexecseg çaïpeùaeò ècïoëüçoâaòü addr, âoçâpaùeííûé â câoe âpeìÿ execseg, êaê aäpec âûïoëíÿeìoé ïpoãpaììû. B cëy÷ae 8086 è 80286 ýòoò âûçoâ ïpèâoäèò ê ocâoáoæäeíèþ ceëeêòopa, ècïoëüçoâaííoão äëÿ âûïoëíÿeìoão y÷acòêa. Ôyíêöèÿ âoçâpaùaeò 0 â cëy÷ae ycïeøíoão çaâepøeíèÿ è -1 ïpè oøèáêe. Haïpèìep, ecëè addr íe ÿâëÿeòcÿ aäpecoì, âoçâpaùeííûì paíee ôyíêöèeé execseg, âoçpaùaeòcÿ -1 è ýòoò aäpec íe ìoæeò âïpeäü cëyæèòü aäpecoì âûïoëíÿeìoé ïpoãpaììû.

ÏÐÈÌÅÐ


excode_t funcp; char far *datap; ... datap=brkctl(BR_NEWSEG,1000L,0L); load_with_code(datap,1000); /* çaãpyæaeò ïpoãpaììy â y÷acòoê datap */ funcp=execseg(datap,1000); (*funcp)(); /* âûçoâ ïpoãpaììû */ if(unexecseg(funcp)==-1) { printf("unexecseg failed0); exit(1); }


ÇÀÌÅ×ÀÍÈß



B cëy÷ae Intel 8086 è 80286 execseg äoëæía ïoëy÷aòü äëèííûé aäpec y÷acòêa. Ýòo cpeäcòâo peêoìeíäyeòcÿ òoëüêo o÷eíü oïûòíûì ïpoãpaììècòaì.

Ïocêoëüêy âoçâpaùaeìoe çía÷eíèe execseg è ïepeäaâaeìûé eé aäpec äoëæíû áûòü äëèííûìè yêaçaòeëÿìè, ëþáaÿ ïpopaììa, âêëþ÷aþùaÿ â ceáÿ ôaéë xdata.h, äoëæía êoìïoíoâaòücÿ c ôëaãoì -Me.

Cëeäyþùèe oãpaíè÷eíèÿ oòíocÿòcÿ òoëüêo ê cècòeìíoìy âûçoây, ïoçâoëÿþùeìy âûïoëíÿòü y÷acòêè äaííûx. Xoòÿ execseg ïoëy÷aeò aäpec è paçìep y÷acòêa, âecü ceãìeíò, coäepæaùèé y÷acòoê, äyáëèpyeòcÿ. Ïepeä äyáëèpoâaíèeì ïpoâepÿeòcÿ êoppeêòíocòü aäpeca è paçìepa y÷acòêa. Ïoêa ceãìeíò äyáëèpoâaí, ê íeìy íeëüçÿ ïpèìeíÿòü ôyíêöèè ocâoáoæäeíèÿ ïaìÿòè (ècïoëüçyþùèe sbrk(3) è ). Ýòè oãpaíè÷eíèÿ pacïpocòpaíÿþòcÿ ía âecü ceãìeíò. Ïocëe ïpèìeíeíèÿ ê ceãìeíòy ôyíêöèè unexecseg ïaìÿòü â íeì ìoæeò áûòü ocâoáoæäeía. Äaæe ecëè ceãìeíò yæe äyáëèpoâaí, êaæäûé íoâûé âûçoâ execseg, ïpèìeíeííûé ê ýòoìy ceãìeíòy, coçäaeò íoâûé äyáëü.

Bcòpeòèâ execseg, êoìïèëÿòop ïo oøèáêe ìoæeò âûäaòü cooáùeíèe "at least one void operand", êoòopoe íyæío ïpoèãíopèpoâaòü.


Ñîäåðæàíèå ðàçäåëà