- 博客(20)
- 收藏
- 关注
原创 aarch64-none-elf-gcc: Ubuntu arm裸机交叉编译器工具包安装
如果需要使用标准库提供的一些类型、宏定义,我这边的解决方法是去读源码,自己写一个简单的std.h库给项目使用,其实linux的很多宏最后展开都是简单的几条语句,类型也都是基本类型的重命名。整套工具库拉取过程如下所示,包含aarch64-none-elf-gcc、aarch64-none-elf-ar、aarch64-none-elf-as等一系列工具。交叉编译器的标准格式如上所示,aarch64-none-elf-gcc顾名思义,是用来编译arm64架构的无系统(裸机)elf文件格式的gcc编译器。
2025-12-09 23:28:38
109
原创 解决:fatal: 无法访问 ‘https://github.com/xxx‘:gnutls_handshake() failed: Error in the pull
忽然一直遇到这个问题,如果网上其他的解决方法无效,那大概率是网络问题,检查一下终端的网络连接,没开代理开个代理,开了代理的换个节点。
2025-11-17 23:25:46
105
原创 cargo build出现的虚拟内存重叠问题
研究了半天,感觉还是内存段分配不足导致的,尝试修改. = . + 0x4000;为. = . + 0xA000;后发现问题解决了,感觉有点神奇。在网上查阅资料未果,问gpt得到的答案是没有text段没对齐,但是用. = ALIGN(8);对齐了之后也是一样的问题。由于对系统理解较浅,暂不清楚具体原因。
2025-10-20 18:56:38
134
原创 Rust:edk2 runtime service driver
最近在尝试将一个rust系统软件迁移为edk2 runtime service为os提供运行时服务,但大多数uefi资料都是基于c语言的,将rust项目修改为c也不现实,固有此文章。第一篇资料可以查到库中的所有结构体和函数等,第二篇是构建rust uefi application的教程。
2025-10-09 14:28:03
295
原创 ARM and x86: Register and assembly
最近在做一个系统软件的移植,试图从x86架构下将其移植到arm架构下运行,阅读代码发现其启动过程使用了大量的x86汇编代码,由于之前并未上过汇编代码的课程,为深刻理解从x86到arm架构下的汇编代码移植,遂有此文章。
2025-09-18 00:51:35
911
原创 Ubuntu22.04 gcc版本切换 + 一些编译问题
最近在ubuntu22.04上编译一个项目,一直遇到一个问题“undefined reference to `TRAP_XX'”,最后猜测是gcc版本过高导致的编译问题手动下载gcc-7用update-alternatives管理和切换gcc如图,选择gcc-7对应编号gcc-v查看版本。
2025-09-05 01:13:30
381
原创 MIT 6.S081 Lab pgtbl: Page tables — Detecting which pages have been accessed
如果有系统学习过操作系统,尤其是考研的同学应该对访问位比较熟悉,虚存中的页面调度算法就有根据脏位和访问位来选择页面换入换出,如时钟置换算法(clock)。这道题的思想其实就是检查每个页面对应的pte中的访问位,最后将结果返回给用户空间,只是中间细节比较繁琐。只能说开始接触底层编程确实很不习惯,很多操作都不熟悉,还是得多练。riscv.h中添加PTE_A定义,查阅手册如下。sys_pgaccess函数实现。
2025-08-25 22:20:59
168
原创 MIT 6.S081 Lab pgtbl: Page tables — Print a page table
大致思路就是遍历每个pagetable的512个pte,用if判断当前pte指向下一级页表/实际物理地址/无效,如果指向下一级页表就递归调用函数并传递地址来遍历该页表,同时页表级数+1,如果指向实际物理地址就直接输出,如果无效就忽略该pte继续向下遍历。题目比较简单,主要是要清楚对pagetable和pte的操作,可以参考vm.c文件中的其他代码。exec.c extc函数添加代码。defs.h新增定义。
2025-08-25 19:13:52
174
原创 MIT 6.S081 Lab pgtbl: Page tables — Speed up system calls
题目的意思就是在创建进程的同时创建一个只读页面用于在用户进程和内核之间存储数据,这样某些系统调用就无需切换到内核态去获取数据,而是直接从该只读页面中获取,这样就节省了用户/内核状态切换带来的性能开销。比如题目所给的结构体usyscall,就可以在只读页面中存储pid,通过调用ugetpid系统调用来获取pid,无需getpid系统调用切换到内核态再读取pid并返回。进程结束时 freeproc()和proc_freepagetable()释放该页面。
2025-08-25 13:23:54
226
原创 MIT 6.S081 Lab2:Sysinfo
实现sysinfo系统调用,获取空闲内存和进程数,通过copyout传给用户程序。定义sysinfo系统调用,与上一道题方法一致。记得修改上一道题的数组,因为新增了一个系统调用。实现获取空闲内存的函数和获取进程数的函数。然后再defs.h中新增函数定义。
2025-08-20 23:54:59
208
原创 MIT 6.S081 Lab2:System call tracing
在kernel/proc.h的proc结构体中添加数组mask用来记录需要跟踪的系统调用号(22个系统调用,数组大小为23即可)。fork时传递mask给子进程,这是为了运行fork后的子进程(如例子中的grep)能够获取到mask。总体来说还是比较麻烦的,需要清楚系统调用的流程,尤其是syscall系统调用这一块,还有proc结构体。syscall执行系统调用时检查mask,如果与当前系统调用相匹配,则输出跟踪内容。用户程序trace执行系统调用exec,fork子进程执行新命令并追踪指定系统调用。
2025-08-20 17:36:46
159
原创 MIT 6.S081 Ubuntu 22.04 auto-gdb
在MIT6.S081实验中,通过在~/.gdbinit文件中添加项目路径并设置安全路径,可以简化xv6调试过程。具体步骤是:编辑.gdbinit文件,添加xv6-labs-2021项目路径,设置安全加载路径。之后直接运行gdb-multiarch命令即可自动连接调试端口,无需每次手动输入端口号,显著提高了xv6内核调试效率。这种方法适用于Ubuntu22.04系统下的xv6实验环境。
2025-07-18 00:23:04
175
原创 MIT 6.S081 Ubuntu 22.04 gdb debug
确保自己的机器上有gdb调试工具,如果没有就安装一下。随后在xv6-labs下开两个终端,一个运行。之后就可以开始gdb调试。
2025-07-17 23:55:13
202
原创 MIT 6.S081 Lab1:xargs
发现一个问题:在find函数的实现中我使用的是fprintf来输出,所以导致xargs调用脚本测试时无论如何都会有问题,使用网上通过测试的代码也一样,这是因为fprintf指定了数据输出的流,所以直接打印到了shell中,read(0,...)获取不到。左边命令会自动执行并把结果作为标准输入(文件描述符0),那xargs要做的就是获取标准输入的值,按行附加到右边的命令之后,并fork+exec逐个执行,然后等待子进程执行结束。关键在理解命令如何运行。
2025-07-13 23:28:31
143
原创 MIT 6.S081 Lab1:find
注意理解open、fstat、read函数的用法,stat、dirent等数据结构。注意理解ls的代码(大部分代码可直接复用),部分核心代码已经给出说明。
2025-07-12 23:00:11
133
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅