From 2224c93ea968bc74621f7e124b4aca04875b3e6a Mon Sep 17 00:00:00 2001 From: guanjinquan <1666320330@qq.com> Date: Fri, 6 Jan 2023 21:29:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84libc=EF=BC=8C=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E4=BA=86OS-specific=E5=B7=A5=E5=85=B7=E9=93=BE?= =?UTF-8?q?=EF=BC=8C=E7=BC=96=E8=AF=91=E4=BA=86=E5=9F=BA=E4=BA=8Egcc-11.3.?= =?UTF-8?q?0=E7=9A=84DragonOS=20userland=20compiler=EF=BC=8C=E7=A7=BB?= =?UTF-8?q?=E6=A4=8D=E4=BA=86mpfr,gmp,mpc=E5=BA=93=20(#134)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 修改include路径 * 添加了创建libsysapi.a和/bin/sysroot/usr/include/+lib/的代码 * 修补.gitignore * 删除多余项 * 优化脚本可读性 * 新增crt0 crti crtn * 编译binutils所需的东西 * fflush()和fprintf()的简单实现 * 应用程序启动前,调用初始化libc的函数 * 自动创建sysroot * 添加了stderr的初始化 * 修改了stderr的初始化 * 内核添加对stdio的简略处理 * 格式化代码 * 修正打开stdio文件描述符的问题 * bugfix: 修复fprintf忘记释放buf的问题 * 修复shell错误地把入口设置为main而不是_start的问题 * 新增__cxa_atexit (gcc要求libc提供这个) * 增加putchar puts * 更新写入磁盘镜像的脚本,默认无参数时,使用legacy方式安装 * 更新编译脚本 * stdio增加eof的定义 * 新增extern cplusplus * mpfr gmp mpc 构建脚本 * 更新libsysapi.a为libc.a * 加上ferror fopen fclose * 更新移植的软件的构建脚本 * 更改build_gcc_toolchain.sh中的-save参数名为-save-cache Co-authored-by: longjin --- .gitignore | 1 + Makefile | 6 +- kernel/src/process/fork.c | 6 +- kernel/src/process/process.c | 27 ++++++-- kernel/src/process/process.h | 4 +- kernel/src/syscall/syscall.c | 36 ++++++++-- tools/build_gcc_toolchain.sh | 21 ++++-- tools/write_disk_image.sh | 5 +- user/Makefile | 22 +++++- user/apps/shell/shell.lds | 2 +- user/libs/libc/src/Makefile | 13 ++-- user/libs/libc/src/arch/x86_64/Makefile | 23 +++++++ .../x86_64/elf/start.c => arch/x86_64/crt0.c} | 7 +- user/libs/libc/src/arch/x86_64/crti.S | 13 ++++ user/libs/libc/src/arch/x86_64/crtn.S | 9 +++ user/libs/libc/src/cxa.c | 8 +++ user/libs/libc/src/include/ctype.h | 20 ++++-- user/libs/libc/src/include/dirent.h | 9 ++- user/libs/libc/src/include/errno.h | 10 ++- user/libs/libc/src/include/fcntl.h | 10 ++- user/libs/libc/src/include/libm.h | 8 +++ user/libs/libc/src/include/math.h | 12 +++- user/libs/libc/src/include/printf.h | 9 ++- user/libs/libc/src/include/signal.h | 10 ++- user/libs/libc/src/include/stddef.h | 6 ++ user/libs/libc/src/include/stdio.h | 30 +++++++- user/libs/libc/src/include/stdlib.h | 10 ++- user/libs/libc/src/include/string.h | 10 ++- user/libs/libc/src/include/time.h | 10 ++- user/libs/libc/src/include/unistd.h | 10 ++- user/libs/libc/src/libc_init.c | 18 +++++ user/libs/libc/src/stdio.c | 69 +++++++++++++++++++ user/libs/libc/src/stdlib.c | 3 + user/libs/libc/src/sysdeps/x86_64/Makefile | 12 ---- user/port/README.md | 15 ++++ user/port/binutils/2.38/.gitignore | 1 + user/port/binutils/2.38/Dockerfile | 41 +++++++++++ user/port/binutils/2.38/README.md | 25 +++++++ user/port/binutils/2.38/build.sh | 42 +++++++++++ user/port/binutils/2.38/run.sh | 1 + user/port/build.sh | 17 +++++ user/port/flex/2.6.4/.gitignore | 1 + user/port/flex/2.6.4/build.sh | 37 ++++++++++ user/port/gcc/11.3.0/.gitignore | 1 + user/port/gcc/11.3.0/build-hosted.sh | 51 ++++++++++++++ user/port/gmp/6.2.1/build.sh | 28 ++++++++ user/port/mpc/1.2.1/build.sh | 35 ++++++++++ user/port/mpfr/4.1.1/build.sh | 37 ++++++++++ user/port/pkg-config.sh | 15 ++++ 49 files changed, 746 insertions(+), 70 deletions(-) create mode 100644 user/libs/libc/src/arch/x86_64/Makefile rename user/libs/libc/src/{sysdeps/x86_64/elf/start.c => arch/x86_64/crt0.c} (58%) create mode 100644 user/libs/libc/src/arch/x86_64/crti.S create mode 100644 user/libs/libc/src/arch/x86_64/crtn.S create mode 100644 user/libs/libc/src/cxa.c create mode 100644 user/libs/libc/src/libc_init.c create mode 100644 user/libs/libc/src/stdio.c delete mode 100644 user/libs/libc/src/sysdeps/x86_64/Makefile create mode 100644 user/port/README.md create mode 100644 user/port/binutils/2.38/.gitignore create mode 100644 user/port/binutils/2.38/Dockerfile create mode 100644 user/port/binutils/2.38/README.md create mode 100644 user/port/binutils/2.38/build.sh create mode 100644 user/port/binutils/2.38/run.sh create mode 100644 user/port/build.sh create mode 100644 user/port/flex/2.6.4/.gitignore create mode 100644 user/port/flex/2.6.4/build.sh create mode 100644 user/port/gcc/11.3.0/.gitignore create mode 100644 user/port/gcc/11.3.0/build-hosted.sh create mode 100644 user/port/gmp/6.2.1/build.sh create mode 100644 user/port/mpc/1.2.1/build.sh create mode 100644 user/port/mpfr/4.1.1/build.sh create mode 100644 user/port/pkg-config.sh diff --git a/.gitignore b/.gitignore index be1e0c72..58fdc1b7 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ kernel/kernel .DS_Store *.o +*.a *.s serial_opt.txt user/sys_api_lib diff --git a/Makefile b/Makefile index 5a879bfb..974a9ee8 100644 --- a/Makefile +++ b/Makefile @@ -28,9 +28,6 @@ ifeq ($(DEBUG), DEBUG) GLOBAL_CFLAGS += -g endif -# ifeq ($(DragonOS_GCC), ) -# $(error 尚未安装DragonOS交叉编译器, 请使用tools文件夹下的build_gcc_toolchain.sh脚本安装) -# endif export CC=$(DragonOS_GCC)/x86_64-elf-gcc export LD=ld @@ -52,8 +49,7 @@ kernel: .PHONY: user user: - mkdir -p bin/user/ - mkdir -p bin/tmp/user + @if [ -z $$DragonOS_GCC ]; then echo "\033[31m [错误]尚未安装DragonOS交叉编译器, 请使用tools文件夹下的build_gcc_toolchain.sh脚本安装 \033[0m"; exit 1; fi $(MAKE) -C ./user all || (sh -c "echo 用户程序编译失败" && exit 1) diff --git a/kernel/src/process/fork.c b/kernel/src/process/fork.c index 90b01abd..0a3c14d8 100644 --- a/kernel/src/process/fork.c +++ b/kernel/src/process/fork.c @@ -136,7 +136,7 @@ unsigned long do_fork(struct pt_regs *regs, unsigned long clone_flags, unsigned // 唤醒进程 process_wakeup(tsk); - //创建对应procfs文件 + // 创建对应procfs文件 procfs_register_pid(tsk->pid); return retval; @@ -188,8 +188,10 @@ int process_copy_files(uint64_t clone_flags, struct process_control_block *pcb) if (clone_flags & CLONE_FS) return retval; + // TODO: 这里是临时性的特殊处理stdio,待文件系统重构及tty设备实现后,需要改写这里 + process_open_stdio(current_pcb); // 为新进程拷贝新的文件描述符 - for (int i = 0; i < PROC_MAX_FD_NUM; ++i) + for (int i = 3; i < PROC_MAX_FD_NUM; ++i) { if (current_pcb->fds[i] == NULL) continue; diff --git a/kernel/src/process/process.c b/kernel/src/process/process.c index d8718b8b..b795f55e 100644 --- a/kernel/src/process/process.c +++ b/kernel/src/process/process.c @@ -409,6 +409,8 @@ ul do_execve(struct pt_regs *regs, char *path, char *argv[], char *envp[]) // 关闭之前的文件描述符 process_exit_files(current_pcb); + + process_open_stdio(current_pcb); // 清除进程的vfork标志位 current_pcb->flags &= ~PF_VFORK; @@ -640,6 +642,10 @@ void process_init() // 初始化init进程的signal相关的信息 initial_proc_init_signal(current_pcb); + + // TODO: 这里是临时性的特殊处理stdio,待文件系统重构及tty设备实现后,需要改写这里 + process_open_stdio(current_pcb); + // 临时设置IDLE进程的的虚拟运行时间为0,防止下面的这些内核线程的虚拟运行时间出错 current_pcb->virtual_runtime = 0; barrier(); @@ -724,11 +730,13 @@ int process_wakeup_immediately(struct process_control_block *pcb) */ uint64_t process_exit_files(struct process_control_block *pcb) { + // TODO: 当stdio不再被以-1来特殊处理时,在这里要释放stdio文件的内存 + // 不与父进程共享文件描述符 if (!(pcb->flags & PF_VFORK)) { - for (int i = 0; i < PROC_MAX_FD_NUM; ++i) + for (int i = 3; i < PROC_MAX_FD_NUM; ++i) { if (pcb->fds[i] == NULL) continue; @@ -843,15 +851,15 @@ int process_release_pcb(struct process_control_block *pcb) int process_fd_alloc(struct vfs_file_t *file) { int fd_num = -1; - struct vfs_file_t **f = current_pcb->fds; for (int i = 0; i < PROC_MAX_FD_NUM; ++i) { + // kdebug("currentpcb->fds[%d]=%#018lx", i, current_pcb->fds[i]); /* 找到指针数组中的空位 */ - if (f[i] == NULL) + if (current_pcb->fds[i] == NULL) { fd_num = i; - f[i] = file; + current_pcb->fds[i] = file; break; } } @@ -882,3 +890,14 @@ void process_set_pcb_name(struct process_control_block *pcb, const char *pcb_nam { __set_pcb_name(pcb, pcb_name); } + +void process_open_stdio(struct process_control_block *pcb) +{ + // TODO: 这里是临时性的特殊处理stdio,待文件系统重构及tty设备实现后,需要改写这里 + // stdin + pcb->fds[0] = -1UL; + // stdout + pcb->fds[1] = -1UL; + // stderr + pcb->fds[2] = -1UL; +} \ No newline at end of file diff --git a/kernel/src/process/process.h b/kernel/src/process/process.h index bb942c66..dc451e79 100644 --- a/kernel/src/process/process.h +++ b/kernel/src/process/process.h @@ -220,4 +220,6 @@ extern int process_try_to_wake_up(struct process_control_block *_pcb, uint64_t _ * @return false 唤醒失败 */ extern int process_wake_up_state(struct process_control_block *pcb, uint64_t state); -void __switch_to(struct process_control_block *prev, struct process_control_block *next); \ No newline at end of file +void __switch_to(struct process_control_block *prev, struct process_control_block *next); + +void process_open_stdio(struct process_control_block * pcb); \ No newline at end of file diff --git a/kernel/src/syscall/syscall.c b/kernel/src/syscall/syscall.c index 85de7f2c..9afd4fe8 100644 --- a/kernel/src/syscall/syscall.c +++ b/kernel/src/syscall/syscall.c @@ -6,8 +6,8 @@ #include #include #include -#include #include +#include #include #include #include