- 博客(40)
- 收藏
- 关注
原创 手写操作系统 - 40.绕过TSS切换特权级
摘要: x86系统通常依赖TSS(任务状态段)实现特权级切换(如Ring 3→Ring 0),但可通过手动管理堆栈和调用门绕过TSS。方法包括:1)手动堆栈切换:在用户态预分配内核栈,通过软中断触发切换后手动调整ESP;2)调用门:配置GDT中的调用门描述符,利用lcall指令自动完成特权级跳转和堆栈切换。需注意内核栈的安全管理及特权级校验。此方案适用于简化内核设计或优化上下文切换,但需谨慎处理寄存器状态和权限检查。(149字)
2025-08-13 08:44:23
981
原创 手写操作系统 - 39.缺页异常处理
本文介绍了x86处理器异常处理机制,重点解析了错误码格式及其字段含义。错误码包含段选择子索引、描述符表指示位、IDT标志和外部事件标志等关键信息,用于诊断异常原因。文章详细分析了通用保护异常(#GP)的触发条件,包括段选择器非法、特权级别违规、堆栈段问题和非法指令等情况。同时深入讲解了缺页异常(#PF)的错误码结构,包括页面存在标志、读写权限、用户/超级模式标志等字段。最后说明了CR2寄存器在缺页异常处理中的作用,该寄存器存储引发异常的线性地址,供操作系统进行页面加载或错误处理。这些机制共同构成了x86架构
2025-08-13 08:42:52
600
原创 手写操作系统 - 38.线程特权级
本文介绍了x86架构中的特权级控制机制,主要围绕CPL、RPL和DPL三个关键概念展开。CPL(当前特权级)表示正在执行的代码段权限级别(0-3级),RPL(请求特权级)是段选择子中指定的访问请求权限,DPL(描述符特权级)定义了段描述符的访问权限。只有当CPL和RPL都不低于DPL时,程序才能访问相应段,否则会触发保护异常。这三个特权级协同工作,确保系统资源的安全访问,实现内核与用户代码的隔离保护。
2025-08-13 08:39:57
703
原创 手写操作系统 - 37.分离内核任务
操作系统内核代码和内核线程的分离并不是一个硬性规则,而是一种设计上的选择。内核代码一旦完成以后所占用的空间相对固定,不需要进行拓展,因此适合放在低地址区域,而内核线程需要为用户进程提供服务功能(系统调用),因此所占用空间并不固定,所以适合放在高地址区域。现代通用操作系统(如 Linux 和 Windows)倾向于分离设计,因为它带来了更高的灵活性和可扩展性。将内核代码与内核线程分离的含义是:将内核中的静态逻辑(如硬件抽象、内存管理)与动态执行的任务(如 I/O 操作、守护进程)设计为独立的模块或结构。
2025-01-06 08:34:14
739
原创 手写操作系统 - 36.为任务分配页
修改CR3寄存器是为了切换页表,使得每个任务能够运行在独立的虚拟地址空间中,确保系统的安全性和稳定性。这种机制是现代操作系统内存管理和任务调度的核心之一。
2025-01-06 08:32:29
856
原创 手写操作系统 - 35.图解内存分页原理
这张图从启动过程到内核加载,再到分页机制和地址映射,全面描述了操作系统的内存管理和分页实现细节,重点是基于保护模式下的内存布局和页表管理机制的设计与实现。
2024-12-24 10:21:57
974
原创 手写操作系统 - 34.32bit-4KByte分页实现
在计算机科学中,.bss.data.rodata和.text是可执行文件或内存布局中的几个重要段名,它们被用来存储不同类型的程序数据。段名存储内容是否可修改是否初始化是否占用文件空间.bss未初始化的全局/静态变量是否否.data已初始化的全局/静态变量是是是.rodata只读数据(如字符串常量)否是是.text程序的机器指令(代码)否是。
2024-12-24 10:20:23
862
原创 手写操作系统 - 33.32bit-4MByte分页实现
注: 实模式使用的内存使用4M分页, 开启分页机制后需要将1MB以内的内存按照物理内存地址进行映射, 这样才能保证物理地址和虚拟地址的一致性。
2024-12-23 09:34:17
253
原创 手写操作系统 - 32.内存分页
这种模式通常称为大页(Large Page)或巨页(Huge Page)。每个页的大小为4MB(即2^22字节),适用于需要大量连续内存空间的应用,如数据库、大型计算或图形处理。这种模式是标准的分页方式,每个页的大小为4KB。它通常用于现代操作系统的内存管理,提供细粒度的内存分配。4-KByte分页机制可以高效地映射大量的虚拟地址空间。CR4寄存器有32位,每一位的功能是用来启用或禁用特定的硬件特性。接下来的课程我们会从简单(4-MByte Mode)到困难(4-KByte Mode)来实现内存分页。
2024-12-23 09:32:22
1212
原创 手写操作系统 - 31.虚拟内存
当物理内存不足时,操作系统通过交换(swapping)或分页(paging)将不常用的数据暂时存储到磁盘的交换文件(swap file)或分页文件(page file)中,提供虚拟地址空间的扩展。:现代的MMU通常使用分页机制,将虚拟内存划分为固定大小的块(页,通常是4KB),并将物理内存也划分为同样大小的块(页框)。:与分页不同,段机制将内存划分为多个不同大小的段(如代码段、数据段、堆栈段等),每个段有不同的基地址和长度。:虚拟地址中的低位部分,用于标识虚拟页内的具体位置,即该页内的偏移量。
2024-12-19 16:01:08
1127
原创 手写操作系统 - 30.位图
位图(Bitmap)是一种简单且高效的存储和操作大量布尔值(0或1)数据的结构。它利用位(bit)作为最小存储单元,通过压缩表示法节省内存并支持快速的操作。位图是一种将数据存储为二进制位(0或1)序列的结构,用于高效地表示和操作集合或布尔值。每个位的位置表示一个元素的状态,比如存在或不存在、是或否等。
2024-12-19 15:58:45
686
原创 手写操作系统 - 29.互斥量
互斥量是一种同步原语,用于限制多个线程同时访问共享资源。它保证任何时刻只有一个线程可以持有互斥量锁,从而实现对资源的独占访问。来保证多线程环境下对共享资源的访问互斥,防止数据竞争和不一致问题。的,以防止多个线程同时修改互斥量的状态。这通常是通过底层硬件支持的原子指令(如。一些互斥量允许同一个线程多次加锁(递归锁),但需要对应解锁次数才能完全释放。互斥量(Mutex, Mutual Exclusion)的原理是通过。加锁和解锁操作必须是。
2024-12-18 09:35:03
401
原创 手写操作系统 - 28.信号量
信号量通过计数器和等待队列机制,结合硬件支持的原子操作,实现了进程间或线程间的高效同步和资源管理。然而,合理设计和正确使用信号量对避免死锁、优先级反转等问题至关重要。
2024-12-18 09:33:34
823
原创 手写操作系统 - 27.线程睡眠
这种基于列表的任务管理结构实现了任务的高效切换与睡眠管理,避免了睡眠任务占用 CPU 时间,同时使调度更加灵活和可控。根据上传的图片内容,以下是。
2024-12-17 14:05:39
429
原创 手写操作系统 - 26.时间片轮询
时间片轮询是一种常见的任务调度方法,特别是在多任务操作系统中,用于实现任务之间的公平调度。时间片轮询是现代操作系统中经典的调度机制,虽然简单,但在一些特定场景下仍然被广泛使用。
2024-12-13 09:23:18
869
原创 手写操作系统 - 25.线程让步
任务列表(task_list存储任务的完整数据。就绪列表(ready_list调度中按顺序排列的任务。通过任务切换和重新排序确保任务的公平性和资源利用效率。
2024-12-13 09:21:18
521
原创 手写操作系统 - 24.链表结构
链表(Linked List)是一种常见的数据结构,由一组节点组成,每个节点通过指针或引用指向下一个节点。链表的主要特性是节点在内存中不必是连续存储的,插入和删除操作效率较高,但随机访问效率较低。链表头通常是一个特殊的节点(称为头节点),用于标识链表的起点。
2024-12-13 09:19:18
881
原创 手写操作系统 - 21.手动栈线程切换
ABI(Application Binary Interface,应用二进制接口) 是软件开发中的一个重要概念,它定义了应用程序在二进制级别与操作系统或其他程序之间的交互规则。ABI的主要目标是确保一个程序编译后生成的二进制文件可以在某个平台上正确运行,并与其他二进制文件或操作系统库无缝协作。通俗来讲就是手动构造一个栈帧,手动完成栈空间的跳转。它是程序运行时的协议,与程序源代码无关。
2024-12-11 11:24:15
231
原创 手写操作系统 - 20.TSS线程切换
TSS(Task State Segment)是x86架构处理器中一种特殊的数据结构,用于保存任务(Task)运行时的状态信息。它是Intel处理器在硬件层面支持任务切换的核心机制,通过记录任务上下文(如寄存器状态、段选择子等),实现从一个任务切换到另一个任务的快速操作。
2024-12-11 11:13:43
874
原创 手写操作系统 - 19.内核线程
线程(Thread)是计算机科学中一种程序执行的基本单位,它可以看作是比进程更小的运行单元。一个进程可以包含多个线程,线程之间共享同一个进程的资源,例如内存空间和文件句柄,但每个线程都有自己的寄存器和堆栈。线程的特点轻量级相较于进程,线程的创建和销毁开销较小。线程切换速度快,因为它们共享进程的资源。资源共享同一进程中的线程共享内存空间、打开的文件等资源,这使得线程之间的通信更加高效。共享资源也带来了同步和竞争的问题。独立性每个线程有自己的栈、程序计数器(PC)和寄存器。线程与进程的比较特性。
2024-12-10 08:45:52
494
原创 手写操作系统 - 17.系统时间
理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时(也就是在格林尼治上空最高点时)的时间。由于地球在它的椭圆轨道里的运动速度不均匀,这个时刻可能与实际的太阳时有误差,最大误差达16分钟。世界标准时间(Coordinated Universal Time)是最主要的世界时间标准,其以原子时秒长为基础,在时刻上尽量接近于格林尼治标准时间。格林尼治平时(Greenwich Mean Time)是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。
2024-12-10 08:42:16
433
原创 手写操作系统 - 23.图解内核任务切换【手动栈】
这张图片展示了一个基于堆栈操作的任务切换过程,主要使用了汇编语言实现。通过这种方式,简单地实现了任务之间的上下文切换,这种方法常用于嵌入式系统或简单的实时操作系统中。任务切换的目标是保存当前任务的上下文(寄存器、堆栈等),并恢复目标任务的上下文。中读取目标任务的堆栈指针,并将其加载到。,从而保存当前任务的上下文。,这一步切换了堆栈指向。将当前任务的堆栈指针。
2024-12-09 09:04:06
888
原创 手写操作系统 - 22.图解内核任务切换【TSS】
这是一张关于任务状态段(TSS)切换过程的图解,分为多个部分来描述任务初始化和任务切换的过程。
2024-12-09 09:03:03
689
原创 手写操作系统 - 15.实时时钟中断
CMOS” 是一种非常低功耗的静态内存,位于与实时钟(RTC)相同的芯片上。CMOS(和实时钟)只能通过IO端口0x70和0x71访问。CMOS内存的功能是在计算机关闭时存储50(或114)字节的BIOS “设置” 信息——因为有一个单独的电池保持时钟和CMOS信息的活跃。CMOS 值是逐字节访问的,每个字节都是单独可寻址的。实际上,CMOS 中唯一真正有用的寄存器是实时时钟寄存器和寄存器 0x10。CMOS 中的所有其他寄存器几乎完全过时(或未标准化),因此是无用的。
2024-12-09 08:47:26
602
原创 手写操作系统 - 14.串口重定向
由于串口连接外设的使用在很大程度上被USB和其他现代外设接口所取代,但在某些行业中,它仍然常用于与工业硬件(如CNC机床)或商业设备(如POS终端)进行接口。历史上,许多拨号调制解调器通常通过计算机的串口连接,而底层UART硬件的设计本身也反映了这一点。操作系统开发者通常使用系统的串口进行调试,因为它们不需要复杂的硬件设置,并且在操作系统初始化的早期阶段传输信息非常有用。许多模拟器,如QEMU和Bochs,允许将串行输出重定向到标准输入或主机计算机上的文件。
2024-12-09 08:46:10
545
原创 手写操作系统 - 13.定时计数器中断
8253芯片是可编程计数器/定时器。这种芯片外形引脚都是兼容性的。8253内部有三个计数器,分别称为计数器0、计数器1和计数器2,他们的结构完全相同。
2024-12-09 08:43:53
205
原创 手写操作系统 - 12.外中断
向 PIC 芯片发出的最常见命令可能是中断结束 (EOI) 命令(代码 0x20)。这是在基于 IRQ 的中断例程结束时向 PIC 芯片发出的。如果 IRQ 来自主 PIC,则只需向主 PIC 发出此命令即可;但是,如果 IRQ 来自从 PIC,则需要向两个 PIC 芯片发出命令。
2024-12-06 08:42:31
1103
原创 手写操作系统 - 8.ELF文件格式
16/*ELF的一些标识信息,固定值*//* 目标文件类型:1-可重定位文件,2-可执行文件,3-共享目标文件等 *//* 文件的目标体系结构类型:3-intel 80386 *//* 目标文件版本:1-当前版本 *//* 程序入口的虚拟地址,如果没有入口,可为0 *//* 程序头表(segment header table)的偏移量,如果没有,可为0 *//* 节区头表(section header table)的偏移量,没有可为0 */
2024-12-05 08:26:44
408
原创 手写操作系统 - 6.全局描述符
段描述符是位于GDT( Global Descriptor Table, GDT )或LDT( Local Descriptor Table, LDT )中8字节大小的表项,用来描述内存段的属性。全局描述符表存放在内存中,需要用专门的寄存器(GDTR,GDT Register)指向它(GDT )后,CPU 才知道它的位置。由于 GDT 的大小是 16 位,每个描述符大小是8字节,故,GDT中最多可容纳的描述符数量是65536/8=8192个,即 GDT 中可容纳 8192 个段或门。
2024-12-04 16:51:11
1247
原创 手写操作系统 - 3.读取扇区
由于INT13的限制,三维地址C/H/S的最大值只能为1024/16/63,其次,在系统管理文件时记录繁琐的C/H/S也很吃力,效率较低,使用逻辑扇区后,可在硬盘读写操作时脱离柱面,磁头等硬件参数的制约。CHS寻址模式将硬盘划分为磁头(Heads)、柱面(Cylinder)、扇区(Sector),每个磁头对应一个盘面,每个柱面由一组磁头组成,每个扇区由一个磁道组成。硬盘被分为多个柱面,每个柱面由多个磁道组成。LBA是非常单纯的一种定址模式,它将硬盘的柱面号、磁头号、扇区号全部转换为线性地址,然后直接使用。
2024-12-03 08:43:37
954
原创 手写操作系统 - 2.引导扇区
在16位实模式下,CPU启动时会从0xFFFF0地址开始执行,这个地址对应的物理地址是1MB的上方。也称为 AMD64 或 Intel 64,是一种 64 位的处理器架构,最初由 AMD 开发,后来被 Intel 采用。这个约定已经成为标准,许多操作系统和引导程序都遵循这个约定,因此使用0x7C00作为引导扇区的加载地址可以确保兼容性。是一个广义术语,通常用于指代所有基于 Intel 8086 架构的处理器,包括从 16 位到 32 位的处理器。指的是 Intel 80386 处理器及其后续兼容处理器。
2024-12-03 08:41:07
330
原创 手写操作系统 -1.前言
BIOS(基本输入输出系统)开始执行自检程序(Power-On Self Test),检查硬件组件(如内存、CPU、显卡等)是否正常。引导程序可以是简单的引导加载器(如 GRUB)或更复杂的引导管理器。对于传统的 BIOS 系统,引导程序通常位于硬盘的第一个扇区(0x7C00)。操作系统完成启动后,用户界面(如登录屏幕或桌面环境)会被加载并显示,用户可以开始与计算机进行交互。BIOS 会将引导扇区的内容加载到内存中,并将控制权转交给引导程序。引导加载程序从磁盘中加载操作系统内核到内存中,并进行初始化设置。
2024-12-03 08:40:18
1395
18种RAG技术综合评分
2025-09-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅