将30天中txt文件的ascii字体像素数据转为binary插入elf格式的kernel中 将30天中的txt文件ascii字体像素数据转化为(8bits*16)byte array放入elf文件中 背景: 目前在基于elephant os上将30天的图形界面加入上来,但是30天的编译链是书作者写的,此方式是用gcc等实现,此处是处理256个ascii字体文件加入到kernel.bin中 方法:通过objcopy将二进制文件制作成.o文件 作者提供的hankaku.txt字体文件 将开 2021-04-24 编写操作系统之路 30天自制操作系统,操作系统真相还原
bochs上的一次调试 一次bochs上的调试 3个线程不断的打印,导致GP异常,我开始以为是线程同步问题,访问了25x80显存, 如何找到合适的断点?异常是在3个线程运行一段时候后才产生,那么线程产生附近的代码行的地址怎么得到呢? 比如找到thread_start函数地址, 查看链接出来的内核镜像的符号表直接显示出编译后的符号的虚拟地址, nm kernel.bin | grep thread_start 这一步 2021-04-05 编写操作系统之路 bochs
x86中断 中断分类外部中断: 按照是否宕机分为可屏蔽中断和不可屏蔽中断 内部中断: 按照中断是否正常,分为软中断和异常 外部中断 外部中断来自某一个外部硬件设备,所以也称为硬件中断 软件中断 由指令主动发起的中断, int 8bit立即数,支持256种中断 int3,调试断点指令,调试器fork子进程,将断点处的指令备份,替换为0xcc(int3指令的机器码),然后保存子进程的寄存器和相关内存单元 2021-03-27 X86实模式和保护模式 X86实模式和保护模式
att汇编格式 调用约定 cdecl调用方式: 参数从右往左入栈 调用者保存eax,ecx,edx寄存器,其余寄存器由被调用者(函数)来保存 函数返回值保存在eax寄存器中 内联汇编Intel和At&t的风格对比: 区别 Intel At&t 说明 寄存器 寄存器前有前缀% 操作数顺序 a<-b a->b 恰好相反 操作数字体指定大小 +数据类型用来修饰:b 2021-03-20 编写操作系统之路 gcc asm
x86特权级总结 特权级变换时栈如何变化cpu从低特权级代码段转移到高特权级代码段 栈从tss中读取到, 从高特权级代码段转移到低特权级代码段, 低特权级的栈指针可以从当前栈底部拿到(低->高转移时保存的) CPL和DPL对于受访问为数据段来说: 只要CPL<=DPL就可以访问到此数据段的内容 对于受访问为代码段来说: 只有相同特权级别才能访问,(高特权级代码段->低特权级代码段只有中断能做到,低 2021-03-15 X86实模式和保护模式 x86
gcc强引用弱引用 强符号和弱符号多个目标文件中含有相同名字全局符号的定义,那么这些目标文件链接的时候将会出现符号重复定义的错误.编译器默认函数和初始化了的全局变量为强符号(Strong Symbol),未初始化的全局变量为弱符号(Weak Symbol),强弱符号都是针对定义来说的,不是针对符号的引用(extern int ext); 链接器处理符号规则: 不允许强符号被多次定义(即不同的目标文件中不能有同名的强 2021-01-18 编译链接 gcc
Emacs第二部分:基本模式和编辑特性 Emacs第二部分:基本模式和编辑特性编辑模式模式可以划分为主要模式和次要模式. 主要模式规定了主要的编辑行为,并且仅应用于当前编辑会话中的缓冲区.在任何时刻,每个缓冲区都有且仅有一个活动的主要模式. 次要模式通常提供了一些与任何特定的主要模式无关的特性或功能.可以把它们看作用于控制这些特性的切换:使用其函数名来调用一个次要模式可以开启或关闭该模式,任何时候都可以开启多个次要模式 查看哪些模式是活 2021-01-16 Emacs Emacs
Emacs第一部分:所有基础知识 一个用来调用特定命令的Emacs组合键被称为一个键绑定,可自定义,Emacs有缺省的绑定 Emacs命令分为2大类, Ctrl Meta(Alt) Emacs符号中Ctrl写成C-后面是第二个按键对应的字符,例如Ctrl-X组合键写成C-X Meta按键被表示为M- Meta键常被帮顶到Alt键,通常可以使用Esc键完成一个Meta按键序列,与输入Ctrl按键序列不同,按下Esc,然后 2021-01-14 Emacs Emacs
移动语义 移动语义 Move Semantics 为了减少拷贝构造函数在堆上重新分配内存的时间,并且构造函数的参数是临时值, 使用右值引用来构造类,此构造函数的实现要把原来的资源指针设置为空nullptr,delete才不会出错 在Entity初始化列表中,声明了一个类型是右值引用的左值,所以要通过std::move()强行转化为右值引用, 也可以直接写强制类型转换(String&&) 然后 2021-01-14 C++primer读书笔记 c++
c++静态代码分析_函数参数求值顺序未定义等 追踪内存分配重载全局new和delete实现 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748#include "../src/include/local.h"#define ps(str) std::cout << str << 2021-01-11 C++primer读书笔记 c++17