教育经历
长安大学 测绘工程 全日制本科学士 2010年9月至2014年7月
教育经历
长安大学 测绘工程 全日制本科学士 2010年9月至2014年7月
c(较熟悉),c#(较熟悉),x86汇编(可使用,可编写c内嵌汇编),c++(可阅读开源库源码)
shell脚本,gnu-ld链接脚本,cmake,makefile,偶尔使用python
linux内核源码调试(qemu/vmware + gdb-stub + vscode),windows窗体应用开发(c# + winform,visual studio平台),测绘行业数据处理算法开发(OpenCV、Gdal、PCL),个人os内核项目开发(c + x86汇编,gnu工具链,edk2启动加载器)
一月 2015 - 五月 2016
从事地籍测量外业工作
七月 2016 - 三月 2018
主要从事地形测量外业工作
三月 2018 - 现在
主要根据本单位生产工作需求开发行业软件
(2019年中 ~ 2020年底) 参考《一个64位操作系统的设计与实现》编写自己的操作系统内核,使用cmake构建项目;
(2020年底 ~ 至今) 以学习各种内核机制和移植主要机制为目的,调试Linux内核源码,目前调试6.6和6.11两个版本;
(2020年底 ~ 至今) 参考Linux内核源码(参考的版本如下),将上述学习过的模块、功能、机制修改简化并替换到自己编写的内核中:
linux5.17版本的:
简单的vfs,简单的mount功能,不支持namespace;
简单的devtmpfs,和基于此的设备文件管理;
linux6.6版本的:
memblock初始化、申请和释放物理内存(支持多种内存类型),不支持NUMA;
功能较完整的buddy物理页管理机制,不支持NUMA;
copy_process()核心逻辑(实现子功能copy_files、copy_fs、copy_mm、copy_thread、copy_signal、copy_sighand);
原子类型、叫号自旋锁和完成量;
linux6.11版本的:
功能基本完整的物理mmu相关页映射api,暂不支持对巨大页和swap的处理;
mmap()与通过双向链表管理的vm_area;
用户缺页异常处理,包括写时复制,懒加载,页高速缓存和基于此的文件io;
功能基本完整的percpu相关api和静态percpu变量声明/定义和访问,简易的动态percpu内存空间分配;
简易的workqueue机制;
(2023年底 ~ 至今) 移植linux内核机制:
linux2.6.39的printk机制主要功能,可以生成和打印系统日志;
linux6.6的tiny-slub以升级kmalloc机制和支持各内核机制使用的对象的kmem_cache方式分配内存;
linux6.6基本完整的execve()和load_elf_binary,支持用户空间传递参数和环境变量,可以加载通过开发平台(ubuntu22.04)上的工具链通过默认选项和编译链接脚本生成的elf静态链接可执行程序,但目前还无法支持动态链接器正常工作;
linux6.11支持pid_namespace的pid管理;
linux6.11单线程signal/sigaction、kill系统调用主要功能;
(2024年4月~9月)支持静态链接musl的c标准库的简易shell的加载运行。为达成此目标,完善mmap系统调用和handle_mm_fault中有关机制,增加(为了尽快支持所以没有参考linux,根据自己的理解实现)了文件的页高速缓存机制,实现了其他的一些程序启动过程使用的系统调用。
阅读uefi开发资料,阅读multiboot2规范,以edk2为基础实现了一个支持部分multiboot2 tag的uefi内核加载器,并为内核增加了multiboot2的header和tag以从加载器获取必要的启动参数;
阅读pcie和nvme硬件规范,参考一些个人开源项目实现了简单的nvme硬盘驱动;
阅读usb和xhci规范,尝试实现xhci主机驱动(暂停);
(2022年底 ~ 2023年中) 参考uboot、glibc实现了含少量系统调用和库函数的c库;实现了一个简单的initd进程可执行程序和一个简单的shell,使用gcc默认链接脚本生成即可由我的内核加载运行;
除上述通过阅读调试源码学习的内容外,还参阅知名linux内核书籍(linux2.4~2.6),学习了进程调度模块和调度策略、内存管理中的NUMA模型、其他IPC机制、内核模块、内核活动(软中断、tasklet、等待队列)、页缓存和块缓存、页面回收和页交换;