ucore实验1
本篇文章开始记录一些ucore的学习例程,以nku的2024实验作业为例
myblog:https://moyingxing.github.io/
参考链接OpenSBI,bin,ELF · GitBook (mobisys.cc)
https://riscv.org/wp-content/uploads/2017/05/riscv-privileged-v1.10.pdf
https://tinylab.org/riscv-uefi-part1/
OpenSBI,bin,ELF · GitBook (mobisys.cc)
环境配置os:wsl ubuntu22.04
gcc(交叉编译器手动编译):13.2.0
qemu:QEMU emulator version 6.2.0 (Debian 1:6.2+dfsg-2ubuntu6.22)
代码资源:OS Labs (mobisys.cc)
前置基础
因为本实验是以riscv-64位基础架构开发的os,因此需要理解此架构提供的一些硬件资源(如寄存器等等)和一些资源管理模式(第一感觉类似于x86架构下的GDT,LDT,IDT之类), ...
riscv指令
https://riscv.org/wp-content/uploads/2017/05/riscv-spec-v2.2.pdf
1.异常中断与陷阱我们使用术语“异常(exception)”来指代在当前RISC-V线程中,与指令运行时相关联的非正常情况。我们使用术语“陷阱(trap)”来指代因RISC-V线程中发生的异常情况而引发的同步控制转移至陷阱处理程序。陷阱处理程序通常在更加特权的环境中执行。
我们使用术语“中断(interrupt)”来指代一个与当前RISC-V线程异步发生的外部事件。当必须处理的中断发生时,某条指令会被选中接收到中断异常,随后引发陷阱。
接下来的章节描述了在执行过程中会引发异常的条件。这些条件如何转变为陷阱取决于执行环境,尽管大多数情况下,当发生异常时,系统通常会引发精确陷阱(precise trap)(除了标准浮点扩展中的浮点异常,这种异常不会引发陷阱)。
就像实验里看到的那样,异常是强制处理的,而中断是可控的,他们都会陷入(trap)处理程序
2.base integer subset
3.instruction format
总体分为四种
四种核 ...
riscv之中断
发现想要真正理解内核的权限切换以及中断处理是绕不过这东西的,因此现在开始学习M态的一些知识,也就是一些csr和一些指令,还有一些内存管理的东西。
chatgpt总结:
Machine-level CSRS这段内容详细描述了 RISC-V 中的 misa CSR(机器级 ISA 寄存器),以及它的作用、字段含义和编码方式。以下是详细的翻译与讲解。
3.1 机器级 CSR(Machine-Level CSRs)除了本节描述的机器级 CSR 外,M 模式的代码可以访问所有较低特权级别的 CSR。
解释:RISC-V 允许 M 模式的代码访问所有其他较低特权级别(S 模式、U 模式)的控制和状态寄存器。
3.1.1 机器 ISA 寄存器(misa)misa CSR 是一个 XLEN 位的 WARL(Write Any Read Legal)寄存器,报告当前 hart 支持的 ISA(指令集架构)。此寄存器在任何实现中都必须是可读的,但可以返回一个值为零来表示 misa 寄存器尚未实现,这时 CPU 功能可能通过其它非标准机制来确定。
解释:misa 寄存器用于确定处理器所支持的指令集结 ...
x86-64内联汇编
总结:https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/Using-Assembly-Language-with-C.html
分类基本的 asm 语句:这是没有操作数的汇编语句(参见 Basic Asm - Assembler Instructions Without Operands)。它用于直接插入汇编代码,而不需要与 C 代码中的变量或表达式进行交互。
扩展的 asm 语句:这种语句包括一个或多个操作数(参见 Extended Asm - Assembler Instructions with C Expression Operands)。扩展形式允许你将 C 语言中的表达式与汇编代码进行混合使用,使得在一个函数中可以更好地结合 C 语言和汇编语言。这种形式通常是更优选的。
basic_asm形式
因为gcc扩展的原因,做好写为:__asm__的形式
qualifiers:The optional volatile qualifier has no effect. All basic asm blocks are implicitly ...
x86-64-task模型
本篇文章描述了本人学习架构层级的任务模型的过程,所谓操作系统就是根据底层硬件所提供的硬件资源以及数据结构来进行高效的资源管理以及状态转换,因此想学好操作系统需要学好汇编(本人粗浅理解),但是进程管理这一块os的权限比较大,可以不管硬件提供的一些机制,来进行完全由软件进行的任务切换机制,但是os本身也是一个task因此硬件至少提供一次的任务管理。
x86-64存储模型
总览system register(硬件基础,寄存器是计算机硬件的一个抽象,体系结构的思想)
CR:用于控制系统的重要行为,例如分页分段之类
System-Flags Register:一些标志位,进入内核态时需要保存
Descriptor-Table Registers:指向一些描述内存的数据结构
Task- Reg : 包含任务状态段的位置以及大小
Debug Registers:控制软件调试
Extended-Feature-Enable Register:EFER寄存器用于启用和报告非由CRn控制寄存器控制的特殊功能的状态。特别是,EFER被用于控制长模式的激活。
System-Configuration Register:启用和配置系统总线功能。
System-Linkage Registers:这些寄存器被系统链接指令用于指定操作系统入口点、堆栈位置和指向系统数据结构的指针。(可以看出若陷入os,其作用及其重要)
Memory-Typing Registers:目前没见过用法
Debug-Extension Registers:debug扩展
Performance-Mon ...
PE文件结构
参考链接https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-image_nt_headers64
https://www.cnblogs.com/Hekeats-L/p/17997054
《逆向工程核心原理》
https://chatgpt.com/c/66dc593d-c970-8013-8cae-88fcd3d98948
DOS HEADER
兼容老版本
DOS STUBDOS stub 是一种嵌入在 Windows 可执行文件(PE 文件)中的小程序,主要用于在 DOS 环境下运行这些文件时提供提示信息。它的主要作用可以概括为以下几点:
兼容性:在 16 位 DOS 系统中运行 32 位或 64 位的 Windows 可执行文件(PE 文件)时,DOS stub 提供一个简单的提示,告知用户此文件不能在 DOS 环境下运行。通常会显示类似于 This program cannot be run in DOS mode 的信息。
历史原因:DOS stub 起源于早期的 Windows 系统,当 ...
house of apple
参考文章地址:https://bbs.kanxue.com/thread-273418.htm
APPLE1前置_IO_wstrnfile &_IO_wide_data
重点知道overflow_buf的位置。
typedef struct{ _IO_strfile f; /* This is used for the characters which do not fit in the buffer provided by the user. */ wchar_t overflow_buf[64];} _IO_wstrnfile;------------typedef struct _IO_strfile_{ struct _IO_streambuf _sbf; struct _IO_str_fields _s;} _IO_strfile;------------struct _IO_str_fields{ /* These members are preserved for ABI compati ...
POC for Houseoforange
原理
具体调用链和条件,可看:https://bbs.kanxue.com/thread-280167.htm
demo
glibc2.23,无跳表检查。
条件:1.可溢出修改topchunk的size字段
2.可溢出修改已经放入到unsortedbin中的链表
基本思想:将iolist链表的起始地址从stdeer转换为unsortedbin的地址,则及那个unsortedbin当成stdeer,构造其chain字段,指向一个fake的io结构体,而chain字段按偏移量来算恰好为smallbin[5],也就是装0x60-0x70的大小的chunk的bin,因此需要将top的头伪造成0x61,伪造好所有结构体之后,申请一个大的chunk(大于unsortedbin中的否则则会split),然后top则会被装入smallbin,也就是说可以实现chain指向top头。
top[0]=”\bin\sh”;writebase<writeptr=writeend;vtable指向top中的一块已经构造好的地方。
/*gcc-7 -c houseoforange.c ...