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
|
cp vga_text_term.elf ../bin
|
||||||
cd ..
|
cd ..
|
||||||
|
|
||||||
|
cd test
|
||||||
|
make clean
|
||||||
|
bear -- make
|
||||||
|
cp test.elf ../bin
|
||||||
|
cd ..
|
||||||
|
|
||||||
cd ..
|
cd ..
|
||||||
@@ -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"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -186,4 +186,13 @@ void wake(process_t* task) {
|
|||||||
if (task->state == STATE_SLEEPING || task->state == STATE_BLOCKED) {
|
if (task->state == STATE_SLEEPING || task->state == STATE_BLOCKED) {
|
||||||
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;
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
|
|||||||
@@ -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.
@@ -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() {
|
||||||
|
|||||||
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_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
|
||||||
@@ -61,4 +61,8 @@ 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);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user