Ãëàâíàÿ > Îïåðàöèîííûå ñèñòåìû > UNIX
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) è brkctl(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òü.
Ãëàâíàÿ > Îïåðàöèîííûå ñèñòåìû > UNIX
|