自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 收藏
  • 关注

原创 01 - DPL,CPL,RPL的权限检查整理

RPL相当于DPL的一个大门,来拦截非法访问,有公式 max(CPL, RPL) <= DPL,我们人为设计了一道大门,当mov ds,ax加载成功了,我们就可以访问零环代码段的数据,但是在这之前必须经过段选择子,如下,有下面四种情况。比如我们要进入零环,此时ds的值要改为零环,有这个汇编代码 "mov ds, ax(零环的段选择子)",此时就要来进行相关权限检查,如果权限检查通过,就加载段描述符表。③ 这种情况是不可能发生的,三环的权限来请求零环的代码,这当然是不可能的。

2024-06-11 09:23:04 251

原创 00-boot.asm的代码解读

每个模块的前两个字节是该模块的大小,我们org - 2,然后定义一个dw数据,后面才是函数的入口地址,代码如下,很好理解。3)跳转到 SETUP_SEG。

2024-06-11 08:08:24 186

原创 Linux 0.11 源码阅读 1 -- syscall的调用实现

前言 在main.c函数中,存在两个函数 fork.c pause.c,当我们尝试单步跟进去之后,却发现失败了,我们来分析其原因。void main(void) /* This really IS void, no error here. */{ .... if (!fork()) { /* we count on this going ok */ init(); } for(;;) pause();} _syscall0(type,...

2021-08-28 11:15:12 711 1

原创 ELF编译链接过程中有关信息(暂时整理笔记,日后详细补充)

之前搞Windows相关的只看过PE文件,现在暂时记录一下ELF相关信息,之后发布详细补充。ELF文件的构成 ELF header .init .text (代码段) .rodata (只读数据段,存储字符串,static等变量) .data (正常初始化的变量) .bss (未初始化的变量) 符号表信息 - 符号表、重定位表 - 这些表是可重定位目标文件必须的section - ...

2021-08-18 22:00:16 248

原创 GCC预处理过程

预处理过程 1. 头文件展开 2. 宏展开 3. 条件编译 4. 删除注释 5. 添加行号和文件名标识 6. 保留 #pragma 命令#pragma预处理命令用途 - 设定编译器状态; - 指示编译器完成一系列特定的动作;使用格式 #pragma pack([n]) 指示结构体和联合成员的对齐方式 #pragma...

2021-08-15 20:19:48 410

原创 gcc有关编译选项

gcc编译选项gcc - E 只预处理,并不编译,汇编或链接。gcc - C 预处理时,不删除汇编文件gcc -s 生成汇编文件(反汇编形式)gcc -S 生成二进制汇编文件gcc -c 将源文件编译成目标文件,但是不链接gcc -o 输出目标文件gcc -M 生成关联依赖,但是将输出导入到.d文件里面gcc -MM 生成文件关联依赖关系,但忽略#include<file.h>产生的依赖关系gcc -g 编译时产生调试信息gcc -static 禁止使用动

2021-08-15 20:13:58 162

原创 Bochs源码分析 - 28:bochs开启x2apic与SMP编译说明

前言 我们现在来根据《x86/x64体系探索及编程》的第十七章分析apic结构,第一个实验就是检测local apic与x2apic,但是现在bochs最新版本配置文件有些变动,需要添加有关配置属性才能开启,为解决这个问题分析了好久(主要是方向找错了)。开启x2apic 在bochs的配置文件bochsrc.bxrc中添加下面这行配置文件,即可开启,否则按照原来的配置文件检测无效。cpuid: apic=x2apic 运行结果如下所示,可以...

2021-08-15 12:24:02 788

原创 Bochs源码分析 - 27:8259中的SMM模式介绍

前言 SMM,全称为 Special Mask Mode,特殊掩码模式。在一般情况下(普通的Mask Mode),IRQ的中断请求得到响应执行,ISR相应位置位,在中断服务发起EOI命令前,ISR的位不会清位,8259会抑制优先级低的IRQ。 然而,在开启ESMM模式中,其允许在中断服务例程里动态依据IMR及IRR来响应中断请求,而不需要例会ISR。代码分析 在《x86/x64体系探索及编程》的ex17-2中实现了这个,简单分析一下代码吧。...

2021-08-09 21:09:49 440

原创 Bochs源码分析 - 26:8259中断控制器介绍

前言 现在我们跟着《x86/x64体系探索及编程》来分析17章内容 -- 8259中断控制器。这个是涉及硬件的,很遗憾,除了大学期间使用STM32搞过一个计算器,其余就没多少硬件编程经验,我在淘宝上找了下大概是这个东东。https://pdos.csail.mit.edu/6.828/2010/readings/hardware/8259A.pdf上面是8259A的芯片手册,里面讲的还是挺详细的,虽然里面很多东西还是看不太懂,但是结合着《x86/...

2021-08-08 19:02:25 690

原创 Bochs源码分析 - 25:关于内存寄存器及属性有关机制说明

前言 之前我们一直没有介绍与内存相关的寄存器以及页项中的各个属性位及其影响,现在我们写这篇文章来分析一下有关机制。CR0.PGPaging (bit 31 of CR0) — Enables paging when set; disables paging when clear. When paging is disabled, all linear addresses are treated as physical addresses. The PG fla...

2021-08-07 16:57:41 273

原创 Bochs源码分析 - 24:bochs对Non-PAE-4K页的实现代码

前言 我们现在在构建好分页模式的基础上,来通过对mov指令的分析来实现对bochs的Non-PAE-4K分页机制的分析,在分析过程中,我们会看到关于对页属性的各种检查,之后再来总结。 注意,其中可能涉及缓存部分(TLB),这个我们决定放在后面分析,因此如果遇到TLB信息,我们暂且跳过,不做过多解读。反汇编定位代码 我们现在先将ex11-2/protected.asm中测试二的代码注释掉,为分析直观,将mov[xx],0 改为 mov[xx],4....

2021-08-07 12:39:55 263

原创 Bochs源码分析 - 23:页表构建的汇编分析

前言 上一篇文章,我们使用C++来简单模拟了分页机制,现在我们来看汇编代码,看看其如何来构建汇编代码的,这里如果新手可能会犯糊涂,很久之前我被这份代码搞晕了好久,现在来一起解释一下。页表构建代码分析 代码如下,在《x86/x64体系探索及编程》的ex11-2\protected.asm中,来负责初始化页表。;---------------------------------------------; init_32bit_paging(): 建立 32-b...

2021-08-06 21:34:33 279

原创 Bochs源码分析 - 22:代码模拟内存分页机制

前言 我们现在来分析bochs对于x86架构下的分页机制的实现,注意我们重点是来分析bochs源码,分析其缓存机制,物理页面的实现,而关于x86分页机制我们可能不会过多讲解。

2021-08-06 20:27:51 217

原创 Bochs源码分析 - 21:x86架构的三种分页模式

前言 其实在学Windows内核时,仅知道两种分页模式,2-9-9-12,10-10-12 分页模式,其了解过还有其他模式但是平常用的很少,印象也就不深刻了。现在要写这篇文章,结合《intel手册》与《x86/x64编程体系探索》这两本书,我们来总结x86架构下的三种分页模式。 x86下分为三种分页模式:Non-PAE模式、PAE模式、IA-32e模式。我们现在先来依次分析这三种模式,之后再来对比与总结。Non-PAE模式 所谓Non-PAE模式...

2021-08-06 20:04:53 427

原创 Bochs源码分析 - 20: 开启保护模式

前言 在邓志老师的《x86/x64体系探索及编程》中讲述了开启保护模式的顺序,我尝试着翻阅intel手册,但很遗憾似乎自己没有找到对此的描述(应该是有的,但是自己没找到,日后找到了会补充上)。 ---> 补充:在intel卷三 9.8 9.9 对保护模式初始化有讲述,查找cr0寄存器时从手册上看到的。 我们这篇文章来分析其如何初始化保护模式,着重来分析代码,可能不会来分析bochs源码。开启保护模式 在开启保护模式之前,必须建立一个完整的保...

2021-08-01 19:36:31 471

原创 Bochs源码分析 - 19:分析Bochs对于bound,into的实现

前言 在《x86/x64体系探索及编程》的ex10-7代码中,使用了int3,bound,into来加载CS寄存器。我们现在来尝试分析bochs对于这几条指令的实现。into指令分析 关于into以及处理OF异常的代码如下,比较好理解。into指令只是判断eflag的of位,这位标志着是否存在溢出发生,如果存在溢出,则触发OF异常。;; 测试 INTO 指令 mov eax, 0x80000000 mov ebx, eax...

2021-07-29 16:16:56 601

原创 Bochs源码分析 - 18:分析Bochs对于iret指令的实现

前言 上篇我们分析了bochs对于int产生的interrupt事件的模拟处理流程,只是我们还没看看其返回如何实现的,我们这篇文章来分析一下。 虽然源代码还没看,但我估计这篇文章有点短,昨晚失眠到两点多,今天早上还是七点起来,中午竟然睡不着,我人麻了,早写完回家洗个澡休息。bochs-dbg定位 这个之间按上篇文章 int 指令往前jmp几条指令后就很容易看见,不用ida来逆向分析了,因为其还要逆向lib32库挺麻烦的。代码分析 ...

2021-07-27 18:57:28 337

原创 Bochs源码分析 - 17:分析Bochs对于int指令的实现

前言 在《x86/x64编程体系探索及编程》的第207页,其举了一个使用中断服务例程的例子,我们现在来分析其源码以及探究bochs是如何实现的(重点探究int指令)。代码分析 其首先设置好调用set_user_interrupt_handler来调用中断向量,内容如下: mov esi, SYSTEM_SERVICE_VECTOR // 0x40 mov edi, system_service // lib ...

2021-07-27 12:27:36 423

原创 Bochs源码分析 - 16:conforming与non-conforming代码段区别以及Bochs代码的实现

前言 之前在学习x86架构时,在代码段中有一个点让我感到困惑,就是type field 11位。这个之前一直似懂非懂,说不理解吧知道这么个玩意,说理解吧又不知道其具体干嘛,感觉是方便系统调用加快速度,尤其当遇到权限问题,自己就糊里糊涂,这篇文章让自己彻底分析明白这个问题。Intel手册说明 下面来引用intel手册中对这问题的描述(卷三 3.4.5.1节)Code segments can be either conforming or no...

2021-07-26 22:09:31 339

原创 Bochs源码分析 - 15:bochs对于call far(tss_sel)指令的实现机制

前言 所谓“保护模式”,重点是“保护”,可保护的是什么呢?答案是:内存中的数据与代码。有几种保护手段呢?段保护与页保护。这篇文章我尝试结合intel手册来重新梳理一下intel保护模式中的段保护有关机制。保护模式的两种保护机制The memory management facilities of the IA-32 architecture are divided into two parts: segmentation and paging. Segmentat...

2021-07-24 21:25:14 481

原创 Bochs源码分析 - 14:bochs关于实地址模式下IVT表的管理

前言 这篇文章对应着邓志老师的《x86/x64体系探索及编程》的第八章,讲述的是实模式,实模式一个是寻址方式不同,另外一个是IVT(Interrupt Vector Table)。我们这篇文章着重分析intel指令的有关实现机制。四个内存管理寄存器 在Intel卷三 2.4 节中,介绍了四个内存管理的寄存器,这里的内存管理指的是段式内存,分段的内存管理,而不是页式内存管理。同时intel提供了一些指令来管理这些寄存器中的数据,感兴趣可以查阅手册了解更多详情。...

2021-07-24 10:37:34 413 1

原创 Bochs源码分析 - 13:结合intel手册尝试分析CLI指令的实现

前言 上篇文章我们讲了如何调试bochs的cpu代码,这篇文章我们尝试结合intel手册来一起研究一下其cpu代码的实现。定位到cli指令的代码 还是利用ext3-2中的代码,其0x7c00处的指令是cli,利用ph 0x7c00定位到该指令处。然后在vscode中设置断点,单步进入“BX_CPU_CALL_METHOD(i->execute1, (i));”函数中,代码如下。void BX_CPP_AttrRegparmN(1) BX_CPU_C::...

2021-07-21 21:37:15 260

原创 Bochs源码分析 - 12:这才是真正的调试姿势!!

前言 之前我们为了正确的调试bochs,采用了很多方法,一种是利用IDA进行调试,第二种是采用bochs-dbg配合调试,第三种是在cpu_loop(..)中下循环来进行调试。这三种来实际操作中都很不方便。真正的调试姿势 IDA以二进制模式分别以0x7c00,0x8000-2为偏移打开uboot.bin与setup.bin文件,静态分析;配置调试模式编译bochs,精确下断点定位指令;再通过visual studio 在cpu_loop(..)函数中下软件断点分析指令...

2021-07-20 22:42:07 418

原创 Bochs源码分析 - 11:《X86探索及编程》代码初步解释

前言 现在我们来阅读邓志老师的《x86/x64体系探索及编程》,边阅读边将其代码放到bochs中运行,然后观察bochs的CPU是如何来模拟的。现在我们来详细分析ex3-2目录里面的内容。boot.asm 代码解读 自己在工作中经常看汇编代码,但是写汇编代码真的很少写过,我们现在一边分析着这段boot汇编代码一边回顾其如何编写。; Int 19h 加载 sector 0 (MBR) 进入 BOOT_SEG 段, BOOT_SEG 定义为 0x7c00 ...

2021-07-19 21:32:16 769

原创 Bochs源码分析 - 10: BX_NEXT_INSTR宏指令修改的错误

前言 还记得我们在八篇文章中为了禁止CPU递归执行指令而取消的BX_NEXT_INSTR宏嚒,当时分析没有问题,但事后发现虚拟机跑不起来,其效果与日志如下:解决方案一(失败) 我们先尝试着对比和正常的Bochs相比流程上存在哪些错误,我们用vscode的文本对比工具来进行对比,效果如下。经过仔细分析,其配置执行的流程已经被打乱,想要通过这种途径来分析代码似乎很困难。解决方案二(成功) 我们只能从源代码中找答案,来看BX_NEXT_IN...

2021-07-18 15:02:49 210

原创 Bochs源码分析 - 9: bochs对in/out指令的处理流程

前言 上一期,我们粗略分析了bochs中cpu执行的大体流程,并且修改了代码禁止指令的递归执行。众所周知,在众多指令中通过IO与外设进行交互的指令是in/out指令,我们这篇文章就来大体分析一下in/out指令执行流程。 在第七篇文章中,我们通过floppy外设简单分析了一下IO中断的结构体,我们将它放在这篇文章开头处,可能在分析过程中具有参考价值。定位到out指令 在上篇文章中我们分析了BIOS的启动流程,其第三条指令为"BIOS_F:E05D...

2021-07-18 11:54:33 364

原创 Bochs源码分析 - 8:bochs的CPU代码初步分析

前言 上一篇文章,我们分析了floppy设备的初始化,本来我们希望看看floppy的工作原理,但是调试时发现其运行cpu,通过BIOS启动指令来调用floppy。(从现在来看这是肯定的,floppy是外设,要想调用必须通过cpu,还是自己对底层不太熟悉) Bochs的CPU模块特别复杂,函数众多,我们是第一次分析,对其结构还是不太熟悉,我们先尝试来看其执行流程。在分析前,我浏览了一遍喻强老师的《Bochs项目源码分析与注释》,其CPU模块的核心图如下。CPU模块的...

2021-07-17 21:15:15 2481

原创 Bochs源码分析 - 7: 软盘设备的加载过程

前言 上一篇文章我们来一起简单分析了bochs的物理内存初始化这一过程,现在引出一个问题:我们编写的代码是如何被bochs读取并映射到物理内存中的呢。要回答这个问题,我们必须来分析bochs中的软盘编写过程。Bochs的设备链概念 Bochs的各种设备初始化是由一个"PLUG_load_plugin(xx,xx)"宏来完成的,当物理内存初始化完成,其调用一个宏“DEV_init_devices()”,该函数就是来初始化各种设备。函数中有一个是初始化软盘的,我们先不管其...

2021-07-16 19:33:33 439

原创 Bochs源码分析 - 6: bochs的物理内存初始化

前言 上一篇文章,我们走马观花地介绍了bochs从启动到CPU执行流程的大体流程,里面相关数据结构没详细分析。这篇文章我们尝试来详细分析一下bochs的物理内存初始化,首先有个概念需要理清(相信来看bochs源码的人肯定会知道):bochs只负责处理物理内存,而虚拟内存是运行在bochs中运行的OS来负责的,我们只需要关注物理内存。找到内存初始化函数 在上篇文章中,我们提到过一个比较重要的函数bx_init_hardware(),该函数负责初始化各种硬件(内存,Io...

2021-07-14 21:48:09 717

原创 Bochs源码分析 - 5: 从启动到cpu运行之前的一系列初始化

前言 现在正式开始调试bochs源代码,在这之前我也没读过bochs源码,算是从零开始读,自己可能会走入一些误区,有些可能猜错,如果发现之后会来改正。我们先大体走一遍整个系统,不要纠结于各种复杂细节流程。这篇文章开始分析程序在点击启动后如何开始并且一步步初始化完成初始化,完成相关配置文件。说实话,如下图bochs启动时一系列的配置参数,对像我这种新手来说是相当恐怖的,各种启动参数信息。其实调试过一遍之后,虽然里面很多细节还是不太懂,但是再看这些信息心里踏实多了。启...

2021-07-14 11:38:27 997

原创 Bochs源码分析 - 4: 使用ida来调试bochs

前言 bochs内部提供了一个调试器,但是这个命令行调试器相当难用,想找一个gui的debugger。第一次是在百度百科的bochs词条中介绍的peter-bochs-debugger调试器(java编写),但是后来发现ida也有一个bochs调试器,因为对ida比较熟悉,就选用此作为bochs调试器。 在配置过程中参考博客 https://blog.csdn.net/cssxn/article/details/90738498 中的配置,但是这是直接发布版本,拿源码编译...

2021-07-12 22:39:44 2049 3

原创 Bochs源码分析 - 3: 同步到github上

这次打算长久更新,创建了一个仓库,里面放了有关代码与工具。github https://github.com/kkgh0st/kkbochs

2021-07-11 21:27:44 285

原创 Bochs源码分析 - 2:使用bochs运行引导代码

前言 这一篇文章中,我们尝试使用编写引导代码,然后配置bochs让其可以运行这份代码,过程中遇到的问题,为什么这么做,我会尽可能详细的描述给大家,当然自己可能存在错误,请见谅!!安装 nasm 编译器...

2021-07-11 19:24:17 1078 1

原创 Bochs源码分析 - 0 文章集合

为什么要阅读Bochs源码Bochs是一个x86硬件平台的开源模拟器。它可以模拟各种硬件的配置。Bochs模拟的是整个PC平台,包括I/O设备、内存和BIOS。更为有趣的是,甚至可以不使用PC硬件来运行Bochs。事实上,它可以在任何编译运行Bochs的平台上模拟x86硬件。通过改变配置,可以指定使用的CPU(386、486或者586),以及内存大小等。一句话,Bochs是电脑里的“PC”。根据需要,Bochs还可以模拟多台PC,此外,它甚至还有自己的电源按钮。 ...

2021-07-11 15:53:44 1505

原创 Bochs源码分析 - 1: Bochs工程项目的编译

编译环境操作系统: Windows 10IDE: Visutal Studio 2019 + SDK10----------------------------------------------------------------备注: 编译环境没啥要求,正常的vs2017,vs2019 win10SDK都是可以的。----------------------------------------------------------------下载地址https://sou.

2021-07-11 15:39:37 707

原创 使用Event来进行线程同步

目录前言"信号"是个什么东西Event事件的初始化Event的应用场景代码示例前言之前一直对Event这类用法似懂非懂,说懂一点是因为之前探究过Windows底层对Event这类同步对象的实现机制,说不懂是因为其参数一直容易搞混,也不明白其各种应用场合,今天在调试器的编写过程中发现必须采用多线程,采用多线程就要涉及线程同步问题,今天就利用这个机会来分析一下Event的实现机制。WINAPICreateEventA( _In_opt_ LPSECUR...

2021-07-07 21:39:06 311

原创 优秀代码片段展示

1. bool b = xx === xxx 这种写法```cpp// 源代码bool handled = DebugEvent.dwDebugEventCode == EXCEPTION_DEBUG_EVENT && (DebugEvent.u.Exception.ExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT || DebugEvent.u.Exception.ExceptionRecord.

2021-07-04 14:43:19 323

原创 Python用法集合-持续更新

1. Python字符串转十六进制数hexStr = "0x123AF"hexNum = int(hexStr,16)2. Python处理 <文件||文件夹>def deal_command(env, engine, path): global g_bContinue bContinue = True if False == os.path.isdir(path): bContinue = deal_single_file(env, .

2021-07-04 14:27:21 73

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除