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

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

前言

        上一篇文章我们来一起简单分析了bochs的物理内存初始化这一过程,现在引出一个问题:我们编写的代码是如何被bochs读取并映射到物理内存中的呢。要回答这个问题,我们必须来分析bochs中的软盘编写过程。

Bochs的设备链概念

        Bochs的各种设备初始化是由一个"PLUG_load_plugin(xx,xx)"宏来完成的,当物理内存初始化完成,其调用一个宏“DEV_init_devices()”,该函数就是来初始化各种设备。函数中有一个是初始化软盘的,我们先不管其他的,仅针对它来分析

PLUG_load_plugin(floppy, PLUGTYPE_CORE);

         这里先给出函数的调用堆栈,免得忘记自己走过的路(这里先不画图了)。

>	bochs.exe!bx_devices_c::init(BX_MEM_C * newmem) Line 221	C++
 	bochs.exe!bx_init_hardware() Line 1378	C++
 	bochs.exe!bx_begin_simulation(int argc, char * * argv) Line 1027	C++
 	bochs.exe!bx_real_sim_c::begin_simulation(int argc, char * * argv) Line 907	C++
 	bochs.exe!win32_ci_callback(void * userdata, ci_command_t command) Line 679	C++
 	bochs.exe!bx_real_sim_c::configuration_interface(....)
 	bochs.exe!bxmain() Line 341	C++
 	bochs.exe!main(int argc, char * * argv) Line 557	C++

        初始化软盘设备的函数如下,可以看到其操作比较简单,先是创建了一个软盘设备对象"theFloppyController",然后将设备对象赋值给"bx_devices.pluginFloppyDevice",我们很容易推测出"bx_devices"是管理bochs的全部设备的。然后调用一个函数,该函数通过函数名可以知道是"注册设备模型”。(这里我其实拿不准,在Windows内核中有设备链这一概念,比如我们想拦截Windows中的键盘消息,我们应该先通过设备链来搜索出键盘这个设备对象模型,然后对其IRP消息进行过滤拦截。我们用这种模型来尝试套在bochs上。)

int CDECL libfloppy_LTX_plugin_init(plugin_t *plugin, plugintype_t type)
{
  if (type == PLUGTYPE_CORE) {
    theFloppyController = new bx_floppy_ctrl_c();
    bx_devices.pluginFloppyDevice = theFloppyController;
    BX_REGISTER_DEVICE_DEVMODEL(plugin, type, theFloppyController, BX_PLUGIN_FLOPPY);
    return 0; // Success
  } else {
    return -1;
  }
}

void pluginRegisterDeviceDevmodel(...)函数分析

        该函数比较少,很明显就是链表操作,我们直接画出数据结构图,代码就不必分析了。

typedef struct _device_t
{
    const char   *name;        // 设备名称
    plugin_t     *plugin;      // 插件? 此时为NULL,不需要分析
    plugintype_t plugtype;     // 类型,由该值决定不同的链表

    class bx_devmodel_c *devmodel;  // 设备模型

    struct _device_t *next;    // 链表中的下一个设备
} device_t;

        这里还是提一句吧,其中有一个指针的指针,这个如果第一次读并且指针学的不太好的话可能让你感到困惑。其实这很好理解,其中core_devices是一个指针,代表着核心设备的链表头部,我们想要生成一个变量来使用这个指针,当然需要生成指针的指针。

void pluginRegisterDeviceDevmodel(plugin_t *plugin, plugintype_t type, bx_devmodel_c *devmodel, const char *name)
{
  device_t **devlist;

  device_t *device = new device_t;
    
    ...

  switch (type) {
    case PLUGTYPE_CORE:
    case PLUGTYPE_VGA:
      devlist = &core_devices; // 来获取 core_devices
      break;
    .....
      ....
  }

  if (!*devlist) {
    /* Empty list, this become the first entry. */
    *devlist = device;    // 如果 core_devices 为null,则 floppy 作为第一个设备.
  } else {
    /* Non-empty list.  Add to end. */
    device_t *temp = *devlist;

    while (temp->next)
      temp = temp->next;

    temp->next = device;
  }
}

软盘的初始化

         之前我们分析了软盘作为设备是如何注册到设备链中的,我们继续往下分析。在“void bx_init_hardware()” 函数中,其紧接着调用了"bx_init_plugins()"这个函数,该函数是遍历设备链表,依次初始化里面的设备,对于软盘的是调用的“void bx_floppy_ctrl_c::init(void)”函数。

        里面内容较多,我们耐心往下分析就好。

DMA的初始化

        首先,其调用 “DEV_dma_register_8bit_channel(2, dma_read, dma_write, "Floppy Drive");” 这个函数,是注册DMA,在DMA组件中将floppy注册上去,让DMA得知floppy的存在。

unsigned bx_dma_c::registerDMA8Channel(unsigned channel,
    Bit16u (* dmaRead)(Bit8u *data_byte, Bit16u maxlen),
    Bit16u (* dmaWrite)(Bit8u *data_byte, Bit16u maxlen),
    const char *name)
{
  if (channel > 3) {
    BX_PANIC(("registerDMA8Channel: invalid channel number(%u).", channel));
    return 0; // Fail
  }
  if (BX_DMA_THIS s[0].chan[channel].used) {
    BX_PANIC(("registerDMA8Channel: channel(%u) already in use.", channel));
    return 0; // Fail
  }
  BX_INFO(("channel %u used by %s", channel, name)); 
/// 这里对用的floppy的dmaRead 与 dmaWrite
  BX_DMA_THIS h[channel].dmaRead8  = dmaRead;   
  BX_DMA_THIS h[channel].dmaWrite8 = dmaWrite;
/// 表示DMA这个通道被占用
  BX_DMA_THIS s[0].chan[channel].used = 1;
  return 1; // OK
}

          关于DMA,在写这篇文章之前我也不太了解,就在网上查阅了相关信息。在我理解,DMA是CPU与外设的中间一层,举个例子:硬盘中的数据要想拷贝到物理内存中,其必须要经过CPU控制的总线,这个过程CPU不能做别的,不同外设IO速度的差异也挺大的。此时,DMA出现了,相当于CPU的一个助理,之后这种工作CPU就交由DMA来全权负责,为了让DMA有能力办成这事情,CPU把总线的控制权交由DMA,与此对应的,DMA完成任务之后就会立刻给CPU相应

        Bochs对此的模拟应该相当粗暴,其数据读取不用什么总线这些,其分配了四个channel,每个channel可以负责一个设备的IO操作,其指向该设备对应的读写函数,再后续的分析代码中我们应该再会看到DMA这个东东。

注册IRQ

       当注册完DMA时,紧接着调用代码"DEV_register_irq(6, "Floppy Drive");"来注册IRQ,IRQ中断相应等级应该在CPU那部分章节看到。我们来分析这个代码,发现其存在一个字符串数组irq_handler_name,里面存储着对应的中断名称,除了这个其余什么也没做,因此就不过多分析了。

注册IO端口

        在注册完IRQ之后,Bochs紧接着为floppy注册IO读写端口,代码如下:

  for (unsigned addr=0x03F2; addr<=0x03F7; addr++) {
    DEV_register_ioread_handler(this, read_handler, addr, "Floppy Drive", 1);
    DEV_register_iowrite_handler(this, write_handler, addr, "Floppy Drive", 1);
  }

         "DEV_register_ioread_handler(...)"函数的实现代码非常简单,bochs对于io端口使用一个名为“io_handler_struct”的结构体。然后bochs维护了一个0x10000大小的 "io_handler_struct"链表,每个端口号都对应着一个 io_hadner_struct,代码如下:

class BOCHSAPI bx_devices_c
{
...

private:
  struct io_handler_struct {
    struct io_handler_struct *next;
    struct io_handler_struct *prev;
    void *funct; // C++ type checking is great, but annoying
    void *this_ptr;
    char *handler_name;  // name of device
    int usage_count;
    Bit8u mask;          // io_len mask
  };
  struct io_handler_struct io_read_handlers;
  struct io_handler_struct io_write_handlers;
#define PORTS 0x10000
  struct io_handler_struct **read_port_to_handler;
  struct io_handler_struct **write_port_to_handler;
...
    char *irq_handler_name[BX_MAX_IRQS]; // 注册irq时用到的
...
}

        其整体结构如下图所示,这里右边构成一个链表,我们之后就可以通过这个链表快速遍历存在的io_handler_stuct,如果通过左边那张表来遍历,则一次的时间复杂度为0x1000,这显然不合适的。

evaluate_media(...)函数分析

        我们继续在函数“bx_floppy_ctrl_c::init(void)”往下分析,其紧接着就是一个"evaluate_media()"函数。

        首先,该函数打开软盘文件,还记得我们在bochs的配置文件中初始化,其就是在这里被打开的,函数如下。

        之后,其来配置软盘的信息,磁道数等信息。其代码如下面所示。从中我们可以获取信息,1.44M这里的M是1000,000大小,经计算 1.44 * 1000,000 / 2880 = 500(0x1F4),每个扇区中可以存储500个字节。

      default: // 1.44M 3.5"
        media->type              = type;
        if (stat_buf.st_size <= 1474560) {
          media->tracks            = floppy_type[type_idx].trk;
          media->heads             = floppy_type[type_idx].hd;
          media->sectors_per_track = floppy_type[type_idx].spt;
        }

static floppy_type_t floppy_type[8] = {
  {BX_FLOPPY_160K, 40, 1, 8, 320, 0x03},
  {BX_FLOPPY_180K, 40, 1, 9, 360, 0x03},
  {BX_FLOPPY_320K, 40, 2, 8, 640, 0x03},
  {BX_FLOPPY_360K, 40, 2, 9, 720, 0x03},
  {BX_FLOPPY_720K, 80, 2, 9, 1440, 0x1f},
  {BX_FLOPPY_1_2,  80, 2, 15, 2400, 0x02},
  {BX_FLOPPY_1_44, 80, 2, 18, 2880, 0x18},
  {BX_FLOPPY_2_88, 80, 2, 36, 5760, 0x10}
};

typedef struct {
  unsigned id;
  Bit8u trk;
  Bit8u hd;
  Bit8u spt;
  unsigned sectors;
  Bit8u drive_mask;
} floppy_type_t;

         下面代码是设置启动顺序与CMOS,关于CMOS我也不太了解,通过查阅资源发现其关于BIOS有关,我们尝试查阅bochs的用户手册,发现了以下信息:

4.3.17. cmosimage

Example:

  cmosimage: file=cmos.img, rtc_init=time0

This defines a binary image file with size 128 bytes that can be loaded into the CMOS RAM at startup. The rtc_init parameter controls whether initialize the RTC with values stored in the image. By default the time0 argument given to the clock option is used. With 'rtc_init=image' the image is the source for the initial time.

        其启动界面也出现了下面两行信息,可以看出启动顺序只是启动floppy。

00000000000i[FLOPPY] Using boot sequence floppy, none, none
00000000000i[FLOPPY] Floppy boot signature check is enabled

        我们继续Google一下CMOS的有关信息,下面看到了一个比较详细的解答。简单来说CMOS是一个RAM芯片,里面存储着一些关于电脑组件的信息以及它们的相关设置,Bios代码在Bios芯片上读取来自CMOS的信息当电脑开始启动时。(我们先理解到这里吧,等之后遇到详情再来分析,现在这些描述太抽象了,我们无法直观看到有关信息)

The BIOS is a ROM chip on the motherboard which contains code that tells the CPU how to interact and control the other components in the computer.

The CMOS is also a chip on the motherboard but is a RAM chip with volatile memory which stores information about the computer components and their settings.

RAM chips lose the info stored in them when the computer is turned off so this is where the CMOS battery comes in to it to keep power to the CMOS chip so as to keep the settings.

The BIOS code on the BIOS chip reads information from the CMOS chip when the computer starts during the boot up process.

Hope this helps.

        之后其配置一些bochs运行时的函数,还是那句话,等用到了我们再来进行分析,我们现在也不知道其是做什么的。 

  // runtime parameters
  for (i = 0; i < 2; i++) {
    sprintf(pname, "floppy.%d", i);
    bx_list_c *floppy = (bx_list_c*)SIM->get_param(pname);
    SIM->get_param_string("path", floppy)->set_handler(floppy_param_string_handler);
    SIM->get_param_string("path", floppy)->set_runtime_param(1);
    SIM->get_param_bool("readonly", floppy)->set_handler(floppy_param_handler);
    SIM->get_param_bool("readonly", floppy)->set_runtime_param(1);
    SIM->get_param_enum("status", floppy)->set_handler(floppy_param_handler);
    SIM->get_param_enum("status", floppy)->set_runtime_param(1);
  }

总结

        这篇文章我们来梳理了bochs中软盘的加载过程,DMA端口注册,IRQ注册,IO端口,打开磁盘中的软盘映像(a.img),配置软盘参数以及后面的CMOS与运行时参数配置。 遗憾的是,我们似乎还是没有能分析到其如何将软盘中的二进制文件映射到物理内存然后运行的,别急,估计下一章很快就可以看到。

 

 

Bochs源码分析 - 1: Bochs工程项目的编译 编译环境 操作系统: Windows 10 IDE: Visutal Studio 2019 + SDK10 ---------------------------------------------------------------- 备注: 编译环境没啥要求,正常的vs2017,vs2019 win10SDK都是可以的。 ---------------------------------------------------------------- 下载地址 https://sou. 阅读详情

相关推荐

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

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

WriteAnything_的博客 688

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

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

WriteAnything_的博客 633

Bochs项目源码分析与注释.pdf

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

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

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

WriteAnything_的博客 941

Ansys口腔正畸有限元分析:从几何处理到接触设定的全流程解析

本文详细解析了Ansys在口腔正畸有限元分析中的全流程应用,从几何处理到接触设定,帮助医生精准预测牙齿移动趋势。通过有限元建模技术,可同时观察牙齿-牙周膜-牙槽骨的力学响应,显著提升矫治效果预测准确率。文章还分享了实用技巧和参数设置建议,适用于正畸医生和工程师。

weixin_30897233的博客 348

倍福Beckhoff运动控制功能块实战解析:从MC_ReadActualPosition到MC_GearInVelo

本文深入解析倍福(Beckhoff)TwinCAT运动控制功能块,从基础的MC_ReadActualPosition、MC_Power等轴状态读取与使能操作,到MC_MoveAbsolute、MC_MoveRelative等单轴定位指令,并重点剖析了用于动态速度同步的核心功能块MC_GearInVelo在飞锯等场景的应用。文章结合实战经验,详细介绍了齿轮耦合、电子凸轮(MC_CamIn)等高级同步功能的参数配置、调试技巧及常见问题,旨在帮助工程师快速掌握倍福运动控制工具箱,实现复杂的同步工艺。

transformer2023的博客 981

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

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

WriteAnything_的博客 1312

dToF直方图之美

上面视频里如果你能看懂,那么就能理解对于dToF单点的测距问题,对于大部分的描述在AMS和ST里的手册都非常的详细,有疑问的可以后台来找我探讨,今天我们单纯从上层讨论成像的问题。作为dToF算法工程师,应该是对直方图敏感的,直方图的每个Count峰都会表征出问题,因为dToF的输出只有直方图,观察直方图能够逆推出dToF的很多东西,这也是大多数公司不愿意开放直方图和Raw data的缘故。以上是一个小面阵的分辨率,第一张是直方图,后面是基于直方图寻峰出来的成像ToF图,Peak图,以及噪声Noise图。

dream it possible 2993

Bochs源码分析 - 0 文章集合

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

WriteAnything_的博客 1803

ROS2+MoveIt2+Gazebo仿真实战:从零搭建六轴机械臂控制闭环

本文详细介绍了如何从零搭建一个完整的ROS2+MoveIt2+Gazebo六轴机械臂仿真控制闭环。通过手写URDF模型、配置MoveIt2运动规划、集成Gazebo物理仿真与ROS2 Control控制器,最终实现RViz中规划轨迹、Gazebo中同步执行的完整数字孪生验证平台,为机器人算法开发和硬件验证提供低成本、高效的仿真解决方案。

weixin_29093017的博客 484

STM32F4的sct文件理解

原文地址http://blog.sina.com.cn/s/blog_898f36590100ya2l.html ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~...

weixin_34008805的博客 995

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

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

WriteAnything_的博客 560

将AAL图谱对应到Yeo7大网络中【原理,代码分析】

本文介绍了将AAL2图谱映射到Yeo7大功能网络的方法。通过整合皮层(Yeo2011)、小脑(Buckner2011)和纹状体(Choi2012)三个区域的功能网络图谱,采用投票机制确定每个AAL区域的网络归属。具体步骤包括:1)统计每个AAL区域体素在各网络图谱中的分布;2)选择体素数量最多的网络作为该区域的最终标签。该方法实现了从解剖结构到功能网络的映射,可获得120个AAL区域对应的7大功能网络标签。

yes666666的博客 2205

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

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

WriteAnything_的博客 1313

【工具插件类教学】Unity翻书效果插件Book-Page Curl Pro教程

特征: • 从左到右和从右到左翻页 • 与画布缩放器 配合使用 • 可配置的自动翻转脚本 • 支持向页面 添加 UI 元素 • 支持透明页面 • 适用于“世界空间”画布

纯技术流日常开发商业开发记录总结等 3672

【WRFDA教程第一期】运行观测预处理程序(OBSPROC)

运行观测预处理程序(OBSPROC)

WW、forever的博客 1891

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 ...

WriteAnything_的博客 871

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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...

WriteAnything_的博客 629

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Bochs源码分析-初始化部分

因为学习需要,要看虚拟机Bochs的源代码。写随笔主要为了学习总结,其次是分享大家共同研究,大神勿喷,欢迎评论。 手头资料:bochs源代码,下于:bochs.sourceforge.net,还有喻强写的源码分析电纸书。 从程序运行到模拟机真正开始工作,即模拟程序代码的运行,这一部分称为程序的初始化。其中主要包括1:获取用户参数决定程序运行方式,2:获取模拟器配置信息(主要放在配置文件boch...

weixin_30919571的博客 337

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

shoelace源代码分析,bochs调试过程,setup.s

b 0x90200 c (0) Breakpoint 1, 0x90200 in ?? () Next at t=78342962 (0) [0x00090200] 9020:0000 (unk. ctxt): mov ax, 0x9000            ; b80090 u /20 0x90000 00090000: (                    ): mov

linux-0.11调试教程 2031

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

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

WriteAnything_的博客 661

shoelace源代码分析,bochs调试过程 -- loadbuilt()函数

s Next at t=78037287 (0) [0x0006091d] 6000:091d (unk. ctxt): inc sp                    ; 44 s Next at t=78037288 (0) [0x0006091e] 6000:091e (unk. ctxt): lea bx, word ptr ss:[bp+0xfe62] ; 8d9e62f

linux-0.11调试教程 1778

使用 Visual Studio 2013 编译,调试 linux-0.11

强烈推荐学习 Linux 源码从 0.11 版开始入手,原因嘛,见下面推荐两本 Linux 0.11 源码分析书籍前言。 《linux 内核完全注释》 http://product.china-pub.com/22033 电子书下载地址:http://pan.baidu.com/s/1ntx5hKt 《Linux内核设计的艺术》 http://product.china-pub.com/

诺飞的专栏 2937

操作系统内核Hack:(三)引导程序制作

操作系统内核Hack:(三)引导程序制作 关于本文涉及到的完整源码请参考MiniOS的v1_bootloader分支。 1.制作方法 现在我们已经了解了关于BootLoader的一切知识,让我们开始动手做一个BootLoader吧!但真正开始之前,我们还要做出一个选择,在之前的讨论中我们曾说过,有两种学习和制作引导程序和操作系统内核的路线:1)《Orange’s:一个...

weixin_30293079的博客 451

一个简单的多任务内核实例

这是在上篇博文的基础上又新增了一个任务,两个任务通过时钟中断交替运行。 编译器:nasm 虚拟机:bochs 操作系统:macosx github interrupt源码 参考:赵炯《Linux内核完全剖析》 init.s [BITS 32] LATCH equ 1193180 SCRN_SEL equ 0x18 LDT0_SEL equ 0x28 TSS0_SEL equ 0x...

fxnfk 1014
上一篇: Bochs源码分析 - 6: bochs的物理内存初始化
下一篇: Bochs源码分析 - 8:bochs的CPU代码初步分析
WriteAnything_
博客等级 码龄5年 66粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值