# LiunuxOS_C **Repository Path**: fangdb/LiunuxOS_C ## Basic Information - **Project Name**: LiunuxOS_C - **Description**: LiuNUXOS_C - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-01-07 - **Last Updated**: 2024-01-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # LiunuxOS liunuxos系统c语言部分,以及linux、windows系统上的安装模块。 主要功能: 1. 进程线程创建和调度。时钟计时器每过一个计时周期就会触发一次中断,这就是liunuxos的线程切换频率,大概为1ms。 当前支持两种进程/线程切换方式,第一种只需要一个tss任务状态段。进入中断后,中断程序保存硬件寄存器等执行现场,在切换为新的内核堆栈中依次push进新线程的硬件寄存器和其他现场寄存器,然后执行iret指令后,新的寄存器和现场被弹出到新线程中并执行。 第二种线程切换需要两个tss,一个是所有进程共用的,一个在任务门中。时钟中断发生时,进程的硬件寄存器被自动保存在共享的tss中,在中断程序中,将进程共享的tss内容拷贝到内存中的该进程信息表中(进程信息表基地址在系统启动时被设置,通过pid可以找到进程的所有信息和寄存器、现场数据),然后把要被调度执行的进程的tss数据复制到共享tss中,中断程序执行iret指令返回后,新的线程已经被切换。在进程调度时,使用的比较简单的轮转调度,就是按照pid进程号,依次轮转调度执行。 应用进程的栈初始化大小是1MB,系统进程的栈初始化大小是64kb。 进程是资源的载体,其每个线程都是单独调度的,只是在进程切换时修改cr3,而在进程内部的线程之间切换时并不修改cr3,代码中利用pid这一标识判断线程是否在同一个进程中。 该模块支持任意pe文件被加载执行。 liunuxos不支持apic模式,虽然是多进程多线程,但是只支持一个cpu。 2. 文件系统读写。主要是ntfs、fat32、iso9660文件系统的读取操作。文件系统的资料网上很多,请自行百度,我只是重复的搬砖而已。硬盘驱动器在虚拟机创建时只能支持ATA和SATA模式。 3. 内存管理。主要是内存分配和虚拟内存的实现。关于虚拟内存,网上资料很多,但是没有找到切实可行的方法。我的做法分为两步: 首先,在kernel.exe进入保护模式时,开启分页,具体的分页策略是:物理地址和线性地址一一对应的关系。第二步,在进程创建时,复 制页目录表,但是只包括系统空间的部分页表,其他页表设置为0,同时调用全局的内存分配程序(采用slab算法,分配的是物理地址而不是线性地址),分配的内存大小页面对齐,然后修改进程的页表项,并将其映射为从4gb依次往低地址的递减的虚拟线性地址。 此种分页下,系统进程的线性地址都是物理地址,并且可以被每个用户进程访问,但是应用程序的代码段、数据段、堆栈段地址都是线性递减的。 liunuxos虽然支持虚拟内存,但是不支持内存交换等功能。 liunuxos具体的内存地址分布可以查看def.h文件。 4. 键盘鼠标功能。支持键盘输入,鼠标左键右键点击等。此部分内容自行百度。 5. soundblaster声卡播放wav格式音乐。虚拟机创建时必须指定声卡为soundblaster型。 6. x86断点,单步调试和调试寄存器的使用。 7. 基本的图形操作接口。窗口控件、矩形、圆、点、线的绘制和填充等简单图像化接口。 8. 浮点中断的简单处理。 9. elf文件和pe文件的加载执行。关于这部分,网上资料也很多,可自行百度。