Interrupt og DS/BP

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Danish to

Threaded View
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   <-- operativsystemets data-segment
   BP = SP       <-- user-processens stack-pointer

Men når lokale variable tilgås anvendes BP-pointeren jo selvfølgelig til
formålet, men desværre har vi jo lige skiftet DS ud til
operativsystemets pointer og nu vil adressen

   DS*16 + BP + offset

blive anvendt som lokal variabel! Dvs. nu befinder vi os jo ikke længere
i datasegmentet/stacksegmentet for user-processen, men derimod i
operativsystemets data-område hvor globale variable ligger.

f.eks.

    ;      d = outregs->dx;
    ;    
    mov    ax,word ptr [di+6]
    mov    word ptr [bp-8],ax


Dette er ikke særlig smart da ethvert systemkald så vil lave rav i
variablene (og ja, vi er stødt ind i problemet)!

Værre er så, at vi faktisk ændrer AX, BX, CX og DX registrene ved udgang
af interruptet - mærkeligt nok returnerer disse værdier godt nok når vi
anvender flg. asm-kode:


    ;      asm {
    ;        mov  ax,a;
    ;    
    mov      ax,[bp-2]
    ;    
    ;        mov  bx,b;
    ;    
    mov      bx,[bp-4]
    ;    
    ;        mov  cx,c;
    ;    
    mov      cx,[bp-6]
    ;    
    ;        mov  dx,d;
    ;    
    mov      dx,[bp-8]
    ;    
    ;        mov  [BP+16],ax;
    ;    
    mov      [BP+16],ax
    ;    
    ;        mov  [BP+14],bx;
    ;    
    mov      [BP+14],bx
    ;    
    ;        mov  [BP+12],cx;
    ;    
    mov      [BP+12],cx
    ;    
    ;        mov  [BP+10],dx;
    ;    
    mov      [BP+10],dx
    ;    
    ;      }
    ;    
    ;    }
    ;    
    leave    
    pop    di
    pop    si
    pop    ds
    pop    es
    pop    dx
    pop    cx
    pop    bx
    pop    ax
    iret


Nogen der kan forklare hvordan vi skal lave programmet anderledes for at
vi kan anvende variable (lokale) i interrupt-routinen uden at den laver
rav i data-segmentet på operativsystemet!

Og hvorfor returnerer værdierne i registrene egentlig korrekt alligevel
- det forstår jeg slet ikke!

Noget er rigtigt, men et memory-dump viste os i hvert fald at antagelse
med at interruptet overskriver noget af memory giver os store problemer!


Håber på alt den hjælp i kan give

Postet i både dk.teknik.elektronik og dk.edb.programmering.c, da dette
har nær relevans for begge grupper i henhold til at ovenstående bruges
meget til embeddede løsninger!


Mvh / Preben


P.S. Skriv hvis i mangler noget information! Skal være til en fødselsdag
om en halv time så det er skrevet lidt hurtigt!

P.P.S. QuintOS.dk (dvs. indtil videre ligger siden på myservice.dk)
fortæller lidt om projektet, men desværre er den ikke så udviklet endnu,
men det kommer nok en dag!

Re: Interrupt og DS/BP

Jeg har lige kigget lidt i et gammelt projekt, jeg have glemt noget, jeg har
ikke roddet med x86 siden...

Preben Holm wrote:

Quoted text here. Click to load it


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


Re: Interrupt og DS/BP

Quoted text here. Click to load it

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


Re: Interrupt og DS/BP
Hej


Quoted text here. Click to load it

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!


Quoted text here. Click to load it

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!


Quoted text here. Click to load it

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


Mvh / Preben

Re: Interrupt og DS/BP
Hej Preben,


Quoted text here. Click to load it

Gosh, bruges den stadig ?  ;)

 
Quoted text here. Click to load it

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 ;)


Quoted text here. Click to load it

Magic ;)


Quoted text here. Click to load it

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


--
Venlig hilsen,
Søren
We've slightly trimmed the long signature. Click to see the full one.
Re: Interrupt og DS/BP
Hej igen!

Quoted text here. Click to load it

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


Re: Interrupt og DS/BP
Hej Preben,


Quoted text here. Click to load it

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).


Quoted text here. Click to load it

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


Quoted text here. Click to load it

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


--
Venlig hilsen,
Søren
We've slightly trimmed the long signature. Click to see the full one.
Re: Interrupt og DS/BP
Quoted text here. Click to load it

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


Quoted text here. Click to load it

Jep! Nogle af dem i hvert fald *gg*


Quoted text here. Click to load it

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*!

Re: Interrupt og DS/BP
Hej Preben,


Quoted text here. Click to load it

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


Quoted text here. Click to load it

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


--
Venlig hilsen,
Søren
We've slightly trimmed the long signature. Click to see the full one.
Re: Interrupt og DS/BP
Hej igen

OPDATERING - Problem stadig ikke løst!

_systemCall    proc    far
Quoted text here. Click to load it

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

  SS*16 + BP + offset

basepointeren er jo lidt speciel!!!

http://cs.smith.edu/~thiebaut/ArtOfAssembly/CH04/CH04-2.html#HEADING2 -
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!


Re: Interrupt og DS/BP
Hej igen

OPDATERING - Problem stadig ikke løst!

_systemCall proc far
Quoted text here. Click to load it

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

  SS*16 + BP + offset

basepointeren er jo lidt speciel!!!

http://cs.smith.edu/~thiebaut/ArtOfAssembly/CH04/CH04-2.html#HEADING2 -

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 <- hvis SP rammer nul, vil den da aldrig
automatisk kunne begynde at adressere lavere end SS - vel?


Mvh / Preben Holm


Re: Interrupt og DS/BP
Quoted text here. Click to load it

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]  <-- word ptr i forhold til SS
    mov    di,ax                <-- word ptr flyttes til di
   ;    
   ;      inregs = &inregs_d;
   ;    
    lea    ax,word ptr [bp-24]
    mov    si,ax
   ;    
   ;    
   ;      inregs->ax = _AX;
   ;    
    mov    word ptr [si],ax
; word ptr [si] i forhold til DS -- her går den rent gal, for
pointeren er jo lavet på baggrund af SS og ikke DS, dvs. nu
skriver vi altså i
  DS*16 + BP + evt. disp

hvilket jo er data i vores data-område.

   ;      inregs->bx = _BX;
   ;    
    mov    word ptr [si+2],bx  <-- samme problem her
   ;    
   ;      inregs->cx = _CX;
   ;    
    mov    word ptr [si+4],cx  <-- samme igen
   ;    
   ;      inregs->dx = _DX;
   ;    
    mov    word ptr [si+6],dx  <-- og igen


Spørgsmålet er så ikke længere hvorfor, for det tror jeg
efterhånden jeg har fundet ud af, men nu er det nok nærmere
hvordan kommer vi udenom problematikken!

  unsigned short a, b, c, d, ds;
  struct regs *outregs, *inregs;
  struct regs outregs_d, inregs_d;
  outregs = &outregs_d;
  inregs->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!


Re: Interrupt og DS/BP
Quoted text here. Click to load it

Ehh, btw. skal lige have tjek på noget helt præcist, for lea loader den
effektive adresse, men i forhold til hvad?

Tjekkede lige instruktions set manualen og fandt ikke ud af meget!

Quoted text here. Click to load it

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

Site Timeline