Ik zit nu al een tijdje te kloten met een stukje assembly code. Allereerst het algemene idee. Er zijn 3 routines. Arbiter, proc1 en proc2. Het idee is dat de arbiter zal fungeren als zeer simpele scheduler. De 2 processen roepen zelf de arbiter aan dus dit maakt de zaak al een stuk simpler. Daarnaast is de startpositie van beide processen bekend.
Het probleem zit hem in het opslaan van de instructie pointer (EIP)
Hier de code van de arbiter (versimpeld):
Hier is het stukje initializatie code:
De beide processen liggen direct achter elkaar in het geheugen en het ene proces draait prima. Echter zit het probleem bij het tweede proces. Hier komt een compleet ander adres tevoorschijn en langzamerhand loopt ie in de stront doordat ie willekeurige instructies aan het uitvoeren is.
Hier de code van 1 proces. (Ze zijn exact gelijk qua opbouw)
Ik hoop dat een van de GoT devvers mij inzicht kan verschaffen in wat ik hier verkeerd doe
Let wel dat de code zo uit m'n hoofd getypt is dus er kunnen hier en daar wat kleine typefoutjes tevoorschijn zijn gekomen
Het probleem zit hem in het opslaan van de instructie pointer (EIP)
Hier de code van de arbiter (versimpeld):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| unsigned int procPos[MAX_PROCESSEN];
int currentProc = 0;
void arbiter(void)
{
unsigned int localEIP;
if(currentProc == -1)
{
// Eerste aanroep, start 1e proces
__asm pop dword ptr localEIP
// FIXME: EIP bevat hier het adres waar de init routine ons heeft aangeroepen
// Sla deze ergens op zodat we ooit nog eens kunnen stoppen.
localEIP = procPos[0];
__asm push dword ptr localEIP
__asm ret
}
else
{
// Haal adres van de stack vanwaar deze methode is aangeroepen
__asm pop dword ptr localEIP
// Sla deze op en haal de nieuwe instructie pointer op
procPos[currentProc] = localEIP;
currentProc = (currentProc == 0) ? 1 : 0;
localEIP = procPos[currentProc];
// Gooi het adres op de stack.
// De ret instructie haalt deze van de stack en zal hier executie vervolgen
__asm push dword ptr localEIP
__asm ret
}
} |
Hier is het stukje initializatie code:
code:
1
2
3
4
5
6
7
8
9
10
11
| void init(void)
{
// Startpositie van beide processen
procPos[0] = ???;
procPos[1] = ???;
currentProc = -1;
// Begin het proces
arbiter();
} |
De beide processen liggen direct achter elkaar in het geheugen en het ene proces draait prima. Echter zit het probleem bij het tweede proces. Hier komt een compleet ander adres tevoorschijn en langzamerhand loopt ie in de stront doordat ie willekeurige instructies aan het uitvoeren is.
Hier de code van 1 proces. (Ze zijn exact gelijk qua opbouw)
code:
1
2
3
4
5
| proc1_loop: push dword ptr [adresvanstring] call my_printf (my_printf is van het type void my_printf(char *); ) call arbiter; jmp proc1_loop |
Ik hoop dat een van de GoT devvers mij inzicht kan verschaffen in wat ik hier verkeerd doe
Let wel dat de code zo uit m'n hoofd getypt is dus er kunnen hier en daar wat kleine typefoutjes tevoorschijn zijn gekomen