1
Lowlevel-Coding / Re: Erkennen ob ein Programm beendet wurde.
« am: 22. February 2010, 10:33 »
Hmm ja ich ich muss es wohl eh so machen dass ich das auch in die queue reinschreibe!
22. November 2024, 15:41
Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.
Danke für deine Antwort aber mein Betriebssystem verwendet keine syscalls!Und... wie funktioniert dein Betriebssystem dann?
#include <stdio.h>
void main() {
printf("OS1 Testprogramm\n\n");
while(1){}
}
#include <stdio.h>
void main() {
printf("OS1 Testprogramm\n\n");
return;
}
Booting 'os1'
kernel /kernel
Error 10: Unsupported Multiboot features requested
Press any key to continue...
Aber ich verstehe das nicht das Patch-Script ist ohne Probleme durchgelaufen. Auch der Kompiliervorgang von Grub wurde erfolgreich beendet. Woran kann das liegen?.align 4
.int 0x1badb002
.int 0x6
.int -0x1BADB008
.int 0x0
.int 0x0
.int 0x0
.int 0x0
.int 0x0
.int 0x1
.int 640
.int 480
.int 8
printf("%x\n", mbInfo->vbe_control_info);
printf("%x\n", mbInfo->vbe_mode_info);
printf("%x\n", mbInfo->vbe_mode);
printf("%x\n", mbInfo->vbe_interface_seg);
printf("%x\n", mbInfo->vbe_interface_off);
printf("%x\n", mbInfo->vbe_interface_len);
Danke
void task_a(void)
{
int yPos = 0;
int xPos = 0;
while (1) {
if(posX % 2 == 0)
print_string_at_pos("A", 0x02, xPos, yPos);
xPos++;
}
}
void task_b(void)
{
int yPos = 0;
int xPos = 0;
while (1) {
if(posX % 2 == 1)
print_string_at_pos("B", 0x04, xPos, yPos);
xPos++;
}
}
void task_a(void)
{
int yPos = 0;
int xPos = 0;
while (1) {
print_string_at_pos("A", 0x02, xPos, yPos);
xPos++;
}
}
void task_b(void)
{
int yPos = 0;
int xPos = 0;
while (1) {
print_string_at_pos("B", 0x04, xPos, yPos);
xPos++;
}
}
if (r->intr == 0x20) {
printf("Scheduler Start!\n");
new_cpu = schedule(r);
printf("Scheduler Ende!\n");
}
Ich hätte da noch so 2 kleine Einwände erstens der Stack überschreibt die BIOS Data Area
Willst du es uns auch verraten? Es könnte dem nächsten helfen.
0x0000000000000000 PROVIDE (__start_bss, .)
bss 0x0000000000000000 0x5000
bss 0x0000000000000000 0x5000 ./bin/boot.o
0x0000000000005000 PROVIDE (__stop_bss, .)
Hier sehe ich also dass der Stack an der physischen Adresse 0x5000 Startet ich habe also 20480Byte platz für den Stack (Da dieser ja nach unten wächst). Angelegt wird der Stack ja in der boot.S mit folgendem Code:.section bss
.space 20480
kernelStack:
bss geht also bei 0x0 an und dann mache ich einen Space von 20480Byte also 0x0000 bis 0x5000 jetzt setze ich im Kernel, im physischen MemoryManagement, die Adressen von 0x0 bis 0x5000 als RESERVIERT (dann kann ich da keinen Speicher mehr anfordern) und schon liegen meine PageTable und das PageDir AB 0x5000 und höher somit überschreibe ich mit dem Stack meine PageDir nicht und somit funktionierts..section multiboot
.align 4
.int 0x1badb002
.int 0x2
.int -0x1BADB004
.section .text
.extern kernel_init
.global _start
_start:
mov $kernelStack, %esp
push %ebx
call kernel_init
jmp .
.section bbs
.space 8192
kernelStack:
ENTRY(_start)
SECTIONS
{
. = 0x100000;
.text : {
*(multiboot)
*(.text)
}
.data ALIGN(4096) : {
*(.data)
}
.rodata ALIGN(4096) : {
*(.rodata)
}
.bss ALIGN(4096) : {
*(.bss)
}
kernelEnd = .;
}
Code: [Auswählen]Addr | 0 1 2 3 4 5 6 7 8 9 A B C D E F
-------+-------------------------------------------------
0x3000 | 27 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x3010 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x3020 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
...
int pageDirIndex = pageFrames % 1024;
verwende ich gar nicht!