Vielen Dank für alle eure Anregungen und Erklärungen. Ich habe mein Problem mit dem Pagefault noch nicht lösen können. Es geht aber um das Taskswitching. Folgender ASM:
001035c1 <task_switch>:
1035c1: 55 push %ebp
1035c2: 89 e5 mov %esp,%ebp
1035c4: 53 push %ebx
1035c5: 83 ec 14 sub $0x14,%esp
1035c8: a1 2c 8d 10 00 mov 0x108d2c,%eax
1035cd: 85 c0 test %eax,%eax
1035cf: 0f 84 b6 00 00 00 je 10368b <task_switch+0xca>
1035d5: 89 e3 mov %esp,%ebx
1035d7: 89 5d f4 mov %ebx,-0xc(%ebp)
1035da: 89 eb mov %ebp,%ebx
1035dc: 89 5d f0 mov %ebx,-0x10(%ebp)
1035df: e8 84 cc ff ff call 100268 <read_eip>
1035e4: 89 45 ec mov %eax,-0x14(%ebp)
1035e7: 81 7d ec 45 23 01 00 cmpl $0x12345,-0x14(%ebp)
1035ee: 0f 84 9a 00 00 00 je 10368e <task_switch+0xcd>
1035f4: a1 2c 8d 10 00 mov 0x108d2c,%eax
1035f9: 8b 55 f4 mov -0xc(%ebp),%edx
1035fc: 89 50 04 mov %edx,0x4(%eax)
1035ff: a1 2c 8d 10 00 mov 0x108d2c,%eax
103604: 8b 55 f0 mov -0x10(%ebp),%edx
103607: 89 50 08 mov %edx,0x8(%eax)
10360a: a1 2c 8d 10 00 mov 0x108d2c,%eax
10360f: 8b 55 ec mov -0x14(%ebp),%edx
103612: 89 50 0c mov %edx,0xc(%eax)
103615: a1 2c 8d 10 00 mov 0x108d2c,%eax
10361a: 8b 40 14 mov 0x14(%eax),%eax
10361d: a3 2c 8d 10 00 mov %eax,0x108d2c
103622: a1 2c 8d 10 00 mov 0x108d2c,%eax
103627: 85 c0 test %eax,%eax
103629: 75 0a jne 103635 <task_switch+0x74>
10362b: a1 28 8d 10 00 mov 0x108d28,%eax
103630: a3 2c 8d 10 00 mov %eax,0x108d2c
103635: a1 2c 8d 10 00 mov 0x108d2c,%eax
10363a: 8b 40 04 mov 0x4(%eax),%eax
10363d: 89 45 f4 mov %eax,-0xc(%ebp)
103640: a1 2c 8d 10 00 mov 0x108d2c,%eax
103645: 8b 40 08 mov 0x8(%eax),%eax
103648: 89 45 f0 mov %eax,-0x10(%ebp)
10364b: a1 2c 8d 10 00 mov 0x108d2c,%eax
103650: 8b 40 0c mov 0xc(%eax),%eax
103653: 89 45 ec mov %eax,-0x14(%ebp)
103656: a1 2c 8d 10 00 mov 0x108d2c,%eax
10365b: 8b 40 10 mov 0x10(%eax),%eax
10365e: a3 10 70 10 00 mov %eax,0x107010
103663: a1 10 70 10 00 mov 0x107010,%eax
103668: 8b 98 00 20 00 00 mov 0x2000(%eax),%ebx
10366e: 8b 45 ec mov -0x14(%ebp),%eax
103671: 8b 55 f4 mov -0xc(%ebp),%edx
103674: 8b 4d f0 mov -0x10(%ebp),%ecx
103677: fa cli
103678: 89 c1 mov %eax,%ecx
10367a: 89 d4 mov %edx,%esp
10367c: 89 cd mov %ecx,%ebp
10367e: 0f 22 db mov %ebx,%cr3
103681: b8 45 23 01 00 mov $0x12345,%eax
103686: fb sti
103687: ff e1 jmp *%ecx
103689: eb 04 jmp 10368f <task_switch+0xce>
10368b: 90 nop
10368c: eb 01 jmp 10368f <task_switch+0xce>
10368e: 90 nop
10368f: 83 c4 14 add $0x14,%esp
103692: 5b pop %ebx
103693: 5d pop %ebp
103694: c3 ret
Nun bekomme ich folgende Register in der PF:
Page fault at 0xF45D8A15! (present = 1, rw = 1, user = 0, reserved = 0, id = 0)
EDI = 0x57A17, ESI = 0x57A20, EBP = 0xDFFFFF78, EBX = 0x30DCC
EDX = 0x3, ECX = 0x32, EAX = 0xC008100C, ESP = 0x7DB
EIP = 0x1035D4, CS = 0x8, DS = 0xC0080010, SS = 0x0
INT = 14, ERR = 0x2
EFLAGS = 0x10082, USRESP = 0x0
Wenn ich nun nach der EIP suche, stell ich fest, das es keine 0x1035D4 zu geben scheint. An besagter Stelle im C-Source ist nur eine if:
void task_switch()
{
if(!current_task)
{
return;
}
current_task selbst ist ein globaler volatile Pointer auf eine Struktur, und stellt immer den derzeit ausgeführten Task dar. Geh ich recht in der Annahme, das der Stack hier ziemlich kaputt ist und vermutlich sogar der Stack der Funktion task_switch überschrieben wurde? Wenn ja, wo könnte ich anfangen, den Fehler zu suchen? Ich bin vermutlich schon ein bisschen betriebsblind.