标签: x86-64

AMD 64 位模式下的段限制检查

我正在为 64 位处理器编写自己的操作系统,但遇到了一般保护问题。我的操作系统不会依赖页面错误来实现用户空间保护机制,所以我发现有一种方法可以通过段限制检查来实现:

这个来自 VMWare 的演示

http://download3.vmware.com/vmworld/2005/pac346.pdf

在第 20 页上说:

  • 最初的 AMD64 架构不包括 64 位模式下的分段

    • EMT64T 中也缺少分段

    我们如何保护 VMM?

    • 64 位来宾支持需要额外的硬件协助
    • 在较新的 AMD 处理器上的 64 位模式下可用的段限制检查

现在,我有了更新的 AMD 处理器型号,我的问题是如何在 64 位(长)模式下对 AMD 处理器进行限制段限制检查?我已经下载了 2011 年 9 月版本(最新)的开发人员手册,但我无法在任何地方找到如何执行此操作,请帮助。

assembly operating-system x86-64 memory-segmentation

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

"推"的操作数类型不匹配

我需要有关使用ASSEMBLY部件的C代码的帮助.GCC编译程序集有问题,错误:

$ make
gcc -Wall -g -std=c99 -pedantic   -c -o sthread.o sthread.c
sthread.c: In function ‘sthread_create’:
sthread.c:159:57: warning: pointer of type ‘void *’ used in arithmetic [-Wpointer-arith]
     t->context = __sthread_initialize_context(t->memory + DEFAULT_STACKSIZE, f, arg);
                                                         ^
gcc -Wall -g -std=c99 -pedantic   -c -o queue.o queue.c
as -g  -o glue.o glue.s
glue.s: Assembler messages:
glue.s:32: Error: operand type mismatch for `push'
<wbudowane>: polecenia dla obiektu 'glue.o' nie powiod?y si?
make: *** [glue.o] B??d 1
Run Code Online (Sandbox Code Playgroud)

有问题的代码:

__sthread_switch:
    # preserve CPU state on the …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc x86-64

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

段寄存器如何参与内存地址转换?

在我迄今为止学到的关于分割的内容中:

  • 虚拟地址包含段选择器和偏移量
  • 段选择器与GDTR结合使用以查找段描述符的线性地址
  • 段描述符包含有关所选段的信息,包括其线性地址

所以,我的问题是:

  • 基于我所读到的内容,虚拟地址被加载到段寄存器中,然后以某种方式从那里继续转换.在将虚拟地址加载到其中以获取描述符后,段寄存器会发生什么?

  • 据我了解,段寄存器还包含描述符的缓存值.这在翻译过程中如何发挥作用?

  • 系统如何确定要加载哪个段寄存器,假设段选择器最多可以有2 ^ 13个不同的值且只有6个主寄存器?

hardware x86 x86-64 intel cpu-registers

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

x64与x86中的内存处理 - C语言

当我在X64计算机上使用GCC编译器运行下面的代码时,输​​出i为90,但在x86上运行时,其值仍为2,那么处理内存的区别在哪里?

#include <stdio.h>

int main(void)
{
  int arr[3]={50,7,30};
  int i=2;

  arr[3]=90;     
  printf("arr[2]=%d,arr[3]=%d,i=%d", arr[2], arr[3], i);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c memory 64-bit x86 x86-64

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

从程序员的角度来看,"新"处理器中的"新"是什么

我最近对理解低级计算很感兴趣.据我所知,今天广泛使用的计算机遵循x86/x86-64架构.

据我所知,架构,更具体地说,指令集架构(ISA)是程序员能够向CPU发出的指令集.

第一个问题,ISA是不断发展还是保持不变?

我认为它不断发展(意味着新指令不断被添加/先前的指令被修改?)但是旧的处理器如何能够执行用新指令编写的代码?(它不知道新的指令,但应该能够执行代码,因为它具有x86架构).编译器是处理这个东西还是处理器?基本上,相同的指令集如何能够在所有处理器上运行,无论是旧的还是新的?

最后,除了微体系结构,这不是程序员的关注(如果我错了,请纠正我),程序员在处理新处理器时会看到哪些变化?由于微体系结构的变化,旧的指令可能因为有效的实现而快速运行.但是,是否引入了新的指令以允许以前无法完成的操作?或者之前可以用一堆指令做什么,但现在可以通过硬件的变化来完成一个?新的寄存器?还要别的吗?

它是否完成了 - 如果处理器支持这个新的强大指令以加快执行速度,那么使用新指令,否则回退到较慢的旧指令.如果是,谁实现了这个if - else子句?编译器?如果不是,那会发生什么?

x86 x86-64 processor cpu-architecture micro-architecture

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

了解“ volatile”关键字和比较的工作方式

如果未使用关键字指定变量volatile,则编译器可能会进行缓存。必须始终从内存访问该变量,否则直到其事务单元结束。我想知道的重点在于装配零件。

int main() {
    /* volatile */ int lock = 999;
    while (lock);
}
Run Code Online (Sandbox Code Playgroud)

x86-64-clang-3.0.0编译器上,其汇编代码如下。

main:                                   # @main
        mov     DWORD PTR [RSP - 4], 0
        mov     DWORD PTR [RSP - 8], 999


.LBB0_1:                                # =>This Inner Loop Header: Depth=1
        cmp     DWORD PTR [RSP - 8], 0
        je      .LBB0_3
        jmp     .LBB0_1


.LBB0_3:
        mov     EAX, DWORD PTR [RSP - 4]
        ret
Run Code Online (Sandbox Code Playgroud)

volatile关键字被注释时,结果如下。

main:                                   # @main
        mov     DWORD PTR [RSP - 4], 0
        mov     DWORD …
Run Code Online (Sandbox Code Playgroud)

c assembly x86-64 volatile

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

gdb错误-“非可执行格式:无法识别文件格式”

当尝试调试(在编译和链接之后)名为hello_world的程序集86-64x程序时,出现gdb错误“不是可执行文件格式:无法识别文件格式”。

ubuntu@ubuntu:~$ gdb hello_world
GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other …
Run Code Online (Sandbox Code Playgroud)

debugging assembly gdb x86-64

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

Error installing gcc 3.0.1 for x86-64 architecture

I'm trying to compile the gcc 3.0.1 files. When I use configure, it gives an error with the following message

Configuration x86_64-unknown-linux-gnu not supported

gcc x86-64

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

What is the actual size of stack red zone?

In the x86-64 System V ABI it is specified that the space behind the $rsp - 128 is the so-called red zone which is not touched by any signal handlers. On my machine

$ ulimit -s
8192
Run Code Online (Sandbox Code Playgroud)

I expected there is only 2 pages in the stack. So I wrote the following program to test till which size red zone can expand:

PAGE_SIZE equ 0x1000
SYS_exit equ 0x3C

section .text
global _start 

_start:
    lea rcx, [rsp - 0x1f * PAGE_SIZE] …
Run Code Online (Sandbox Code Playgroud)

assembly callstack mmap x86-64 red-zone

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

X86:寻址模式-寄存器值更改

这可能很愚蠢,但是对这些类型的指令有一个小疑问:

MOV EBX,dword ptr [RAX + 0x28]
Run Code Online (Sandbox Code Playgroud)

这会改变值RAX吗?就像是:

移动RAX + 0x28in中指向的值EBX,然后添加Add RAX, 0x28。简而言之,RAX此操作后的更改值是否合适?

assembly x86-64 addressing-mode

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