Skip to content

Releases: DragonOS-Community/DragonOS

V0.1.3

08 Jan 08:00
8ad2e35

Choose a tag to compare

V0.1.3

本文作者:龙进 longjin@RinGoTek.cn

2023年1月8日

贡献者名单

DragonOS V0.1.3版本由以下小伙伴贡献代码:

赞助者名单

感谢以下同学的赞赏,我们将不断努力!

更新内容-内核

  • syscall: new: 增加getpid系统调用 (#120)
  • signal: update: 对于除了SIGKILL以外的信号,也将他们加入SigQueue (#120)
  • rtc: refactor: 使用Rust重构RTC驱动 (#118)
  • doc: new: 新增signal的文档 (#126)
  • Spinlock: new: 新增rust写的RawSpinlock (#127)
  • arch: update: 在lib.rs中,将arch模块的路径进行更改,使得其他模块使用arch的代码时,不需要指定arch::x86_64 (#128)
  • mm: bugfix: 修复页面分配器在初始化时,ZONE_NORMAL_INDEX始终为0的bug (#129)
  • scheduler: new: 使用Rust重构CFS调度器 (#131)
  • smp: 删除已经在smp中废弃的HPET中断转发函数 (#131)
  • process: bugfix: 修复init进程忘记设定fs gs寄存器的问题。 (#132)
  • vfs: update: 将VFS文件夹重命名为vfs (#133)
  • lockref: new: 新增rust版本的lockref (#135)
  • cpu: new: new:Rust封装cpu_relax(),通过pause指令,让cpu休息一会儿,降低空转功耗. (#135)
  • 使用rust重构softirq机制 (#138)

更新内容-用户环境

  • libc: bugfix: 注册信号处理函数时,总是注册sigkill的问题 (#120)
  • libc: new: 增加了raise、kill、abort (#120)
  • libc: new: 新增arch文件夹,在下面新增crt0 crti crtn文件 (#134)
  • libc: new: 新增fflush(), fprintf(), stdin, stdout, stderr, ferror(), fopen(), fclose(), putchar(), puts() (#136)
  • libc: new: 简单添加了fopen()对mode参数的处理。请注意,它没有完全遵循posix,也与Linux的不一致,将来使用Rust的时候完善它。 (#141)
  • 移植: new: 新增了gmp, mpfr, mpc的移植构建脚本 (#136)
  • 移植: new: 新增了gcc、binutils的交叉编译构建脚本以及gcc-11.3.0, binutils-2.38的补丁(在DragonOS-community下的仓库中)(#136)
  • compile: update: 更改编译器的Include路径,使得include时不需要加<libc/src/include/>前缀 (#124)

更新内容-其他

  • bugfix: 修复docker安装时异常退出的bug (#116)
  • new: 新增目标为x86_64-elf的GCC裸机编译器,并使用它来编译DragonOS (#111)
  • update: 更新Docker编译镜像至版本dragonos/dragonos-dev:v1.2, 并支持从Dockerfile构建这个编译镜像 (#111)
  • bugfix: 修复MBR磁盘镜像未设置启动标志的bug (#111)
  • update: 更新github workflow,增加cache,加快build check的速度
  • bugfix: 修复下载grub2.06时的提示错误 (#125)

更新内容-软件移植

源码、发布版镜像下载

  您可以通过以下方式获得源代码:

通过Git获取

通过DragonOS软件镜像站获取

  为解决国内访问GitHub慢、不稳定的问题,同时为了方便开发者们下载DragonOS的每个版本的代码,我们特意搭建了镜像站,您可以通过以下地址访问镜像站:

  您可以通过镜像站获取到DragonOS的代码压缩包,以及编译好的可运行的磁盘镜像。

开放源代码声明

为促进DragonOS项目的健康发展,DragonOS以GPLv2开源协议进行发布。所有能获得到DragonOS源代码以及相应的软件制品(包括但不限于二进制副本、文档)的人,都能享有我们通过GPLv2协议授予您的权利,同时您也需要遵守协议中规定的义务。

这是一个相当严格的,保护开源软件健康发展,不被侵占的协议。

对于大部分的善意的人们而言,您不会违反我们的开源协议。

我们鼓励DragonOS的自由传播、推广,但是请确保所有行为没有侵犯他人的合法权益,也没有违反GPLv2协议。

请特别注意,对于违反开源协议的,尤其是商业闭源使用以及任何剽窃、学术不端行为将会受到严肃的追责。(这是最容易违反我们的开源协议的场景)。

并且,请注意,按照GPLv2协议的要求,基于DragonOS修改或二次开发的软件,必须同样采用GPLv2协议开源,并标明其基于DragonOS进行了修改。亦需保证这些修改版本的用户能方便的获取到DragonOS的原始版本。

您必须使得DragonOS的开发者们,能够以同样的方式,从公开渠道获取到您二次开发的版本的源代码,否则您将违反GPLv2协议。

关于协议详细内容,还敬请您请阅读项目根目录下的LICENSE文件。请注意,按照GPLv2协议的要求,只有英文原版才具有法律效力。任何翻译版本都仅供参考。

开源软件使用情况

  DragonOS在开发的过程中,参考了一些开源项目的设计,或者引入了他们的部分代码,亦或是受到了他们的启发。现将他们列在下面。我们对这些开源项目的贡献者们致以最衷心的感谢!

格式:<项目名> - <链接> - <开源协议>

当前版本的所有提交记录

commit a8b621c8d1fe77251b8e4eafe258dc0ee7366dd5
Author: login <longjin@ringotek.cn>
Date:   Sun Jan 8 15:47:44 2023 +0800

    修正由于libc中具有crti.S和crtn.S,造成的与x86_64-elf-gcc不兼容的问题 (#144)

commit 9358ff0f6f7daa18d6fab4497de025736b3d6725
Author: login <longjin@ringotek.cn>
Date:   Sun Jan 8 15:06:52 2023 +0800

    Add v0.1.3 changelog (#143)
    
    * new: 0.1.3发行日志
    
    * 新增输出指定时间范围内的贡献者名单的脚本
    
    * 更新bootloader文档
    
    * update: 简介文档
    
    * new: 镜像站文档
    
    * update: 功能特性文档

commit fd91905f022b3ceaa59e666d1ff42d91fb8d40ef
Author: login <longjin@ringotek.cn>
Date:   Sun Jan 8 11:38:59 2023 +0800

    解决编译gcc、binutils的脚本中,变量名称错误的问题 (#142)

commit 62e4613978193aaf5d949a331df0398f2d085a30
Author: Gou Ngai <94795048+AlbertSanoe@users.noreply.github.com>
Date:   Sat Jan 7 23:15:37 2023 +0800

    使用rust重构softirq机制;解决Rtc驱动的编译警告问题 (#138)
    
    * 使用rust重构softirq机制
    * 解决Rtc驱动的编译警告问题
    
    Co-authored-by: longjin <longjin@RinGoTek.cn>

commit e9fdc57bf878f1bc5cc5743dfaeeaef743439291
Author: login <longjin@ringotek.cn>
Date:   Sat Jan 7 22:36:49 2023 +0800

    简单添加了fopen对mode参数的处理。请注意,它没有完全遵循posix,也与Linux的不一致,将来使用Rust的时候完善它。 (#141)

commit 2224c93ea968bc74621f7e124b4aca04875b3e6a
Author: guanjinquan <1666320330@qq.com>
Date:   Fri Jan 6 21:29:23 2023 +0800

    完善libc,构建了OS-specific工具链,编译了基于gcc-11.3.0的DragonOS userland compiler,移植了mpfr,gmp,mpc库 (#134)
    
    * 修改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 <longjin@RinGoTek.cn>

commit 61de2cdc3f29cdc6c441f128119e01e003e6f3ca
Author: login <longjin@ringotek.cn>
Date:   Tue Jan 3 23:09:25 2023 +0800

    新增rust版本的lockref (#135)
    
    * new:Rust封装cpu_relax(),通过pause指令,让cpu休息一会儿。降低空转功耗
    
    * new: Rust版本的lockref
    
    * Rust的RawSpinlock新增is_locked()和set_value()方法。
    
    * lockref文档

commit 2726f101b4cc787bbd36a69afffb0112f3a6567f
Author: login <longjin@ringotek.cn>
Date:   Tue Jan 3 21:01:56 2023 +0800

    删除无用的cfs.h (#136)

commit 587086d3f299f7394559d547c828191be20cfc11
Author: login <longjin@ringotek.cn>
Date:   Sun Jan 1 16:53:57 2023 +0800

    1、在文件系统目录下增加mod.rs 2、将VFS的路径改为vfs(#133)
    
    2、将VFS的路径改为vfs

commit 843e442971a47693f37a5f8d3452c383f7325359
Author: login <longjin@ringotek.cn>
Date:   Sat Dec 31 18:43:05 2022 +0800

    修复init进程忘记设定fs gs寄存器的问题。 (#132)

commit 74bde36e014ff501241bf40dd83653db47a2c8e4
Author: guanjinquan <1666320330@qq.com>
Date:   Sat Dec 31 17:35:39 2022 +0800

    Patch porting gcc v2 (#124)
    
    * 更改编译器的Include路径,使得include时不需要加`<libc/src/include/>`前缀
    
    * 修改include路径
    
    Co-authored-by: longjin <longjin@RinGoTek.cn>

commit d4f3de93a23e4bd4f000a3663768d47d094bf188
Author: login <longjin@ringotek.cn>
Date:   Sat Dec 31 17:26:12 2022 +0800

    使用Rust重构CFS调度器 (#131)
    
    * 新建调度器的文件
    
    * 把softirq vector移动到c文件中(原来在.h)
    
    * 将进程切换方式改为“中断返回时切换”
    
    * new:使用rust重构CFS
    
    * 删除已经在smp中废弃的HPET中断转发函数
    
    * 代码格式化
    
    * 删除多余的dunce依赖

commit 156949680c83f2d7e3b21ed68b11698b88eaf396
Author: login <longjin@ringotek.cn>
Date:   Sat Dec 31 13:47:49 2022 +0800

    bugfix:修复当使用sched()运行调度器,在切换进程的时候,由于不在中断上下文内,导致当前进程的上下文丢失的问题。 (#130)
    
    bugfix:修复当使用sched()运行调度器,在切换进程的时候,由于不在中断上下文内,导致当前进程的上下文丢失的问题。
    bugfix:修复切换进程的宏的汇编代码的损坏部分,未声明rax寄存器,从而导致的编译器未定义行为问题。

commit 882f0b7e7498dbff8de527b2b9159b7f6e6359c9
Author: YJwu2023 <119829947+YJwu2023@users.noreply.github.com>
Date:   Wed Dec 28 19:35:17 2022 +0800

    修复内存bug与grub安装脚本的错误 (#129)
    
    * 修复内存bug与grub安装脚本的错误
    
    * 修改小bug

commit adc1846b06fb862caed049f435fc0061488a6ff9
Author: login <longjin@ringotek.cn>
Date:   Mon Dec 26 13:13:12 2022 +0800

    内核:在lib.rs中,将arch模块的路径进行更改,使得其他模块使用arch的代码时,不需要指定arch::x86_64 (#128)

commit ac643d420b22f9d454ecefccd51ed34a9664586b
Author: login <longjin@ringotek.cn>
Date:   Sun Dec 25 23:53:35 2022 +0800

    new:新增rust写的RawSpinlock (#127)

commit 998390210549b47e6bdcc3fdab49eff4086ad18b
Author: login <longjin@ringotek.cn>
Date:   Sat Dec 24 23:30:26 2022 +0800
...
Read more

V0.1.2

17 Dec 12:02
42ec8d1

Choose a tag to compare

V0.1.2

:::{note}
本文作者:龙进 longjin@RinGoTek.cn

2022年12月17日
:::

贡献者名单

DragonOS V0.1.2版本由以下小伙伴贡献代码:

赞助者名单

感谢以下同学的赞赏,我们将不断努力!

其中,非常感谢Seele.Clover给予DragonOS项目人民币500元的赞助与支持!我们对于每一笔赞助款项,将仔细登记,并确保其能被妥善的使用。

更新内容-内核

  • 删除rust_helloworld文件 (#113)
  • Signal: 允许用户注册信号处理函数,能够进入自定义的handler。(#112)
    • 支持kill命令
    • 允许用户自定义信号处理函数
    • 新增2个系统调用:SYS_SIGACTION , SYS_RT_SIGRETURN
    • libc增加signal(),sigaction()函数。
    • 暂时只支持旧版的sighandler,即:只有1个参数的void handler(int signum)类型的信号处理函数。对于另一种信号处理函数void handler(int signum, siginfo_t *info, void* data),尚不支持传递第三个参数。
  • 在内核代码中加入自定义的stdint.h文件 (#109)
  • 调整编译grub的脚本的部分 (#108)
  • 新增32、64位uefi启动 (#105)(#101)
  • 使用编译安装的grub-2.06,解决客户机上grub版本不对导致的编译无法运行的问题。
  • 增加了timekeeping模块 (#106)
  • bugfix: 修复rtc时钟对BCD码进行转换的时候,忘了处理day字段的问题 (#104)
  • new: 开发过程文档(完成了一半)
  • bootstrap.sh解决下载rust慢的问题
  • 更新“构建系统”文档
  • procfs->status增加显示preempt和虚拟运行时间 (#100)
  • ffz函数:获取u64中的第一个值为0的bit (#100)
  • 解决由于编译器优化导致local_irq_restore无法获取到正确的rflags的值的问题
  • 使用Rust重构串口驱动 (#99)

更新内容-用户环境

  • about app: 显示当前构建的git commit sha1以及构建时间(#114)
  • shell: 修复shell的exec命令对绝对路径的拼接错误问题(#114)
  • shell: exec命令增加"&"后台运行选项 (#100)
  • new: 测试signal用的app
  • 将libc目录进行调整,加入cargo作为rust的包管理器

源码、发布版镜像下载

  您可以通过以下方式获得源代码:

通过Git获取

通过DragonOS软件镜像站获取

  为解决国内访问GitHub慢、不稳定的问题,同时为了方便开发者们下载DragonOS的每个版本的代码,我们特意搭建了镜像站,您可以通过以下地址访问镜像站:

  您可以通过镜像站获取到DragonOS的代码压缩包,以及编译好的可运行的磁盘镜像。

开放源代码声明

:::{note}
为促进DragonOS项目的健康发展,DragonOS以GPLv2开源协议进行发布。所有能获得到DragonOS源代码以及相应的软件制品(包括但不限于二进制副本、文档)的人,都能享有我们通过GPLv2协议授予您的权利,同时您也需要遵守协议中规定的义务。

这是一个相当严格的,保护开源软件健康发展,不被侵占的协议。

对于大部分的善意的人们而言,您不会违反我们的开源协议。

我们鼓励DragonOS的自由传播、推广,但是请确保所有行为没有侵犯他人的合法权益,也没有违反GPLv2协议。

请特别注意,对于违反开源协议的,尤其是商业闭源使用以及任何剽窃、学术不端行为将会受到严肃的追责。(这是最容易违反我们的开源协议的场景)。

并且,请注意,按照GPLv2协议的要求,基于DragonOS修改或二次开发的软件,必须同样采用GPLv2协议开源,并标明其基于DragonOS进行了修改。亦需保证这些修改版本的用户能方便的获取到DragonOS的原始版本。

您必须使得DragonOS的开发者们,能够以同样的方式,从公开渠道获取到您二次开发的版本的源代码,否则您将违反GPLv2协议。

关于协议详细内容,还敬请您请阅读项目根目录下的LICENSE文件。请注意,按照GPLv2协议的要求,只有英文原版才具有法律效力。任何翻译版本都仅供参考。
:::

开源软件使用情况

  DragonOS在开发的过程中,参考了一些开源项目的设计,或者引入了他们的部分代码,亦或是受到了他们的启发。现将他们列在下面。我们对这些开源项目的贡献者们致以最衷心的感谢!

格式:<项目名> - <链接> - <开源协议>

当前版本的所有提交记录

commit 7a818da88a1c7a1760de7671141b0ce1ca4e3dde
Author: login <longjin@ringotek.cn>
Date:   Sat Dec 17 17:49:12 2022 +0800

    Patch about auto gen version string (#114)
    
    * new: about app中,显示当前构建的git commit sha1以及构建时间
    
    * bugfix: 修复shell的exec命令对绝对路径的拼接错误问题

commit 83a7aaa46bbc411c43d4fc099c6c8884efbe4771
Author: login <longjin@ringotek.cn>
Date:   Sat Dec 17 16:31:50 2022 +0800

    删除rust_helloworld文件 (#113)

commit 6efd4740336205c9bfdd8b164e667cee2f38781e
Author: login <longjin@ringotek.cn>
Date:   Sat Dec 17 16:27:50 2022 +0800

    允许用户自定义信号处理函数 (#112)
    
    * new: 用户注册信号处理函数,能够进入自定义的handler
    
    * 修复忘了传信号的数字给用户的处理函数的bug
    
    * new:sigreturn
    
    * 删除注释

commit 0e0c187484281768391e131495f0655e40d70cf7
Author: login <longjin@ringotek.cn>
Date:   Fri Dec 16 16:20:09 2022 +0800

    在内核代码中加入自定义的stdint.h文件 (#109)

commit d02e6ea4112ad520aa4090ff73cdf592e14c0a82
Author: login <longjin@ringotek.cn>
Date:   Wed Dec 14 20:01:55 2022 +0800

    调整编译grub的脚本的部分 (#108)
    
    1、bugfix: 修复编译grub的脚本的部分错误
    2、将grub下载源替换为tuna
    3、优化写入磁盘镜像的脚本
    4、将bios文件夹改名为legacy

commit 38b341b8aa671f75ac26d05059aa2e9a09e653b7
Author: YJwu2023 <119829947+YJwu2023@users.noreply.github.com>
Date:   Wed Dec 14 16:58:49 2022 +0800

    新增32位uefi启动 (#105)
    
    * 新增32位uefi启动
    
    * 修复小bug
    
    * 增加grub本地编译安装
    
    * 增加本地grub编译安装脚本
    
    * 修正小错误
    
    * 修复空文件夹不上传的bug

commit 01876902fbf6ed43992cc7d153bd8c505cb5224b
Author: Gou Ngai <94795048+AlbertSanoe@users.noreply.github.com>
Date:   Wed Dec 14 15:13:54 2022 +0800

    增加了timekeeping模块 (#106)
    
    * 增加了timekeeping模块
    
    * 格式化文档和细节更改
    
    Co-authored-by: longjin <longjin@RinGoTek.cn>

commit 728aca308917a7d4d0ba10fe8174e9408d77a9a6
Author: login <longjin@ringotek.cn>
Date:   Sun Dec 11 22:59:47 2022 +0800

    bugfix: 修复rtc时钟对BCD码进行转换的时候,忘了处理day字段的问题 (#104)

commit 237e95c6ddce72d72ae7fedfeca412fab82b3622
Author: wwc-15172310230 <78997674+wwc-15172310230@users.noreply.github.com>
Date:   Sun Dec 11 22:22:10 2022 +0800

    调整user下libs的libc目录结构 (#103)
    
    * 调整user下libs的libc目录结构
    
    * 修正.gitignore文件的问题
    
    * 修复无法编译的问题
    
    Co-authored-by: longjin <longjin@RinGoTek.cn>

commit 2291ffdece1dc5a703602f79f74df8a4854d215b
Author: login <longjin@ringotek.cn>
Date:   Sun Dec 11 20:09:58 2022 +0800

    文档更新 (#102)
    
    * new: 开发过程文档(完成了一半)
    
    * bootstrap.sh解决下载rust慢的问题
    
    * 更新“构建系统”文档

commit 7f439c5ddbd2ecffc112149d16983975f523052c
Author: YJwu2023 <119829947+YJwu2023@users.noreply.github.com>
Date:   Fri Dec 9 16:08:54 2022 +0800

    增加uefi启动 (#101)
    
    * 增加uefi启动
    
    * 修改脚本
    
    * uefi修改
    
    * 删除错误的注释
    
    * 修正写入磁盘镜像的脚本
    
    * 修改X86_64为x86_64
    
    Co-authored-by: longjin <longjin@RinGoTek.cn>

commit 1a2eaa402f05f82aaeebe1e03824534a0a425d4d
Author: login <longjin@ringotek.cn>
Date:   Thu Dec 8 22:59:51 2022 +0800

    signal的处理(kill命令)以及一些其他的改进 (#100)
    
    * 将entry.S中冗余的ret_from_syscall代码删除,改为jmp Restore_all
    
    * new: 增加判断pt_regs是否来自用户态的函数
    
    * new: rust的cli和sti封装
    
    * 将原有的判断pt_regs是否来自用户态的代码,统一改为调用user_mode函数
    
    * ffz函数:获取u64中的第一个值为0的bit
    
    * spinlock增加 spinlock irq spin_unlock_irq
    
    * 临时解决显示刷新线程迟迟不运行的问题
    
    * 更改ffi_convert的生命周期标签
    
    * new: 测试signal用的app
    
    * 解决由于编译器优化导致local_irq_restore无法获取到正确的rflags的值的问题
    
    * new: exec命令增加"&"后台运行选项
    
    * procfs->status增加显示preempt和虚拟运行时间
    
    * 更改引用计数的FFIBind2Rust trait中的生命周期标签
    
    * new: signal处理(kill)
    
    * 更正在review中发现的一些细节问题

commit f8b55f6d3fcbf152a1cb6d6fc722bf1607418b28
Author: TingHuang <92705854+TingSHub@users.noreply.github.com>
Date:   Tue Dec 6 22:15:03 2022 +0800

    Patch uart (#99)
    
    * 添加UART驱动相关文件
    
    * 添加驱动核心文件,将rust编写的驱动代码加入Package中
    
    * 添加glib.h文件生成rust代码,添加uart驱动代码
    
    * 添加串口发送及接收相关代码
    
    * 添加字符串发送函数,未实现具体功能
    
    * 为调用uart驱动的代码添加rust接口
    
    * 添加字符串发送函数,修改C语言调用接口
    
    * 添加rust串口驱动
    
    * 添加uart.h头文件,将串口端口类型改为enum
    
    * 添加注释,规范代码

commit 036acc52ce9d0fb9e7d92768ff74939a29c07f32
Author: login <longjin@ringotek.cn>
Date:   Tue Nov 29 21:46:13 2022 +0800

    将entry.S中冗余的ret_from_syscall代码删除,改为jmp Restore_all (#98)
    
    * 将entry.S中冗余的ret_from_syscall代码删除,改为jmp Restore_all

V0.1.1

27 Nov 07:59
d85ebf1

Choose a tag to compare

V0.1.1

:::{note}
本文作者:龙进 longjin@RinGoTek.cn

2022年11月27日
:::

贡献者名单

DragonOS V0.1.1版本由以下小伙伴贡献代码:

赞助者名单

感谢以下同学的赞赏,我们将不断努力!

  • David Wen
  • TerryLeeSCUT
  • slientbard

其中,非常感谢David Wen给予DragonOS项目人民币1000元的赞助与支持!我们对于每一笔赞助款项,将仔细登记,并确保其能被妥善的使用。

更新内容-内核

  • 新增rust ffi (#77)
  • port kmalloc and printk to rust
  • rust下的kdebug kinfo kwarn kBUG kerror宏
  • bugfix: 修复进程pcb被回收时,未将其从链表中删除的问题
  • 目录结构优化:移动asm.h和cmpxchg.h
  • signal的发送
  • procfs:查看进程的status
  • 解决第一次编译时磁盘镜像权限错误的问题
  • 将fork相关代码移动到fork.c

更新内容-用户环境

  • shell:增加kill命令,可向目标进程发送信号。但由于仍未完善signal机制,因此目标进程暂时不能响应这个信号。

源码、发布版镜像下载

  您可以通过以下方式获得源代码:

通过Git获取

通过DragonOS软件镜像站获取

  为解决国内访问GitHub慢、不稳定的问题,同时为了方便开发者们下载DragonOS的每个版本的代码,我们特意搭建了镜像站,您可以通过以下地址访问镜像站:

  您可以通过镜像站获取到DragonOS的代码压缩包,以及编译好的可运行的磁盘镜像。

开放源代码声明

:::{note}
为促进DragonOS项目的健康发展,DragonOS以GPLv2开源协议进行发布。所有能获得到DragonOS源代码以及相应的软件制品(包括但不限于二进制副本、文档)的人,都能享有我们通过GPLv2协议授予您的权利,同时您也需要遵守协议中规定的义务。

这是一个相当严格的,保护开源软件健康发展,不被侵占的协议。

对于大部分的善意的人们而言,您不会违反我们的开源协议。

我们鼓励DragonOS的自由传播、推广,但是请确保所有行为没有侵犯他人的合法权益,也没有违反GPLv2协议。

请特别注意,对于违反开源协议的,尤其是商业闭源使用以及任何剽窃、学术不端行为将会受到严肃的追责。(这是最容易违反我们的开源协议的场景)。

并且,请注意,按照GPLv2协议的要求,基于DragonOS修改或二次开发的软件,必须同样采用GPLv2协议开源,并标明其基于DragonOS进行了修改。亦需保证这些修改版本的用户能方便的获取到DragonOS的原始版本。

您必须使得DragonOS的开发者们,能够以同样的方式,从公开渠道获取到您二次开发的版本的源代码,否则您将违反GPLv2协议。

关于协议详细内容,还敬请您请阅读项目根目录下的LICENSE文件。请注意,按照GPLv2协议的要求,只有英文原版才具有法律效力。任何翻译版本都仅供参考。
:::

开源软件使用情况

  DragonOS在开发的过程中,参考了一些开源项目的设计,或者引入了他们的部分代码,亦或是受到了他们的启发。现将他们列在下面。我们对这些开源项目的贡献者们致以最衷心的感谢!

格式:<项目名> - <链接> - <开源协议>

当前版本的所有提交记录

commit d65ade9c5909076747bd00966a398fe27fbd290d
Author: DaJiYuQia <88259094+DaJiYuQia@users.noreply.github.com>
Date:   Sun Nov 27 14:21:31 2022 +0800

    Patch procf (#95)
    
    * debug color problem
    
    Co-authored-by: longjin <longjin@RinGoTek.cn>

commit 6cb769c423b09e88fea1763210200a716477be0a
Author: login <longjin@ringotek.cn>
Date:   Sun Nov 27 14:17:36 2022 +0800

    将include目录下的rust代码转移到他们应当属于的模块中 (#96)
    
    * 将include目录下的rust代码转移到他们应当属于的模块下。

commit 27a97abd2474b03ad09b562e5ed11e1fdae8eb32
Author: DaJiYuQia <88259094+DaJiYuQia@users.noreply.github.com>
Date:   Sat Nov 26 17:34:00 2022 +0800

    Patch procf (#90)
    
    * 1234
    
    * 123
    
    * 合并master
    
    * procfs
    
    * 1
    
    * procfs展示进程基本信息
    
    * modified code
    
    * 恢复权限
    
    * 恢复权限
    
     #恢复权限
    
    * modify permission
    
    * 删除run.sh
    
    * 解决第一次编译时磁盘镜像权限错误的问题
    
    * 恢复.vscode/c_cpp_properties.json
    
    * 删除process.c中错误的do_fork
    
    * remake procfs
    
    * 修改一些变量名
    
    * 修改类型
    
    * modified
    
    * data_puts缓冲区溢出后return
    
    Co-authored-by: longjin <longjin@RinGoTek.cn>

commit ad23fcddf893d7f92d2bf3efdb66e969416d2852
Author: login <longjin@ringotek.cn>
Date:   Wed Nov 23 21:34:35 2022 +0800

    bugfix: 修复进程退出时未释放signal和sighand && 增加赞赏者名单:David Wen (#93)
    
    * bugfix: 修复进程退出时未释放signal和sighand的bug
    
    * 增加赞赏者名单:David Wen

commit 0274cd6eeec01885232e7418a501857cb76da69e
Author: login <longjin@ringotek.cn>
Date:   Wed Nov 23 20:43:18 2022 +0800

    修正drop signal结构体的box对象的的问题 (#92)
    
    * fix: exit signal and exit sighand

commit c8025a88798dc57ecc5d7f20ad69de695445638f
Author: login <longjin@ringotek.cn>
Date:   Wed Nov 23 20:18:22 2022 +0800

    new:在fork时拷贝signal和sighand (#91)
    
    * refcount初始化
    
    * new: 实现copy_sighand
    del: 删除sighand_struct的wqh, 待将来有需要时,替换成rust版本的
    
    * new: 拷贝signal
    bugfix: 解决拷贝sighand时的uaf问题

commit 66f67c6a95b8aad85cfd2146a86e5e3e6a3568e7
Author: login <longjin@ringotek.cn>
Date:   Wed Nov 23 11:38:20 2022 +0800

    signal的发送(暂时父子进程之间共享信号及相应的结构体) (#89)
    
    * 解决由于spinlock.h中包含preempt_enable()带来的循环include问题
    
    * new: 初步实现signal的数据结构
    
    * new:signal相关数据结构
    
    * fix: 解决bindings.rs报一堆警告的问题
    
    * new: rust下的kdebug kinfo kwarn kBUG kerror宏
    
    * 移动asm.h和cmpxchg.h
    
    * new: signal的发送(暂时只支持父子进程共享信号及处理函数)

commit 3d729e2069e01ee07525ff83167566dac5322a40
Author: login <longjin@ringotek.cn>
Date:   Fri Nov 18 17:59:33 2022 +0800

    bugfix: 修复进程pcb被回收时,未将其从链表中删除的问题 (#87)
    
    * bugfix: 修复进程pcb被回收时,未将其从链表中删除的问题
    new: pcb相关api文档
    
    * 将文档加入目录

commit 0bfe94f46be9bdde1ade81a20e803aa2aafd2964
Author: login <longjin@ringotek.cn>
Date:   Fri Nov 18 16:32:15 2022 +0800

    new: rust下的kdebug kinfo kwarn kBUG kerror宏 (#86)
    
    * new: rust下的kdebug kinfo kwarn kBUG kerror宏

commit c6174797dcf3427f38bfa0f4bd3e039c319f7c5b
Author: login <longjin@ringotek.cn>
Date:   Thu Nov 17 20:29:29 2022 +0800

    fix: 解决bindings.rs报了很多警告的问题 (#85)
    
    * fix: 解决bindings.rs报一堆警告的问题

commit cffd7144fbed84f9775e89d7b99602c6ccc5a510
Author: login <longjin@ringotek.cn>
Date:   Wed Nov 16 15:18:03 2022 +0800

    signal相关数据结构&代码结构优化 (#84)
    
    * 解决由于spinlock.h中包含preempt_enable()带来的循环include问题
    
    * new: 初步实现signal的数据结构

commit fb6c29d01d4cf92368efec08c01e419c2a941f7d
Author: login <longjin@ringotek.cn>
Date:   Sun Nov 13 16:43:58 2022 +0800

    port kmalloc and printk to rust (#83)
    
    * 暂时移除cbindgen
    
    * 将lib文件夹更名为libs文件夹(解决rust的冲突)
    
    * 实现了全局的allocator
    
    * 实现了printk宏
    
    * new: 完善了printk的颜色

commit 82d2e446a401e7eee57a847f48a6d162931170c3
Author: login <longjin@ringotek.cn>
Date:   Sat Nov 12 15:25:54 2022 +0800

    new: 暂时移除cbindgen (#82)

commit 2aaf7808efe44ecfaadd51ae4f8892e667108578
Author: login <longjin@ringotek.cn>
Date:   Fri Nov 11 22:21:44 2022 +0800

    在内核中引入cbindgen,生成rust-C的FFI (#81)
    
    
    * 解决codeql失败问题
    
    * new: 为内核引入cbindgen

commit 2813126e3190c9b3c1a836a647b259a7adbe0cf3
Author: login <longjin@ringotek.cn>
Date:   Fri Nov 11 15:35:37 2022 +0800

    新增rust ffi (#77)
    
    * 引入cargo
    
    * 取消对Cargo.lock的跟踪
    
    * 解决vscode报错问题
    
    * new: rust的代码能够调用c语言的printk_color
    
    * 1、将原本run.sh的工作拆解,变为几个不同的make命令
    2、在docker镜像中编译rust
    
    * 更改workflow
    
    * update workflow
    
    * new: 解决workflow无法通过编译的问题

commit 5e023cf7911333eb05bfe65704dce4b01fa4d0a7
Author: login <longjin@ringotek.cn>
Date:   Fri Nov 11 15:21:45 2022 +0800

    Update makefile.yml

commit e44795008f7e34d2068cf28dcedbcb91f5ccd66b
Author: login <longjin@ringotek.cn>
Date:   Fri Nov 11 15:18:13 2022 +0800

    Update makefile.yml (#80)

commit ec5fb84b61c313824cc2199ab64e3af4b7e5f895
Author: login <longjin@ringotek.cn>
Date:   Fri Nov 11 15:08:09 2022 +0800

    Update makefile.yml

commit 6d9dff5f1ff347ea780a0249e54eef356cdcaaea
Author: login <longjin@ringotek.cn>
Date:   Fri Nov 11 15:07:48 2022 +0800

    Revert "Update makefile.yml (#78)" (#79)
    
    This reverts commit badc7d238f2341e844a90be3e357e5dd77a447fc.

commit badc7d238f2341e844a90be3e357e5dd77a447fc
Author: login <longjin@ringotek.cn>
Date:   Fri Nov 11 15:05:52 2022 +0800

    Update makefile.yml (#78)

V0.1.0

05 Nov 16:07
325c103

Choose a tag to compare

V0.1.0

本文作者:龙进 longjin@RinGoTek.cn

2022年11月4日

发布时间:2022年11月6日

前言

  DragonOS从2022年1月15日开始开发,到如今已经经历了将近300天。在这么多个日夜里,已经数不清到底花了多少时间在DragonOS的开发之中,
我基本上把所有的空闲时间都给了DragonOS,保守估计总工时已经在1000小时以上。能够发布第一个版本,我感到十分有成就感。

  在2022年7月以来,陆陆续续的,有来自6所高校或企业的小伙伴/大佬加入了DragonOS的开发。我当时非常的欣喜,我想,也许在大家的一同努力下,我们能创造出一个真正具有实用性的操作系统呢!我们累计召开了14次交流讨论会。我相信,在大家的共同努力下,将来,我们一定能创造出真正独立自主的、开放的、面向服务器领域应用的开源操作系统,并在生产环境中得到应用。

  尽管DragonOS目前只是一个玩具水平的操作系统,只是“比本科生毕业设计难度略高的”操作系统。但是,请不要小看它,它的内在的架构设计,瞄准了Linux5.18及以后的发行版,
虽尚未能达到Linux的水平,但我们正努力追赶。得益于Linux的相关资料,DragonOS在架构设计之时,学习了Linux的很多设计思想,相关组件都尽量考虑了可扩展性与可移植性。

  千里之行,始于足下。DragonOS V0.1.0版本的发布,是一个全新的开始。希望在未来的十年里,我们能与众多伙伴们一同努力,在2032年,将DragonOS建设成为具有实用意义的,能够在服务器领域取得
广泛应用的开源操作系统!

特别鸣谢

  在DragonOS V0.1.0版本的发布之际,我想对我的老师、前辈以及学校表示衷心的感谢!

  • 佛山市南海区大沥镇中心小学 姚志城老师: 您是带领我接触计算机,学会编程的领路人。十年前,与您交谈时,您说过:“我们国家目前还没有自主的、成熟的操作系统”。这句话,为我的梦想埋下了种子。您培养了我对计算机的热爱,因此我选择了软件工程这个专业。感谢当年您的教导,师恩难忘!

  • 佛山市南海区石门实验学校: 在石实就读的三年里,非常感谢石实的“扬长教育”理念,在老师们的培养下,让我充分发挥了自己的个性和特长,也取得了不错的成绩。在石实的三年里,我学会了C++、Java以及简单的算法,也自己开发了几个安卓app,积累了将近6千行的代码量。

  • 佛山市南海区石门中学:“任重道远,毋忘奋斗”是石中的校训,我想,这句校训,也应当成为我们每个新时代青年人的座右铭。在石门中学的三年,家国情怀教育对我产生了很大的影响。我想,我们作为新时代的青年,更应当肩负起时代的重任,奋勇拼搏,为祖国的发展,为民族的自强,为人类的未来,努力奋斗!

  • 华南理工大学:“博学慎思,明辨笃行”,在华工,我得到了进一步的学习与发展。开拓了自己的视野,学会了跟很多人打交道。并且,在软件学院,我遇到了一群认真负责的老师。非常感谢学院对我的支持,支持我们成立项目组。我相信,在学院的支持下,能让DragonOS取得更好的发展,走的更远!

  • 华南理工大学软件学院 王国华老师:王老师是我《操作系统》课程的老师,在她的指导下,我对操作系统的原理有了更深的理解,并参加了“泛珠三角+大学生计算机作品赛“,在2022年6月的广东省选拔赛中,DragonOS取得了一等奖、最佳创新奖的好成绩。

  • 华南理工大学软件学院 汤峰老师: 汤老师是我们在校内的项目组的指导老师。在她的悉心指导下,我们将不断前行,保持我们前进的方向,持续构建开源社区。我由衷地感谢汤老师的指导!

  • Yaotian Feng: 在Bilibili上认识了这位非常厉害的老哥,解答了我的很多问题,很多次在我毫无头绪的debug了几天之后,几句话点醒了我,让我找到解决问题的路径。并且,他也跟我分享了容易踩坑的地方,让我在将要踩坑的时候能够有个心理预期,不至于那么难受哈哈哈哈。

贡献者名单

DragonOS V0.1.0版本的发布,离不开以下小伙伴们的共同努力:

赞助者名单

感谢以下同学的赞赏,我们将不断努力!

  • TerryLeeSCUT
  • slientbard

内核

遵循的一些标准规范

  • 启动引导:Multiboot2
  • 系统接口:posix 2008

硬件架构

  • 目前支持在x86-64架构的处理器上运行

Bootloader

  • 使用Grub 2.06作为bootloader

内存管理

  • 实现了基于bitmap的页分配器
  • 实现了slab分配器,用来分配小块的、具有对齐要求的内存
  • 抽象出VMA(虚拟内存区域)
  • 实现VMA反向映射机制
  • 实现MMIO地址空间自动映射机制

多核

  • 支持多核引导。也就是说,在DragonOS启动后,将会启动AP处理器。但是,为了简化其他内核模块的实现,目前AP处理器上,暂时没有任务在运行。
  • 粗略实现了IPI(处理器核间通信)框架

进程管理

  • 支持进程的创建、回收
  • 内核线程
  • kthread机制
  • 用户态、内核态进程/线程的fork/vfork(注意,用户态的fork和内核态的有一定的区别,内核态的fork更复杂)
  • exec 让进程去执行一个新的可执行文件
  • 进程的定时睡眠(sleep)(支持spin/rdtsc高精度睡眠、支持上下文切换方式的睡眠)

同步原语

  • spinlock 自旋锁
  • mutex 互斥量
  • atomic 原子变量
  • wait_queue 等待队列
  • semaphore 信号量

调度相关

  • CFS调度器
  • 单核调度(暂时不支持多核负载均衡)
  • completion “完成”机制,让一个进程能等待某个任务的完成。

IPC进程间通信

  • 匿名管道

文件系统

  • VFS虚拟文件系统的基本功能
  • FAT32文件系统(尚不支持删除文件夹)
  • devfs设备文件系统。目前只将键盘文件注册到其中。
  • rootfs根文件系统,在真实的磁盘文件系统被挂载前,为其他的伪文件系统提供支持。
  • 挂载点抽象。目前实现了文件系统的挂载,使用类似于栈的方式管理所有的挂载点。(将来需要优化这部分)

异常及中断处理

  • 处理器异常的捕获
  • 对APIC的支持
  • softirq软中断机制
  • 能够对内核栈进行traceback

内核数据结构

  • 普通的二叉树
  • kfifo先进先出缓冲区
  • 循环链表
  • IDR 映射数据结构
  • IDA ID分配数据组件

屏幕显示

  • VESA VBE显示芯片驱动
  • 实现了屏幕管理器,支持多个显示框架注册到屏幕管理器中。
  • 实现了TextUI文本界面框架,能够渲染文本到屏幕上。并且预留了上下滚动翻页、多显示窗口的支持。
  • printk

内核实用库

  • 字符串操作库
  • ELF可执行文件支持组件
  • 基础数学库
  • CRC函数库

软件移植

  • 移植了LZ4压缩库(V1.9.3),为将来实现页面压缩机制打下基础。

内核测试

  • ktest单元测试框架
  • 支持使用串口(COM1)输出屏幕内容到文件之中。

驱动程序支持

  • IDE硬盘
  • AHCI硬盘(SATA Native)
  • ACPI 高级电源配置模块
  • PCI总线驱动
  • XHCI主机控制器驱动(usb3.0)
  • ps/2键盘
  • ps/2鼠标
  • HPET高精度定时器
  • RTC时钟
  • local APIC定时器
  • UART串口(支持RS-232)
  • VBE显示
  • 虚拟tty设备

系统调用

DragonOS目前一共有22个有效的系统调用。

  • SYS_PUT_STRING 往屏幕上打印字符
  • SYS_OPEN 打开文件
  • SYS_CLOSE 关闭文件
  • SYS_READ 读取文件
  • SYS_WRITE 写入文件
  • SYS_LSEEK 调整文件指针
  • SYS_FORK fork系统调用
  • SYS_VFORK vfork系统调用
  • SYS_BRK 调整堆大小为指定值
  • SYS_SBRK 调整堆大小为相对值
  • SYS_REBOOT 重启 (将来sysfs完善后,将删除这个系统调用,请勿过度依赖这个系统调用)
  • SYS_CHDIR 切换进程的工作目录
  • SYS_GET_DENTS 获取目录中的目录项的元数据
  • SYS_EXECVE 让当前进程执行新的程序文件
  • SYS_WAIT4 等待进程退出
  • SYS_EXIT 退出当前进程
  • SYS_MKDIR 创建文件夹
  • SYS_NANOSLEEP 纳秒级睡眠(最长1秒)在小于500ns时,能够进行高精度睡眠
  • SYS_CLOCK 获取当前cpu时间
  • SYS_PIPE 创建管道
  • SYS_MSTAT 获取系统当前的内存状态信息
  • SYS_UNLINK_AT 删除文件夹或删除文件链接

用户环境

LibC

  LibC是应用程序与操作系统交互的纽带。DragonOS的LibC实现了一些简单的功能。

  • malloc堆内存分配器
  • 基础数学库
  • 简单的几个与文件相关的函数
  • pipe
  • fork/vfork
  • clock
  • sleep
  • printf

Shell命令行程序

  • 基于简单的字符串匹配的解析(不是通过编译课程学的的那一套东西做的,因此比较简单,粗暴)
  • 支持的命令:ls,cd,mkdir,exec,about,rmdir,rm,cat,touch,reboot

用户态驱动程序

  • 用户态键盘驱动程序

源码、发布版镜像下载

  您可以通过以下方式获得源代码:

通过Git获取

通过DragonOS软件镜像站获取

  为解决国内访问GitHub慢、不稳定的问题,同时为了方便开发者们下载DragonOS的每个版本的代码,我们特意搭建了镜像站,您可以通过以下地址访问镜像站:

  您可以通过镜像站获取到DragonOS的代码压缩包,以及编译好的可运行的磁盘镜像。

开放源代码声明

为促进DragonOS项目的健康发展,DragonOS以GPLv2开源协议进行发布。所有能获得到DragonOS源代码以及相应的软件制品(包括但不限于二进制副本、文档)的人,都能享有我们通过GPLv2协议授予您的权利,同时您也需要遵守协议中规定的义务。

这是一个相当严格的,保护开源软件健康发展,不被侵占的协议。

对于大部分的善意的人们而言,您不会违反我们的开源协议。

我们鼓励DragonOS的自由传播、推广,但是请确保所有行为没有侵犯他人的合法权益,也没有违反GPLv2协议。

请特别注意,对于违反开源协议的,尤其是商业闭源使用以及任何剽窃、学术不端行为将会受到严肃的追责。(这是最容易违反我们的开源协议的场景)。

并且,请注意,按照GPLv2协议的要求,基于DragonOS修改或二次开发的软件,必须同样采用GPLv2协议开源,并标明其基于DragonOS进行了修改。亦需保证这些修改版本的用户能方便的获取到DragonOS的原始版本。

您必须使得DragonOS的开发者们,能够以同样的方式,从公开渠道获取到您二次开发的版本的源代码,否则您将违反GPLv2协议。

关于协议详细内容,还敬请您请阅读项目根目录下的LICENSE文件。请注意,按照GPLv2协议的要求,只有英文原版才具有法律效力。任何翻译版本都仅供参考。

开源软件使用情况

  DragonOS在开发的过程中,参考了一些开源项目的设计,或者引入了他们的部分代码,亦或是受到了他们的启发。现将他们列在下面。我们对这些开源项目的贡献者们致以最衷心的感谢!

格式:<项目名> - <链接> - <开源协议>