1,操作系统定义:
操作系统是管理计算机硬件与软件资源的系统软件,为用户和应用程序提供统一的接口与服务,将底层操作抽象为接口供用户及应用程序使用。它是计算机系统的核心,负责协调硬件、软件及用户之间的交互。
资源管理 操作系统管理CPU、内存、磁盘、网络等硬件资源,通过调度算法分配资源给多个应用程序。例如,多任务系统中CPU时间片的分配。
进程管理 创建、销毁进程,处理进程同步与通信。现代操作系统支持多线程,允许单个程序同时执行多个任务。
内存管理 分配和回收内存空间,实现虚拟内存机制,允许程序使用比物理内存更大的地址空间。
文件系统管理 提供文件存储、访问和组织的方法。例如,Windows的NTFS或Linux的ext4文件系统。
设备驱动与硬件抽象 通过设备驱动程序与硬件交互,为用户程序提供统一的硬件访问接口,隐藏硬件细节。
用户接口 提供命令行界面(CLI)或图形用户界面(GUI),方便用户与系统交互。例如,Windows的桌面环境或Linux的终端。
2,操作系统的类型:
单用户操作系统 一次仅支持一个用户操作,如早期的MS-DOS。
多用户操作系统 允许多个用户同时使用,如Unix或Linux服务器系统。
实时操作系统(RTOS) 严格响应时间要求,用于工业控制或航天系统。例如VxWorks。
分布式操作系统 管理多台计算机的资源,呈现为单一系统,如Google的Borg系统。
嵌入式操作系统 专为嵌入式设备设计,资源占用小。例如FreeRTOS或Android(用于移动设备)。
3,操作系统常见结构:
内核(Kernel) 操作系统的核心部分,直接与硬件交互,提供进程调度、内存管理等基础服务。分为宏内核(如Linux)和微内核(如QNX)。内核不是操作系统必须具备的结构。
系统调用(System Calls,系统API) 用户程序访问硬件资源的接口。例如,Linux的open()
或write()
系统调用。
// 示例:Linux系统调用写入文件
#include <unistd.h>
#include <fcntl.h>
int main() {
int fd = open("test.txt", O_WRONLY);
write(fd, "Hello OS", 8);
close(fd);
return 0;
}
Shell 命令行解释器,如Bash或Windows PowerShell、command,允许用户通过命令控制系统。
4,操作系统的设计目标:
- 可靠性:确保系统长时间稳定运行,避免崩溃。
- 高效性:优化资源使用,提升性能。
- 安全性:防止未授权访问,如用户权限管理。
- 可扩展性:支持新硬件或功能模块的添加。
5,操作系统开发预告:
我最近开始着手准备开发Honin(暂定名)操作系统,主要针对高性能需求场景,比如游戏、生产力等,由此制定了系统设计框架。目前设计为32位操作系统。
引导:
boot:负责加载Loader并且跳入执行,硬盘读写使用LBA28方式,在跳入Loader执行前关闭中断。
Loader:负责进入保护模式开启分段保护机制,并在此机制下使用LBA48方式读取内核,然后跳入内核执行。
kernel:完成有关性能和运行的的所有工作,将常用功能全部集成。
流程:
BIOS或UEFI→MBR→PBR(Boot)→Loader→Kernel→……
内核设计概述:
内核使用宏内核设计,将系统调用、内存管理、文件及IO管理、线程管理、进程管理集成,之间可以相互调用,处于0特权级。
系统调用:
为了继承Windows的大部分软件生态,系统调用分为两种。
原生系统调用:
这种调用是操作系统实现的一套独立的调用,具有原子性和便捷性(快速调用),可以快速陷入内核并进行相应处理。这将用来支持操作系统自生态的发展。
WinAPI-Map模拟调用:
这种调用是操作系统中内置的一组map程序来模拟的Windows API,用来将Windows API功能使用原生系统调用实现,并将API参数进行相应处理以适应本操作系统原生API的需求。由于这类API调用时需要经过Map程序模拟功能,因此调用处理速度相对于原生系统调用更慢。所支持的API版本号取决于内核API-Map版本。
内存管理:
核心理念是尽可能的将进程的数据放置于快速的内存中,而不是根据使用率而换入换出,只有在内存不足时才会进行换出(映射内存不换出)。内存管理照惯例使用分页机制,页均使用cache缓存机制(映射内存不使用)。同时为了提高页寻回速度,引入页换出表,节省不必要的计算消耗。
:………………………………目前介绍到这,之后再继续补充