From 71b86590018781df144bea5f23f11c4d5be9c822 Mon Sep 17 00:00:00 2001 From: jiangjianfeng Date: Tue, 6 Sep 2022 11:52:49 +0800 Subject: [PATCH] add user-mode fork test codes with git lfs --- .gitattributes | 1 + src/kxos-user/fork/Makefile | 7 +++++ src/kxos-user/fork/fork | 3 +++ src/kxos-user/fork/fork.s | 52 +++++++++++++++++++++++++++++++++++++ 4 files changed, 63 insertions(+) create mode 100644 src/kxos-user/fork/Makefile create mode 100755 src/kxos-user/fork/fork create mode 100644 src/kxos-user/fork/fork.s diff --git a/.gitattributes b/.gitattributes index 54859819b..85f44d514 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,2 @@ src/kxos-user/hello_world/hello_world filter=lfs diff=lfs merge=lfs -text +src/kxos-user/fork/fork filter=lfs diff=lfs merge=lfs -text diff --git a/src/kxos-user/fork/Makefile b/src/kxos-user/fork/Makefile new file mode 100644 index 000000000..965337592 --- /dev/null +++ b/src/kxos-user/fork/Makefile @@ -0,0 +1,7 @@ +.PHONY: build clean run +build: hello_world.s + @gcc -static -nostdlib fork.s -o fork +clean: + @rm fork +run: build + @./fork \ No newline at end of file diff --git a/src/kxos-user/fork/fork b/src/kxos-user/fork/fork new file mode 100755 index 000000000..a1859ce1e --- /dev/null +++ b/src/kxos-user/fork/fork @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1ad189cc084511d777ec2bcb211ca7cdbfb55f00320953da71a6a37f46404dd6 +size 9488 diff --git a/src/kxos-user/fork/fork.s b/src/kxos-user/fork/fork.s new file mode 100644 index 000000000..ce988b9ff --- /dev/null +++ b/src/kxos-user/fork/fork.s @@ -0,0 +1,52 @@ +.global _start + +.section .text +_start: + call print_hello_world + mov $57, %rax # syscall number of fork + syscall + + cmp $0, %rax + je _child # child process + jmp _parent # parent process +_parent: + call print_parent_message + call exit +_child: + call print_child_message + call exit +exit: + mov $60, %rax # syscall number of exit + mov $0, %rdi # exit code + syscall +print_hello_world: + mov $message, %rsi # address of message + mov $message_end, %rdx + sub %rsi, %rdx # calculate message len + jmp _print_message +print_parent_message: + mov $message_parent, %rsi # address of message + mov $message_parent_end, %rdx + sub %rsi, %rdx # calculate message len + jmp _print_message +print_child_message: + mov $message_child, %rsi # address of message + mov $message_child_end, %rdx + sub %rsi, %rdx # calculate message len + jmp _print_message +# never directly call _print_message +_print_message: + mov $1, %rax # syscall number of write + mov $1, %rdi # stdout + syscall + ret +.section .rodata +message: + .ascii "Hello, world\n" +message_end: +message_parent: + .ascii "Hello world from parent\n" +message_parent_end: +message_child: + .ascii "Hello world from child\n" +message_child_end: