41
Offtopic / Re: wo sind TeeJay und mastermesh eig. gebilieben?
« am: 24. June 2009, 21:57 »werden eig. mal wieder admins gewählt?Warum sollte man neue wählen wenn die Aktuellen ihre Sache gut machen und sogar aktiv sind?

02. June 2023, 21:11
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.
werden eig. mal wieder admins gewählt?Warum sollte man neue wählen wenn die Aktuellen ihre Sache gut machen und sogar aktiv sind?
PS: Was sind eigentl. so die Unterschiede zwischen fpc und gpc?Der eine(gpc) ist offensichtlich kaputt, der andere erst wenn man genauer hinsieht. *g*
Anmerkung:
program_header->p_memsz beinhaltet 0x1b. Führe ich nur "program_header->p_memsz % PAGE_SIZE" aus und gebe das Ergebnis aus, bekomme ich 0x1b, was ja nicht korrekt ist.
/* Libc und so... */
#define NULL ((void*) 0)
void* memcpy(void* dest, const void* src, int len);
void* memset(void* dest, int c, int len);
int strlen(char* str);
/** Struktur, die bei OFW-Aufrufen uebergeben wird */
struct ofw_args
{
const char* func;
int arg_count;
int ret_count;
void* args[10];
} __attribute__((packed));
/** Zeiger auf den OFW-Entrypoint */
int (*ofw_call)(struct ofw_args* args);
/* Nette Openfirmware-Funktionen */
int ofw_finddevice(char* name)
{
struct ofw_args args_chosen = {
.func = "finddevice",
.arg_count = 1,
.ret_count = 1,
.args = {
name
}
};
ofw_call(&args_chosen);
return (int) args_chosen.args[1];
}
void ofw_getprop(int device, char* prop, void* buf, int len)
{
struct ofw_args args_getprop = {
.func = "getprop",
.arg_count = 4,
.ret_count = 1,
.args = {
(void*) device,
prop,
buf,
(void*) len
}
};
ofw_call(&args_getprop);
}
void ofw_write(int handle, void* buf, int len)
{
struct ofw_args args_write = {
.func = "write",
.arg_count = 3,
.ret_count = 1,
.args = {
(void*) handle,
buf,
(void*) len
}
};
ofw_call(&args_write);
}
int ofw_read(int handle, void* buf, int len)
{
struct ofw_args args_read = {
.func = "read",
.arg_count = 3,
.ret_count = 1,
.args = {
(void*) handle,
buf,
(void*) len
}
};
ofw_call(&args_read);
return (int) args_read.args[3];
}
void ofw_exit()
{
struct ofw_args args_exit = {
.func = "exit",
.arg_count = 0,
.ret_count = 0,
};
ofw_call(&args_exit);
}
void ofw_puts(char* str)
{
int handle;
ofw_getprop(ofw_finddevice("/chosen"), "stdout", &handle, sizeof(handle));
ofw_write(handle, str, strlen(str));
}
char ofw_getc(void)
{
int handle;
char c;
ofw_getprop(ofw_finddevice("/chosen"), "stdin", &handle, sizeof(handle));
if (ofw_read(handle, &c, 1) == 0) return 0;
}
/* Hier wird in unser "Kernel" gesprungen */
void _start(unsigned long r3, unsigned long r4, unsigned long r5)
{
ofw_call = (void*) r5;
ofw_puts("Hello World!\r\n");
ofw_puts("Willst du EXIT druckst du Taste...\r\n");
while (ofw_getc() == 0);
ofw_exit();
}
/* Tolle Libc */
void* memcpy(void* dest, const void* src, int len)
{
char* dc = dest;
const char* sc = src;
while (len--) *dc++ = *sc++;
return dest;
}
void* memset(void* dest, int c, int len)
{
char* dc = dest;
while (len--) *dc++ = c;
return dest;
}
int strlen(char* str)
{
int len = 0;
while (*str++) len++;
return len;
}
Brauche ich hier schon einen user stack oder ist der hier identisch mit dem kernel-stack? Muss das in TSS->esp3 TSS->ss3 eingetragen werden?Sobald du Ring3-Prozesse hast, brauchst du einen zusätzlichen Stack. Dieser sollte dann auch mit User-Privilegien gemappt sein, sonst fliegen die Pagefaults frischfrölich.
int main() {
puts("Hallo Welt!");
return 0;
}
void start() {
int result;
// Hier würde man normalerweise noch sowas machen wie Parameter vom Kernel holen und parsen, aber das lassen wir der Einfachheit halber mal weg.
result = main();
syscall_exit(result);
}