小编Seb*_* B.的帖子

汇编程序使用GDT跳转到保护模式

我目前正在玩x86 Assember,以提高我的低级编程技能.目前,我在32位保护模式下的寻址方案面临一些问题.

情况如下:

我有一个程序加载在0x7e0,它将CPU切换到保护模式并跳转到代码中的相应标签:

[...]
code to switch CPU in Protected Mode
[...]

jmp ProtectedMode


[...]

bits 32

ProtectedMode:
    .halt:
        hlt
        jmp .halt
Run Code Online (Sandbox Code Playgroud)

到目前为止这个工作绝对正常."jmp ProtectedMode"在没有显式远跳的情况下工作以清除预取队列 - 因为该程序加载了偏移量0(开头的org 0) - 导致代码段指向正确的位置.

我现在的问题是,在"ProtectedMode"标签中我想跳转到另一个加载到0x8000的程序(我用内存转储检查了这个,加载函数确实正常工作,程序正确加载到0x8000) .

由于CPU现在处于ProtectedMode而不再是RealMode,因此寻址模式不同.ProtectedMode使用描述符选择器查找基址和描述符表中的限制,以添加给定的偏移量并检索物理地址(据我所知).因此,在进入ProtectedMode之前必须安装GDT.

我看起来如下:

%ifndef __GDT_INC_INCLUDED__
%define __GDT_INC_INCLUDED__

;*********************************
;* Global Descriptor Table (GDT) *
;*********************************
NULL_DESC:
    dd 0            ; null descriptor
    dd 0

CODE_DESC:
    dw 0xFFFF       ; limit low
    dw 0            ; base low
    db 0            ; base middle
    db 10011010b    ; access
    db 11001111b    ; granularity
    db 0 …
Run Code Online (Sandbox Code Playgroud)

x86 assembly protected-mode addressing-mode

12
推荐指数
1
解决办法
8392
查看次数

GCC 原子内置函数,移植到 Windows/Visual Studio

我正在开发一个依赖 GCC 的atomic built-ins 的项目。在将项目移植到 Windows 时,我试图找到 GCC 原子的 Interlocked* 对应项。大多数操作实际上都可用,但我想念应用的操作__ATOMIC_CONSUME__ATOMIC_ACQ_REL内存语义。由于 _*Barrier 内在函数已被弃用,Microsoft建议使用std::atomic(例如atomic_thread_fence)和类似的 C++11 标准。

我想知道:C 程序员应该做什么,我们如何在不使用 C++11 的情况下实现atomicswith__ATOMIC_CONSUME__ATOMIC_ACQ_REL语义的可移植版本?

c windows gcc atomic interlocked

5
推荐指数
1
解决办法
1563
查看次数

使用类模板的C++循环依赖 - 如何重构?

我正在处理C++中的循环依赖问题.

情况如下:

libA.so:
    - Body.cpp
    - Header.cpp
    - DataObject.cpp
    - DataObject::read(boost::asio::streambuf* data)
      {
          boost::asio::streambuf data;

          ....

          body = (new DataConverter<Body>)->convert(&data);
          header = (new DataConverter<Header>)->convert(&data);
      }

  libB.so:
      - DataConverter.cpp
          -> DataConverter<T>
          -> T* DataConverter<T>::convert(boost::asio::streambuf* data)

  libA.so <-> libB.so
Run Code Online (Sandbox Code Playgroud)

存在循环依赖性,因为libA使用来自libB的Converter-Class,而libB现在需要关于需要转换的libA的Object-Types - 因为DataConverter :: convert返回Body或Header对象.

我考虑用前向声明解决这个问题 - 但这对我来说似乎不是最干净的解决方案.总而言之,我的计划是提供可扩展的DataConverter解决方案.

你们有什么建议作为最佳做法?一个完全不同的设计也欢迎:)

最好,塞巴斯蒂安

c++ templates circular-dependency extensible

0
推荐指数
1
解决办法
309
查看次数