shell can launch another user processgit add .git add .!

This commit is contained in:
2026-07-12 20:13:13 -05:00
parent e2ab130324
commit 5c7febbbf0
15 changed files with 403 additions and 220 deletions

View File

@@ -20,4 +20,10 @@ bear -- make
cp vga_text_term.elf ../bin cp vga_text_term.elf ../bin
cd .. cd ..
cd test
make clean
bear -- make
cp test.elf ../bin
cd ..
cd .. cd ..

View File

@@ -26,12 +26,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/vfs.c.o", "obj/kernel/kbd.c.o",
"kernel/vfs.c" "kernel/kbd.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/vfs.c", "file": "/home/slinky/source/RockOS/kernel/kbd.c",
"output": "/home/slinky/source/RockOS/obj/kernel/vfs.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/kbd.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -43,12 +43,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/kmain.c.o", "obj/kernel/gdt.c.o",
"kernel/kmain.c" "kernel/gdt.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/kmain.c", "file": "/home/slinky/source/RockOS/kernel/gdt.c",
"output": "/home/slinky/source/RockOS/obj/kernel/kmain.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/gdt.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -67,91 +67,6 @@
"file": "/home/slinky/source/RockOS/kernel/drivers/pic/pic.c", "file": "/home/slinky/source/RockOS/kernel/drivers/pic/pic.c",
"output": "/home/slinky/source/RockOS/obj/kernel/drivers/pic/pic.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/drivers/pic/pic.c.o"
}, },
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/drivers/devfs/devfs.c.o",
"kernel/drivers/devfs/devfs.c"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/drivers/devfs/devfs.c",
"output": "/home/slinky/source/RockOS/obj/kernel/drivers/devfs/devfs.c.o"
},
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/drivers/cpio/cpio.c.o",
"kernel/drivers/cpio/cpio.c"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/drivers/cpio/cpio.c",
"output": "/home/slinky/source/RockOS/obj/kernel/drivers/cpio/cpio.c.o"
},
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/drivers/pty/pty.c.o",
"kernel/drivers/pty/pty.c"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/drivers/pty/pty.c",
"output": "/home/slinky/source/RockOS/obj/kernel/drivers/pty/pty.c.o"
},
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/drivers/vga/vga.c.o",
"kernel/drivers/vga/vga.c"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/drivers/vga/vga.c",
"output": "/home/slinky/source/RockOS/obj/kernel/drivers/vga/vga.c.o"
},
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/drivers/ide/ide.c.o",
"kernel/drivers/ide/ide.c"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/drivers/ide/ide.c",
"output": "/home/slinky/source/RockOS/obj/kernel/drivers/ide/ide.c.o"
},
{ {
"arguments": [ "arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc", "/home/slinky/opt/cross/bin/i686-elf-gcc",
@@ -196,12 +111,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/gdt.c.o", "obj/kernel/drivers/ide/ide.c.o",
"kernel/gdt.c" "kernel/drivers/ide/ide.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/gdt.c", "file": "/home/slinky/source/RockOS/kernel/drivers/ide/ide.c",
"output": "/home/slinky/source/RockOS/obj/kernel/gdt.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/drivers/ide/ide.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -213,12 +128,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/memory/mm.c.o", "obj/kernel/drivers/vga/vga.c.o",
"kernel/memory/mm.c" "kernel/drivers/vga/vga.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/memory/mm.c", "file": "/home/slinky/source/RockOS/kernel/drivers/vga/vga.c",
"output": "/home/slinky/source/RockOS/obj/kernel/memory/mm.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/drivers/vga/vga.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -230,12 +145,80 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/kbd.c.o", "obj/kernel/drivers/cpio/cpio.c.o",
"kernel/kbd.c" "kernel/drivers/cpio/cpio.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/kbd.c", "file": "/home/slinky/source/RockOS/kernel/drivers/cpio/cpio.c",
"output": "/home/slinky/source/RockOS/obj/kernel/kbd.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/drivers/cpio/cpio.c.o"
},
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/drivers/devfs/devfs.c.o",
"kernel/drivers/devfs/devfs.c"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/drivers/devfs/devfs.c",
"output": "/home/slinky/source/RockOS/obj/kernel/drivers/devfs/devfs.c.o"
},
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/drivers/pty/pty.c.o",
"kernel/drivers/pty/pty.c"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/drivers/pty/pty.c",
"output": "/home/slinky/source/RockOS/obj/kernel/drivers/pty/pty.c.o"
},
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/scheduler.c.o",
"kernel/scheduler.c"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/scheduler.c",
"output": "/home/slinky/source/RockOS/obj/kernel/scheduler.c.o"
},
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/elf.c.o",
"kernel/elf.c"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/elf.c",
"output": "/home/slinky/source/RockOS/obj/kernel/elf.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -271,23 +254,6 @@
"file": "/home/slinky/source/RockOS/kernel/interrupts.c", "file": "/home/slinky/source/RockOS/kernel/interrupts.c",
"output": "/home/slinky/source/RockOS/obj/kernel/interrupts.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/interrupts.c.o"
}, },
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/elf.c.o",
"kernel/elf.c"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/elf.c",
"output": "/home/slinky/source/RockOS/obj/kernel/elf.c.o"
},
{ {
"arguments": [ "arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc", "/home/slinky/opt/cross/bin/i686-elf-gcc",
@@ -315,63 +281,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/lib/stream.c.o", "obj/kernel/kmain.c.o",
"kernel/lib/stream.c" "kernel/kmain.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/lib/stream.c", "file": "/home/slinky/source/RockOS/kernel/kmain.c",
"output": "/home/slinky/source/RockOS/obj/kernel/lib/stream.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/kmain.c.o"
},
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/lib/memory.c.o",
"kernel/lib/memory.c"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/lib/memory.c",
"output": "/home/slinky/source/RockOS/obj/kernel/lib/memory.c.o"
},
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/lib/print.c.o",
"kernel/lib/print.c"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/lib/print.c",
"output": "/home/slinky/source/RockOS/obj/kernel/lib/print.c.o"
},
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/lib/ringbuf.c.o",
"kernel/lib/ringbuf.c"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/lib/ringbuf.c",
"output": "/home/slinky/source/RockOS/obj/kernel/lib/ringbuf.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -390,6 +305,40 @@
"file": "/home/slinky/source/RockOS/kernel/lib/tasks.c", "file": "/home/slinky/source/RockOS/kernel/lib/tasks.c",
"output": "/home/slinky/source/RockOS/obj/kernel/lib/tasks.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/lib/tasks.c.o"
}, },
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/lib/ringbuf.c.o",
"kernel/lib/ringbuf.c"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/lib/ringbuf.c",
"output": "/home/slinky/source/RockOS/obj/kernel/lib/ringbuf.c.o"
},
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/lib/stream.c.o",
"kernel/lib/stream.c"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/lib/stream.c",
"output": "/home/slinky/source/RockOS/obj/kernel/lib/stream.c.o"
},
{ {
"arguments": [ "arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc", "/home/slinky/opt/cross/bin/i686-elf-gcc",
@@ -417,12 +366,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/scheduler.c.o", "obj/kernel/lib/print.c.o",
"kernel/scheduler.c" "kernel/lib/print.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/scheduler.c", "file": "/home/slinky/source/RockOS/kernel/lib/print.c",
"output": "/home/slinky/source/RockOS/obj/kernel/scheduler.c.o" "output": "/home/slinky/source/RockOS/obj/kernel/lib/print.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -434,12 +383,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/syscall.S.o", "obj/kernel/lib/memory.c.o",
"kernel/syscall.S" "kernel/lib/memory.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/syscall.S", "file": "/home/slinky/source/RockOS/kernel/lib/memory.c",
"output": "/home/slinky/source/RockOS/obj/kernel/syscall.S.o" "output": "/home/slinky/source/RockOS/obj/kernel/lib/memory.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -451,12 +400,29 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/common.S.o", "obj/kernel/vfs.c.o",
"kernel/common.S" "kernel/vfs.c"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/common.S", "file": "/home/slinky/source/RockOS/kernel/vfs.c",
"output": "/home/slinky/source/RockOS/obj/kernel/common.S.o" "output": "/home/slinky/source/RockOS/obj/kernel/vfs.c.o"
},
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/memory/mm.c.o",
"kernel/memory/mm.c"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/memory/mm.c",
"output": "/home/slinky/source/RockOS/obj/kernel/memory/mm.c.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -475,23 +441,6 @@
"file": "/home/slinky/source/RockOS/kernel/drivers/pic/pic.S", "file": "/home/slinky/source/RockOS/kernel/drivers/pic/pic.S",
"output": "/home/slinky/source/RockOS/obj/kernel/drivers/pic/pic.S.o" "output": "/home/slinky/source/RockOS/obj/kernel/drivers/pic/pic.S.o"
}, },
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/drivers/pit/pit.S.o",
"kernel/drivers/pit/pit.S"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/drivers/pit/pit.S",
"output": "/home/slinky/source/RockOS/obj/kernel/drivers/pit/pit.S.o"
},
{ {
"arguments": [ "arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc", "/home/slinky/opt/cross/bin/i686-elf-gcc",
@@ -519,12 +468,46 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/memory/mm.S.o", "obj/kernel/drivers/pit/pit.S.o",
"kernel/memory/mm.S" "kernel/drivers/pit/pit.S"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/memory/mm.S", "file": "/home/slinky/source/RockOS/kernel/drivers/pit/pit.S",
"output": "/home/slinky/source/RockOS/obj/kernel/memory/mm.S.o" "output": "/home/slinky/source/RockOS/obj/kernel/drivers/pit/pit.S.o"
},
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/syscall.S.o",
"kernel/syscall.S"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/syscall.S",
"output": "/home/slinky/source/RockOS/obj/kernel/syscall.S.o"
},
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/interrupts.S.o",
"kernel/interrupts.S"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/interrupts.S",
"output": "/home/slinky/source/RockOS/obj/kernel/interrupts.S.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -543,6 +526,23 @@
"file": "/home/slinky/source/RockOS/kernel/boot/boot.S", "file": "/home/slinky/source/RockOS/kernel/boot/boot.S",
"output": "/home/slinky/source/RockOS/obj/kernel/boot/boot.S.o" "output": "/home/slinky/source/RockOS/obj/kernel/boot/boot.S.o"
}, },
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-c",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-Ikernel",
"-o",
"obj/kernel/common.S.o",
"kernel/common.S"
],
"directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/common.S",
"output": "/home/slinky/source/RockOS/obj/kernel/common.S.o"
},
{ {
"arguments": [ "arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc", "/home/slinky/opt/cross/bin/i686-elf-gcc",
@@ -570,12 +570,12 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/gdt.S.o", "obj/kernel/memory/mm.S.o",
"kernel/gdt.S" "kernel/memory/mm.S"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/gdt.S", "file": "/home/slinky/source/RockOS/kernel/memory/mm.S",
"output": "/home/slinky/source/RockOS/obj/kernel/gdt.S.o" "output": "/home/slinky/source/RockOS/obj/kernel/memory/mm.S.o"
}, },
{ {
"arguments": [ "arguments": [
@@ -587,11 +587,11 @@
"-Wextra", "-Wextra",
"-Ikernel", "-Ikernel",
"-o", "-o",
"obj/kernel/interrupts.S.o", "obj/kernel/gdt.S.o",
"kernel/interrupts.S" "kernel/gdt.S"
], ],
"directory": "/home/slinky/source/RockOS", "directory": "/home/slinky/source/RockOS",
"file": "/home/slinky/source/RockOS/kernel/interrupts.S", "file": "/home/slinky/source/RockOS/kernel/gdt.S",
"output": "/home/slinky/source/RockOS/obj/kernel/interrupts.S.o" "output": "/home/slinky/source/RockOS/obj/kernel/gdt.S.o"
} }
] ]

View File

@@ -12,6 +12,7 @@ typedef enum {
STATE_SLEEPING = 2, STATE_SLEEPING = 2,
STATE_BLOCKED = 3, STATE_BLOCKED = 3,
STATE_DEAD = 4, STATE_DEAD = 4,
STATE_ZOMBIE = 5,
} process_state_t; } process_state_t;
typedef enum { typedef enum {
@@ -32,6 +33,8 @@ typedef struct process_t {
uint32_t flags; uint32_t flags;
file_t* fd_table[MAX_PROCESS_FDS]; file_t* fd_table[MAX_PROCESS_FDS];
struct process_t* sched_next; struct process_t* sched_next;
struct process_t* waiting;
int exit_status;
} __attribute__((packed)) process_t; } __attribute__((packed)) process_t;
#endif #endif

View File

@@ -187,3 +187,12 @@ void wake(process_t* task) {
task->state = STATE_READY; task->state = STATE_READY;
} }
} }
process_t* get_task_by_pid(uint32_t pid) {
process_t* cur = process_table;
while (cur) {
if (cur->pid == pid) break;
cur = cur->sched_next;
}
return cur;
}

View File

@@ -11,6 +11,7 @@ void init_scheduler();
void init_task(process_t* process, uint32_t entry_point, uint32_t cr3, int user, uint32_t u_esp); void init_task(process_t* process, uint32_t entry_point, uint32_t cr3, int user, uint32_t u_esp);
process_t* current_task(); process_t* current_task();
process_t* get_task_by_pid(uint32_t pid);
int get_next_pid(); int get_next_pid();
void add_task(process_t* task); void add_task(process_t* task);

View File

@@ -25,7 +25,11 @@ typedef struct registers {
static int32_t sys_exit(int status) { static int32_t sys_exit(int status) {
process_t* task = current_task(); process_t* task = current_task();
task->state = STATE_DEAD; task->state = STATE_ZOMBIE;
task->exit_status = status;
if (task->waiting) {
wake(task->waiting);
}
exit(); exit();
return 0; return 0;
} }
@@ -163,6 +167,9 @@ static int32_t sys_exec(registers_t* regs, const char* prgm) {
clear_current_pd(); clear_current_pd();
uint32_t eip = load_elf_program(prgm); uint32_t eip = load_elf_program(prgm);
if (eip == 0) {
return 0;
}
uint32_t stack_sz = PAGE_SIZE * 16; uint32_t stack_sz = PAGE_SIZE * 16;
uint32_t stack_top = 0xBFFF0000; uint32_t stack_top = 0xBFFF0000;
@@ -204,6 +211,16 @@ static int32_t sys_lseek(int fd, size_t offset, int whence) {
return 1; return 1;
} }
static int32_t sys_waitpid(int pid, int* exit_status) {
process_t* current = current_task();
process_t* child = get_task_by_pid(pid);
current->state = STATE_BLOCKED;
child->waiting = current;
yield();
*exit_status = child->exit_status;
return 1;
}
void syscall(registers_t* regs) { void syscall(registers_t* regs) {
int32_t ret; int32_t ret;
switch(regs->eax) { switch(regs->eax) {
@@ -218,6 +235,7 @@ void syscall(registers_t* regs) {
case 22: ret = sys_exec(regs, (const char*)regs->ebx); break; case 22: ret = sys_exec(regs, (const char*)regs->ebx); break;
case 23: ret = sys_dup2(regs->ebx, regs->ecx); break; case 23: ret = sys_dup2(regs->ebx, regs->ecx); break;
case 24: ret = sys_lseek(regs->ebx, regs->ecx, regs->edx); break; case 24: ret = sys_lseek(regs->ebx, regs->ecx, regs->edx); break;
case 25: ret = sys_waitpid(regs->ebx, (int*)regs->ecx); break;
default: ret = -1; default: ret = -1;
} }
regs->eax = ret; regs->eax = ret;

Binary file not shown.

View File

@@ -1,3 +1,4 @@
#include "syscall.h"
#include <unistd.h> #include <unistd.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
@@ -7,6 +8,10 @@ const char* shell_prompt = "rocksh> ";
char buf[256]; char buf[256];
size_t buf_offset = 0; size_t buf_offset = 0;
char path[256];
const char* bin_dir = "/bin/";
void parse_cmd() { void parse_cmd() {
if (strcmp(buf, "exit") == 0) { if (strcmp(buf, "exit") == 0) {
printf("bye!\n"); printf("bye!\n");
@@ -15,7 +20,25 @@ void parse_cmd() {
if (strcmp(buf, "motd") == 0) { if (strcmp(buf, "motd") == 0) {
printf("rockos is the best!\n"); printf("rockos is the best!\n");
return;
} }
// need a strcat
char* dst = path;
strcpy(dst, bin_dir);
dst = path + strlen(bin_dir);
strcpy(dst, buf);
int pid = fork();
if (pid == 0) {
if (!exec(path)) {
return;
}
}
int status;
waitpid(pid, &status);
printf("process exited with status %d\n", status);
} }
void reset() { void reset() {

View File

@@ -0,0 +1,36 @@
[
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-I../../rocklibc/include",
"-c",
"-o",
"crt0.o",
"crt0.S"
],
"directory": "/home/slinky/source/RockOS/programs/test",
"file": "/home/slinky/source/RockOS/programs/test/crt0.S",
"output": "/home/slinky/source/RockOS/programs/test/crt0.o"
},
{
"arguments": [
"/home/slinky/opt/cross/bin/i686-elf-gcc",
"-ffreestanding",
"-O2",
"-Wall",
"-Wextra",
"-I../../rocklibc/include",
"-c",
"-o",
"main.o",
"main.c"
],
"directory": "/home/slinky/source/RockOS/programs/test",
"file": "/home/slinky/source/RockOS/programs/test/main.c",
"output": "/home/slinky/source/RockOS/programs/test/main.o"
}
]

21
programs/test/crt0.S Normal file
View File

@@ -0,0 +1,21 @@
.global _start
.extern exit
.section .text
_start:
xor %ebp, %ebp
mov (%esp), %eax
lea 4(%esp), %ebx
lea 8(%esp,%eax,4), %ecx
and $-16, %esp
push %ecx
push %ebx
push %eax
call main
push %eax
call exit

31
programs/test/linker.ld Normal file
View File

@@ -0,0 +1,31 @@
ENTRY(_start)
SECTIONS
{
. = 0x40000000;
.text ALIGN(4K) :
{
/* Force the crt0.o entry code to be placed FIRST in memory */
KEEP(*crt0.o(.text))
*(.text .text.*)
}
.rodata ALIGN(4K) :
{
*(.rodata .rodata.*)
}
.data ALIGN(4K) :
{
*(.data .data.*)
}
.bss ALIGN(4K) :
{
_bss_start = .;
*(.bss .bss.*)
*(COMMON)
_bss_end = .;
}
}

6
programs/test/main.c Normal file
View File

@@ -0,0 +1,6 @@
#include <stdio.h>
int main(int argc, char** argv) {
printf("hello, world!\n");
return 0;
}

23
programs/test/makefile Normal file
View File

@@ -0,0 +1,23 @@
CC = i686-elf-gcc
LD = i686-elf-ld
CFLAGS = -ffreestanding -O2 -Wall -Wextra -I../../rocklibc/include
LDFLAGS = -m elf_i386 -nostdlib
TARGET = test.elf
all: $(TARGET)
crt0.o: crt0.S
$(CC) $(CFLAGS) -c crt0.S -o crt0.o
main.o: main.c
$(CC) $(CFLAGS) -c main.c -o main.o
$(TARGET): crt0.o main.o ../lib/rlibc.a
$(LD) $(LDFLAGS) -T linker.ld crt0.o main.o ../lib/rlibc.a -o $(TARGET)
clean:
rm -f *.o $(TARGET)
.PHONY: all clean test

View File

@@ -13,7 +13,8 @@
#define SYS_FORK 21 #define SYS_FORK 21
#define SYS_EXEC 22 #define SYS_EXEC 22
#define SYS_DUP2 23 #define SYS_DUP2 23
#define SYS_LSEEK 24 #define SYS_LSEEK 24
#define SYS_WAIT 25
int open(const char* path); int open(const char* path);
int write(int fd, const void *buf, size_t count); int write(int fd, const void *buf, size_t count);
@@ -32,5 +33,6 @@ int pty(int* slave);
int fork(); int fork();
int exec(const char* path); int exec(const char* path);
int dup2(int src, int dst); int dup2(int src, int dst);
int waitpid(int pid, int* status);
#endif #endif

View File

@@ -62,3 +62,7 @@ int exec(const char* path) {
int dup2(int src, int dst) { int dup2(int src, int dst) {
return syscall3(SYS_DUP2, src, dst, 0); return syscall3(SYS_DUP2, src, dst, 0);
} }
int waitpid(int pid, int* status) {
return syscall3(SYS_WAIT, pid, (uint32_t)status, 0);
}