Interrupt og DS/BP

Hej alle

Vi (projekt gruppe) har et problem i vores programmering af operativsystem systemkald (software interrupt).

Compiler: Borland C++ 1.01 Ingen standard-header's bruges!

Problemet består i, at vi skal have en lokalvariabel i en interrupt-procedure, det er også fint nok, men når vi går ind i selve interrupt-rutinen får vi flg. asm-kode:

_systemCall proc far push ax push bx push cx push dx push es push ds push si push di push bp mov bp,DGROUP mov ds,bp mov bp,sp sub sp,24

Dvs. DS = DGROUP

Reply to
Preben Holm
Loading thread data ...

Det er jo også normalt det man vil, interruptet sørger for at alt er som før...

Hvis i vil have fat i processens dataområde, så er det jo bare at simulere 'leave' ... det er vist noget med SP=BP og pop BP.

Husk at parkere SP til startværdien igen, ellers bliver det nok noget rod når i går ud af rutinen 8)

Men det kan godt være jeg har glemt noget...

Mvh Kimjand

Reply to
Kim Johan Andersson

Forresten, det er normalt at pass'e parametre til interrupts gennem cpu-registre... dem kan du jo bare snuppe oppe fra stakken. Hvis du ændrer dem på stakken bliver de jo spolet tilbage i registrene ved udgang af rutinen.

Mvh Kimjand

Reply to
Kim Johan Andersson

Hej Preben,

Gosh, bruges den stadig ? ;)

En prædefineret chunk afsat til en ekstra stack der så switches med kunne være en løsning... Men "alting" er lettere når man skriver helt nede på jernet og det er _alt_ for mange år siden, at Borlands C++ ver. 1. blev smidt ud af min maskine til at jeg tør anvise en præcis metode. (Hvad med at patche den kompilerede kode i debug ;)

Magic ;)

Jo tak, hører da gerne lottoresultaterne for de næste par uger :P

--
Venlig hilsen,
Søren
 Click to see the full signature
Reply to
Søren

Hej

Ja, men det er netop det der er problemet. Interruptets lokal-variable overskriver global-variable i OS'ets DS, og det er et stort problem for os. Det er jo netop fordi den nupper jo netop user-processens stackpointer men propper den ned i OS'ets datasegment, og det er jo en gang bæ!

Well, vi vil jo gerne have mulighed for at ændre variable i styresystemet (helst uden brug af far-pointere), men også uden at fuske for meget!

Hmm, ja, men det er bare lidt noget rod, for C-compilere gør jo en masse mere helt af sig selv, og så er der jo væsentligt mere der skal pop'es og det kan give en masse rod!

Tak for hjælpen, vil overveje hvad der er bedst, men skriv endelig hvis du/I finder på noget smart :-)

Mvh / Preben

Reply to
Preben Holm

Hej igen!

Før interrupt enables skal regisre selvfølgelig skrives tilbage til registrene for at kunne tilgås på normal vis i interrupt'et!

Reply to
Preben Holm

Hej igen

OPDATERING - Problem stadig ikke løst!

_systemCall proc far

fandt lige ud af at ovenstående faktisk er forkert.. det er

SS*16 + BP + offset

basepointeren er jo lidt speciel!!!

formatting link

35

Men spørgsmålet er så bare, hvorfor det går så galt med lokal-variblene alligevel!!

Vi har prøvet at flytte user-processerne længere væk fra operativsystemet, men alligevel overskrives hukommelsen i OS'ets datasegment af ISR'en!

Lige nu fatter jeg ikke en skid!

Reply to
Preben Holm

Hej igen

OPDATERING - Problem stadig ikke løst!

_systemCall proc far

fandt lige ud af at ovenstående faktisk er forkert.. det er

SS*16 + BP + offset

basepointeren er jo lidt speciel!!!

formatting link

35

Men spørgsmålet er så bare, hvorfor det går så galt med lokal-variblene alligevel!!

Vi har prøvet at flytte user-processerne længere væk fra operativsystemet, men alligevel overskrives hukommelsen i OS´ets datasegment af ISR´en!

Lige nu fatter jeg ikke en skid!

Spørgsmålet er så samtidig - hvis SS er sat til f.eks. 0x00A0 og SP til 1FF fra start af

Reply to
Preben Holm

Hej Preben,

Det har jeg aldrig leget med (skidt for sig og snot for sig), men jeg kunne forestille mig at det ikke lader sig gøre alt for let (om overhovedet).

Nej, men heldigvis har de andre gode egenskaber at leve på :)

Heldigvis ? Det er da på humanoira at alle sildene flokkes ;)

--
Venlig hilsen,
Søren
 Click to see the full signature
Reply to
Søren

Næh, men det kunne selvfølgelig være lidt sjovt alligevel *gg*

Jep! Nogle af dem i hvert fald *gg*

Tjaaa, men medicinerne/biologerne er nu heller ikke ligefrem værst, hvis jeg nu skal give min ærlige mening til kende! Mange humaniora'er er da godt nok ikke altid lige helt normale - eller dvs. man ved jo ikke om de normale humaniora'er er det ene eller det andet - de afviger jo ikke *gg*!

Reply to
Preben Holm

Okay, returværdier returneres godt nok. Det er fordi adressering sker i forhold til SS når en mov [BP+disp],ax instruktion udføres.

Desværre forstår C-compileren ikke hvad det er vi vil her: ; unsigned short a, b, c, d, ds; ; struct regs *outregs, *inregs; ; struct regs outregs_d, inregs_d; ; outregs = &outregs_d; ; lea ax,word ptr [bp-16] bx = _BX; ; mov word ptr [si+2],bx cx = _CX; ; mov word ptr [si+4],cx dx = _DX; ; mov word ptr [si+6],dx bx = _BX;

ovenstående kode giver i hvert fald problemer, og det er ret tydeligt nogle væsentlige problemer!

vi har også prøvet at tilgå strukturerne uden brug af outregs_d og inregs_d, men dette hjælper ligeså lidt. Pladsen bliver rigtig nok reserveret (det finder den selv ud af vi ikke selv gør), men problemet med data-segmentet er der faktisk stadig!

Jeg ved ikke hvordan normale funktioner egentlig gør, men det har i hvert fald indtil videre ikke givet os nogle problemer!

Det er kun i interruptet at det faktisk opstår dette problem!

Der må da være et par hårde gutter her på usenet der kan klare en sådan sag!!! Jeg har jo kun programmeret C i sådan ca. 1½ måned!

Reply to
Preben Holm

Anybody der ikke er på påskeferie!!!

Er det reelt set her problemet ligger eller hvad?

Ja, det er da klart der er et problem, men er kommet i tvivl om jeg faktisk har forstået det korrekt alligevel (diskuterer med mig selv hele tiden)

Hele interrupt-rutinen ses i C nedenfor. Det gør måske det hele lidt nemmere for Jer alle:

void far interrupt systemCall(void) { unsigned short a, b, c, d, ds; struct regs *outregs, *inregs; struct regs outregs_d, inregs_d; outregs = &outregs_d; inregs = &inregs_d;

inregs->ax = _AX; inregs->bx = _BX; inregs->cx = _CX; inregs->dx = _DX;

// sys_call_table[(unsigned char)inregs->ax](inregs, outregs); sys_call_table[(unsigned char)0](inregs, outregs);

a = outregs->ax; b = outregs->bx; c = outregs->cx; d = outregs->dx;

asm { mov ax,[bp-2] mov bx,[bp-4] mov cx,[bp-6] mov dx,[bp-8] mov [BP+16],ax mov [BP+14],bx mov [BP+12],cx mov [BP+10],dx } }

Håber I kan fortælle hvad der går galt for os!

Mvh / Preben

Reply to
Preben Holm

Hej Preben,

Især hvis man vil lege doktor ;) og de burde da have lært sandsynlighedsregning.

Hmmm, det unormale er nu også mere underholdene at observere :)

--
Venlig hilsen,
Søren
 Click to see the full signature
Reply to
Søren

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.