shell can launch another user processgit add .git add .!
This commit is contained in:
@@ -20,4 +20,10 @@ bear -- make
|
||||
cp vga_text_term.elf ../bin
|
||||
cd ..
|
||||
|
||||
cd test
|
||||
make clean
|
||||
bear -- make
|
||||
cp test.elf ../bin
|
||||
cd ..
|
||||
|
||||
cd ..
|
||||
@@ -26,12 +26,12 @@
|
||||
"-Wextra",
|
||||
"-Ikernel",
|
||||
"-o",
|
||||
"obj/kernel/vfs.c.o",
|
||||
"kernel/vfs.c"
|
||||
"obj/kernel/kbd.c.o",
|
||||
"kernel/kbd.c"
|
||||
],
|
||||
"directory": "/home/slinky/source/RockOS",
|
||||
"file": "/home/slinky/source/RockOS/kernel/vfs.c",
|
||||
"output": "/home/slinky/source/RockOS/obj/kernel/vfs.c.o"
|
||||
"file": "/home/slinky/source/RockOS/kernel/kbd.c",
|
||||
"output": "/home/slinky/source/RockOS/obj/kernel/kbd.c.o"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
@@ -43,12 +43,12 @@
|
||||
"-Wextra",
|
||||
"-Ikernel",
|
||||
"-o",
|
||||
"obj/kernel/kmain.c.o",
|
||||
"kernel/kmain.c"
|
||||
"obj/kernel/gdt.c.o",
|
||||
"kernel/gdt.c"
|
||||
],
|
||||
"directory": "/home/slinky/source/RockOS",
|
||||
"file": "/home/slinky/source/RockOS/kernel/kmain.c",
|
||||
"output": "/home/slinky/source/RockOS/obj/kernel/kmain.c.o"
|
||||
"file": "/home/slinky/source/RockOS/kernel/gdt.c",
|
||||
"output": "/home/slinky/source/RockOS/obj/kernel/gdt.c.o"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
@@ -67,91 +67,6 @@
|
||||
"file": "/home/slinky/source/RockOS/kernel/drivers/pic/pic.c",
|
||||
"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": [
|
||||
"/home/slinky/opt/cross/bin/i686-elf-gcc",
|
||||
@@ -196,12 +111,12 @@
|
||||
"-Wextra",
|
||||
"-Ikernel",
|
||||
"-o",
|
||||
"obj/kernel/gdt.c.o",
|
||||
"kernel/gdt.c"
|
||||
"obj/kernel/drivers/ide/ide.c.o",
|
||||
"kernel/drivers/ide/ide.c"
|
||||
],
|
||||
"directory": "/home/slinky/source/RockOS",
|
||||
"file": "/home/slinky/source/RockOS/kernel/gdt.c",
|
||||
"output": "/home/slinky/source/RockOS/obj/kernel/gdt.c.o"
|
||||
"file": "/home/slinky/source/RockOS/kernel/drivers/ide/ide.c",
|
||||
"output": "/home/slinky/source/RockOS/obj/kernel/drivers/ide/ide.c.o"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
@@ -213,12 +128,12 @@
|
||||
"-Wextra",
|
||||
"-Ikernel",
|
||||
"-o",
|
||||
"obj/kernel/memory/mm.c.o",
|
||||
"kernel/memory/mm.c"
|
||||
"obj/kernel/drivers/vga/vga.c.o",
|
||||
"kernel/drivers/vga/vga.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"
|
||||
"file": "/home/slinky/source/RockOS/kernel/drivers/vga/vga.c",
|
||||
"output": "/home/slinky/source/RockOS/obj/kernel/drivers/vga/vga.c.o"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
@@ -230,12 +145,80 @@
|
||||
"-Wextra",
|
||||
"-Ikernel",
|
||||
"-o",
|
||||
"obj/kernel/kbd.c.o",
|
||||
"kernel/kbd.c"
|
||||
"obj/kernel/drivers/cpio/cpio.c.o",
|
||||
"kernel/drivers/cpio/cpio.c"
|
||||
],
|
||||
"directory": "/home/slinky/source/RockOS",
|
||||
"file": "/home/slinky/source/RockOS/kernel/kbd.c",
|
||||
"output": "/home/slinky/source/RockOS/obj/kernel/kbd.c.o"
|
||||
"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/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": [
|
||||
@@ -271,23 +254,6 @@
|
||||
"file": "/home/slinky/source/RockOS/kernel/interrupts.c",
|
||||
"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": [
|
||||
"/home/slinky/opt/cross/bin/i686-elf-gcc",
|
||||
@@ -315,63 +281,12 @@
|
||||
"-Wextra",
|
||||
"-Ikernel",
|
||||
"-o",
|
||||
"obj/kernel/lib/stream.c.o",
|
||||
"kernel/lib/stream.c"
|
||||
"obj/kernel/kmain.c.o",
|
||||
"kernel/kmain.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": [
|
||||
"/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"
|
||||
"file": "/home/slinky/source/RockOS/kernel/kmain.c",
|
||||
"output": "/home/slinky/source/RockOS/obj/kernel/kmain.c.o"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
@@ -390,6 +305,40 @@
|
||||
"file": "/home/slinky/source/RockOS/kernel/lib/tasks.c",
|
||||
"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": [
|
||||
"/home/slinky/opt/cross/bin/i686-elf-gcc",
|
||||
@@ -417,12 +366,12 @@
|
||||
"-Wextra",
|
||||
"-Ikernel",
|
||||
"-o",
|
||||
"obj/kernel/scheduler.c.o",
|
||||
"kernel/scheduler.c"
|
||||
"obj/kernel/lib/print.c.o",
|
||||
"kernel/lib/print.c"
|
||||
],
|
||||
"directory": "/home/slinky/source/RockOS",
|
||||
"file": "/home/slinky/source/RockOS/kernel/scheduler.c",
|
||||
"output": "/home/slinky/source/RockOS/obj/kernel/scheduler.c.o"
|
||||
"file": "/home/slinky/source/RockOS/kernel/lib/print.c",
|
||||
"output": "/home/slinky/source/RockOS/obj/kernel/lib/print.c.o"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
@@ -434,12 +383,12 @@
|
||||
"-Wextra",
|
||||
"-Ikernel",
|
||||
"-o",
|
||||
"obj/kernel/syscall.S.o",
|
||||
"kernel/syscall.S"
|
||||
"obj/kernel/lib/memory.c.o",
|
||||
"kernel/lib/memory.c"
|
||||
],
|
||||
"directory": "/home/slinky/source/RockOS",
|
||||
"file": "/home/slinky/source/RockOS/kernel/syscall.S",
|
||||
"output": "/home/slinky/source/RockOS/obj/kernel/syscall.S.o"
|
||||
"file": "/home/slinky/source/RockOS/kernel/lib/memory.c",
|
||||
"output": "/home/slinky/source/RockOS/obj/kernel/lib/memory.c.o"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
@@ -451,12 +400,29 @@
|
||||
"-Wextra",
|
||||
"-Ikernel",
|
||||
"-o",
|
||||
"obj/kernel/common.S.o",
|
||||
"kernel/common.S"
|
||||
"obj/kernel/vfs.c.o",
|
||||
"kernel/vfs.c"
|
||||
],
|
||||
"directory": "/home/slinky/source/RockOS",
|
||||
"file": "/home/slinky/source/RockOS/kernel/common.S",
|
||||
"output": "/home/slinky/source/RockOS/obj/kernel/common.S.o"
|
||||
"file": "/home/slinky/source/RockOS/kernel/vfs.c",
|
||||
"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": [
|
||||
@@ -475,23 +441,6 @@
|
||||
"file": "/home/slinky/source/RockOS/kernel/drivers/pic/pic.S",
|
||||
"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": [
|
||||
"/home/slinky/opt/cross/bin/i686-elf-gcc",
|
||||
@@ -519,12 +468,46 @@
|
||||
"-Wextra",
|
||||
"-Ikernel",
|
||||
"-o",
|
||||
"obj/kernel/memory/mm.S.o",
|
||||
"kernel/memory/mm.S"
|
||||
"obj/kernel/drivers/pit/pit.S.o",
|
||||
"kernel/drivers/pit/pit.S"
|
||||
],
|
||||
"directory": "/home/slinky/source/RockOS",
|
||||
"file": "/home/slinky/source/RockOS/kernel/memory/mm.S",
|
||||
"output": "/home/slinky/source/RockOS/obj/kernel/memory/mm.S.o"
|
||||
"file": "/home/slinky/source/RockOS/kernel/drivers/pit/pit.S",
|
||||
"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": [
|
||||
@@ -543,6 +526,23 @@
|
||||
"file": "/home/slinky/source/RockOS/kernel/boot/boot.S",
|
||||
"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": [
|
||||
"/home/slinky/opt/cross/bin/i686-elf-gcc",
|
||||
@@ -570,12 +570,12 @@
|
||||
"-Wextra",
|
||||
"-Ikernel",
|
||||
"-o",
|
||||
"obj/kernel/gdt.S.o",
|
||||
"kernel/gdt.S"
|
||||
"obj/kernel/memory/mm.S.o",
|
||||
"kernel/memory/mm.S"
|
||||
],
|
||||
"directory": "/home/slinky/source/RockOS",
|
||||
"file": "/home/slinky/source/RockOS/kernel/gdt.S",
|
||||
"output": "/home/slinky/source/RockOS/obj/kernel/gdt.S.o"
|
||||
"file": "/home/slinky/source/RockOS/kernel/memory/mm.S",
|
||||
"output": "/home/slinky/source/RockOS/obj/kernel/memory/mm.S.o"
|
||||
},
|
||||
{
|
||||
"arguments": [
|
||||
@@ -587,11 +587,11 @@
|
||||
"-Wextra",
|
||||
"-Ikernel",
|
||||
"-o",
|
||||
"obj/kernel/interrupts.S.o",
|
||||
"kernel/interrupts.S"
|
||||
"obj/kernel/gdt.S.o",
|
||||
"kernel/gdt.S"
|
||||
],
|
||||
"directory": "/home/slinky/source/RockOS",
|
||||
"file": "/home/slinky/source/RockOS/kernel/interrupts.S",
|
||||
"output": "/home/slinky/source/RockOS/obj/kernel/interrupts.S.o"
|
||||
"file": "/home/slinky/source/RockOS/kernel/gdt.S",
|
||||
"output": "/home/slinky/source/RockOS/obj/kernel/gdt.S.o"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -12,6 +12,7 @@ typedef enum {
|
||||
STATE_SLEEPING = 2,
|
||||
STATE_BLOCKED = 3,
|
||||
STATE_DEAD = 4,
|
||||
STATE_ZOMBIE = 5,
|
||||
} process_state_t;
|
||||
|
||||
typedef enum {
|
||||
@@ -32,6 +33,8 @@ typedef struct process_t {
|
||||
uint32_t flags;
|
||||
file_t* fd_table[MAX_PROCESS_FDS];
|
||||
struct process_t* sched_next;
|
||||
struct process_t* waiting;
|
||||
int exit_status;
|
||||
} __attribute__((packed)) process_t;
|
||||
|
||||
#endif
|
||||
@@ -186,4 +186,13 @@ void wake(process_t* task) {
|
||||
if (task->state == STATE_SLEEPING || task->state == STATE_BLOCKED) {
|
||||
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;
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
process_t* current_task();
|
||||
process_t* get_task_by_pid(uint32_t pid);
|
||||
|
||||
int get_next_pid();
|
||||
void add_task(process_t* task);
|
||||
|
||||
@@ -25,7 +25,11 @@ typedef struct registers {
|
||||
|
||||
static int32_t sys_exit(int status) {
|
||||
process_t* task = current_task();
|
||||
task->state = STATE_DEAD;
|
||||
task->state = STATE_ZOMBIE;
|
||||
task->exit_status = status;
|
||||
if (task->waiting) {
|
||||
wake(task->waiting);
|
||||
}
|
||||
exit();
|
||||
return 0;
|
||||
}
|
||||
@@ -163,6 +167,9 @@ static int32_t sys_exec(registers_t* regs, const char* prgm) {
|
||||
clear_current_pd();
|
||||
|
||||
uint32_t eip = load_elf_program(prgm);
|
||||
if (eip == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t stack_sz = PAGE_SIZE * 16;
|
||||
uint32_t stack_top = 0xBFFF0000;
|
||||
@@ -204,6 +211,16 @@ static int32_t sys_lseek(int fd, size_t offset, int whence) {
|
||||
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) {
|
||||
int32_t ret;
|
||||
switch(regs->eax) {
|
||||
@@ -218,6 +235,7 @@ void syscall(registers_t* regs) {
|
||||
case 22: ret = sys_exec(regs, (const char*)regs->ebx); break;
|
||||
case 23: ret = sys_dup2(regs->ebx, regs->ecx); 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;
|
||||
}
|
||||
regs->eax = ret;
|
||||
|
||||
Binary file not shown.
@@ -1,3 +1,4 @@
|
||||
#include "syscall.h"
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
@@ -7,6 +8,10 @@ const char* shell_prompt = "rocksh> ";
|
||||
char buf[256];
|
||||
size_t buf_offset = 0;
|
||||
|
||||
char path[256];
|
||||
|
||||
const char* bin_dir = "/bin/";
|
||||
|
||||
void parse_cmd() {
|
||||
if (strcmp(buf, "exit") == 0) {
|
||||
printf("bye!\n");
|
||||
@@ -15,7 +20,25 @@ void parse_cmd() {
|
||||
|
||||
if (strcmp(buf, "motd") == 0) {
|
||||
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() {
|
||||
|
||||
36
programs/test/compile_commands.json
Normal file
36
programs/test/compile_commands.json
Normal 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
21
programs/test/crt0.S
Normal 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
31
programs/test/linker.ld
Normal 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
6
programs/test/main.c
Normal 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
23
programs/test/makefile
Normal 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
|
||||
@@ -13,7 +13,8 @@
|
||||
#define SYS_FORK 21
|
||||
#define SYS_EXEC 22
|
||||
#define SYS_DUP2 23
|
||||
#define SYS_LSEEK 24
|
||||
#define SYS_LSEEK 24
|
||||
#define SYS_WAIT 25
|
||||
|
||||
int open(const char* path);
|
||||
int write(int fd, const void *buf, size_t count);
|
||||
@@ -32,5 +33,6 @@ int pty(int* slave);
|
||||
int fork();
|
||||
int exec(const char* path);
|
||||
int dup2(int src, int dst);
|
||||
int waitpid(int pid, int* status);
|
||||
|
||||
#endif
|
||||
@@ -61,4 +61,8 @@ int exec(const char* path) {
|
||||
|
||||
int dup2(int src, int dst) {
|
||||
return syscall3(SYS_DUP2, src, dst, 0);
|
||||
}
|
||||
|
||||
int waitpid(int pid, int* status) {
|
||||
return syscall3(SYS_WAIT, pid, (uint32_t)status, 0);
|
||||
}
|
||||
Reference in New Issue
Block a user