From 0bc39ae278659529414c192372288708852b0214 Mon Sep 17 00:00:00 2001 From: wjz <344037686@qq.com> Date: Wed, 15 May 2019 14:51:11 +0800 Subject: [PATCH 1/3] task 2 --- 002_syscall/wjzlwz/Makefile | 7 +++++++ 002_syscall/wjzlwz/README.md | 19 +++++++++++++++++++ 002_syscall/wjzlwz/print_demo.c | 14 ++++++++++++++ 002_syscall/wjzlwz/write_demo.c | 13 +++++++++++++ 4 files changed, 53 insertions(+) create mode 100644 002_syscall/wjzlwz/Makefile create mode 100644 002_syscall/wjzlwz/README.md create mode 100644 002_syscall/wjzlwz/print_demo.c create mode 100644 002_syscall/wjzlwz/write_demo.c diff --git a/002_syscall/wjzlwz/Makefile b/002_syscall/wjzlwz/Makefile new file mode 100644 index 0000000..195d9fd --- /dev/null +++ b/002_syscall/wjzlwz/Makefile @@ -0,0 +1,7 @@ +all:write_demo print_demo + +write_demo:write_demo.c + gcc -o $@ $< +print_demo:print_demo.c + gcc -o $@ $< + diff --git a/002_syscall/wjzlwz/README.md b/002_syscall/wjzlwz/README.md new file mode 100644 index 0000000..c61677c --- /dev/null +++ b/002_syscall/wjzlwz/README.md @@ -0,0 +1,19 @@ +说说你对系统调用的理解? +答:系统调用是 Linux 提供给我们的接口,应用程序通过调用接口完成相应的功能,比如printf函数,它最终使用了 sys_write 这个系统调用。 + +Linux 平台 x86 架构的系统调用指令是什么?x64 呢?Arm 架构 Linux 平台的系统调用指令是什么? +答:Linux 平台上,x86 架构系统调用指令是 int 0x80 和 sysenter ,x64是 syscall,arm是 svc +你还能列举几个系统调用的例子出来吗?你是从哪里找到它们的? +答:比如 open, read。 +https://filippo.io/linux-syscall-table/ + +open 函数的系统调用号是多少?read 呢?你是从哪里找到它们的? +答:64位平台:open : 2,read : 0 https://filippo.io/linux-syscall-table/ +32位平台:open : 5,read : 3 https://syscalls.kernelgrok.com/ +malloc 是系统调用吗?为什么? +答:不是,它是系统调用的封装,和print类似,不是操作系统给的接口。 +你使用什么命令来查看系统调用的文档? +答:man + +你觉得学习系统编程会对你有何帮助? +答:了解函数的底层实现,有助于找到更隐藏的bug。 diff --git a/002_syscall/wjzlwz/print_demo.c b/002_syscall/wjzlwz/print_demo.c new file mode 100644 index 0000000..c9c4a3e --- /dev/null +++ b/002_syscall/wjzlwz/print_demo.c @@ -0,0 +1,14 @@ +#include + +int main() { + const char buf[] = "wjzlwz\n"; + /* + 参数1为文件描述符,STDOUT_FILENO输出到屏幕 + 参数2为输出内容 + 参数3代表输出内容字节长度 + */ + + write(STDOUT_FILENO, buf, sizeof(buf)); + + return 0; +} diff --git a/002_syscall/wjzlwz/write_demo.c b/002_syscall/wjzlwz/write_demo.c new file mode 100644 index 0000000..b5823ed --- /dev/null +++ b/002_syscall/wjzlwz/write_demo.c @@ -0,0 +1,13 @@ +#include + +int main() { + const char x[] = "wjzlwz\n"; +#if defined(__x86_x64__) || defined(__amd64__) + __asm__ ("movq $1, %%rax;\n" + "movq $1, %%rdi;\n" + "movq %0, %%rsi;\n" + "movq $16, %%rdx;\n" + "syscall"::"r"(x):"%rax","%rdi","%rsi","%rdx"); +#endif + return 0; +} From bff87bdff740fc6aaae8d56849de0817e23dace4 Mon Sep 17 00:00:00 2001 From: wjz <344037686@qq.com> Date: Wed, 15 May 2019 15:36:40 +0800 Subject: [PATCH 2/3] task2 --- 002_syscall/wjzlwz/README.md | 49 +++++++++++++++++++++------------ 002_syscall/wjzlwz/write_demo.c | 6 ++-- 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/002_syscall/wjzlwz/README.md b/002_syscall/wjzlwz/README.md index c61677c..153510f 100644 --- a/002_syscall/wjzlwz/README.md +++ b/002_syscall/wjzlwz/README.md @@ -1,19 +1,34 @@ -说说你对系统调用的理解? -答:系统调用是 Linux 提供给我们的接口,应用程序通过调用接口完成相应的功能,比如printf函数,它最终使用了 sys_write 这个系统调用。 - -Linux 平台 x86 架构的系统调用指令是什么?x64 呢?Arm 架构 Linux 平台的系统调用指令是什么? -答:Linux 平台上,x86 架构系统调用指令是 int 0x80 和 sysenter ,x64是 syscall,arm是 svc -你还能列举几个系统调用的例子出来吗?你是从哪里找到它们的? -答:比如 open, read。 -https://filippo.io/linux-syscall-table/ - -open 函数的系统调用号是多少?read 呢?你是从哪里找到它们的? -答:64位平台:open : 2,read : 0 https://filippo.io/linux-syscall-table/ -32位平台:open : 5,read : 3 https://syscalls.kernelgrok.com/ -malloc 是系统调用吗?为什么? -答:不是,它是系统调用的封装,和print类似,不是操作系统给的接口。 -你使用什么命令来查看系统调用的文档? + +## 说说你对系统调用的理解? + +答:系统调用是操作系统提供给上层应用的接口。 + +## Linux 平台 x86 架构的系统调用指令是什么?x64 呢?Arm 架构 Linux 平台的系统调用指令是什么? + +答:Linux 平台上,x86 架构系统调用指令是 `int 0x80` 还有`sysenter`。x64架构系统调用指令是`syscall`,`Arm`架构系统调用指令是`swi`。 + +## 你还能列举几个系统调用的例子出来吗?你是从哪里找到它们的? + +答:比如 `fork`, `read`,`write`,`exit" 。https://www.kancloud.cn/wizardforcel/linux-c-book/134954 + +## `open` 函数的系统调用号是多少?`read` 呢?你是从哪里找到它们的? + +答: +- 在x64架构中`open`系统调用号是`2`,`read`的系统调用号是`0`。 + +- 在x86架构中`open`系统调用号是`5`,`read`的系统调用号是`3`。 + +cat /usr/include/asm/unistd_32.h 32位 +cat /usr/include/asm/unistd_64.h 64位 + +## `malloc` 是系统调用吗?为什么? + +答:不是, 是对于系统调用的封装,其内部调用了`brk`或者`sbrk`系统调用。 + +## 你使用什么命令来查看系统调用的文档? + 答:man -你觉得学习系统编程会对你有何帮助? -答:了解函数的底层实现,有助于找到更隐藏的bug。 +## 你觉得学习系统编程会对你有何帮助? + +答:深入理解操作系统,提升debug能力。 diff --git a/002_syscall/wjzlwz/write_demo.c b/002_syscall/wjzlwz/write_demo.c index b5823ed..7f9f4c1 100644 --- a/002_syscall/wjzlwz/write_demo.c +++ b/002_syscall/wjzlwz/write_demo.c @@ -1,13 +1,15 @@ #include int main() { - const char x[] = "wjzlwz\n"; + char x[] = "wjzlwz\n"; #if defined(__x86_x64__) || defined(__amd64__) __asm__ ("movq $1, %%rax;\n" "movq $1, %%rdi;\n" "movq %0, %%rsi;\n" - "movq $16, %%rdx;\n" + "movq $7, %%rdx;\n" "syscall"::"r"(x):"%rax","%rdi","%rsi","%rdx"); +#else + printf("Unsupported Platform\n"); #endif return 0; } From 4373fbf33fddfb2f9ba5e077498c3e2bfa4d65d9 Mon Sep 17 00:00:00 2001 From: wjz <344037686@qq.com> Date: Fri, 24 May 2019 17:14:23 +0800 Subject: [PATCH 3/3] tast 003 --- 003_copy/wjzlwz/mycp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/003_copy/wjzlwz/mycp.c b/003_copy/wjzlwz/mycp.c index 846e7cb..d60b653 100644 --- a/003_copy/wjzlwz/mycp.c +++ b/003_copy/wjzlwz/mycp.c @@ -4,7 +4,7 @@ #include #include -#define BUFFERSIZE 4096 +#define BUFFERSIZE 1024 int main(int argc, char* argv[]) { if (argc != 3) {