小编pri*_*ner的帖子

链接问题:i386:x86-64输入文件架构*.o与i386输出不兼容

当我将我的osdev移动到Linux时,我遇到了一个问题,它之前在gcc 3.5.*和binutils 2.18(编译为输出x86_64-elf)上运行在cygwin下运行.

以下是信息:

gcc -v


Using built-in specs.
Target: i686-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.4.4-14ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu
Thread model: posix
gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5) 
Run Code Online (Sandbox Code Playgroud)



ld -v


GNU ld (GNU Binutils for Ubuntu) 2.20.51-system.20100908


ld -help的一部分


....
ld: supported targets: elf32-i386 a.out-i386-linux pei-i386 elf32-little elf32-big elf64-x86-64 pei-x86-64 elf64-l1om elf64-little elf64-big plugin srec symbolsrec …
Run Code Online (Sandbox Code Playgroud)

c assembly linker gcc linker-scripts

7
推荐指数
1
解决办法
2万
查看次数

在保护模式下进行间接远跳转/调用

如何在保护模式下执行间接远跳转/调用?首先我认为这样做是允许的:

jmp 0x10:eax;
Run Code Online (Sandbox Code Playgroud)

(不用担心段选择器..我的 GDT 的第二个条目是有效的代码段)

但是当nasm组装的时候,却出现了语法错误。查看Intel(指令集参考)手册的Book 2a,只能使用 来完成jmp ptr16:32,其中ptr16:32是立即值,或者使用 来完成jmp m16:32,其中 是m16:32包含48位跳转地址(16:32 )。

现在我尝试以这种方式对其进行编码:

mov dword[ds:jumpaddress_offset],eax
; or just dword[jumpaddress_offset],eax
mov word[ds:jumpaddress_sel],0x10;
; or just mov word[ds:jumpaddress_sel],0x10;
jmp dword far [dword ds:jumpaddress];
...
jumpaddress:
jumpaddress_sel dw 0
jumpaddress_offset dd 0
Run Code Online (Sandbox Code Playgroud)

它组装成功,但当我尝试运行它时,处理器出现一般保护故障并重新启动。我不知道发生了什么事。

我假设编码是这样的:

(例如我想使用间接跳转跳转到0x10:0x8010)

dw 0x10
dd 0x8010
Run Code Online (Sandbox Code Playgroud)

这可能有什么问题吗?难道48位内存值应该以小端编码吗?并且应该这样编码吗?

;0010 0000 8010
dd 0x10,0x80,0,0,0x10,0
Run Code Online (Sandbox Code Playgroud)

我还没有尝试做最后一项。

x86 assembly osdev

4
推荐指数
1
解决办法
3097
查看次数

x86-64 处理器的 NUMA 文档?

我已经查找过 X86-64 处理器的 NUMA 文档,不幸的是我只找到了 NUMA 的优化文档。

我想要的是:如何在系统中初始化 NUMA(这包括获取系统的内存拓扑和处理器拓扑)。有谁知道有关 X86-64 AMD 和 Intel 处理器的 NUMA 的好文档吗?

x86-64 intel osdev numa amd-processor

3
推荐指数
1
解决办法
2669
查看次数

GCC隐式对齐问题.(64位代码)

如何在gcc中明确禁用对定义变量的对齐?
拿这个代码:

typedef struct{
  unsigned long long offset;
  unsigned long long size;
  unsigned long type;
  unsigned long acpi;
}memstruct;

memstruct *memstrx;
Run Code Online (Sandbox Code Playgroud)

这将定义一个大小为24字节的结构.
我试过做:

memstrx=(void*)(0x502);
Run Code Online (Sandbox Code Playgroud)

所以

&memstrx[0]应该有一个值
&memstrx[1]0x502,0x51A
&memstrx[2],0x532

......依此类推.

但事情似乎并不正确.

相反,

&memstrx[1]时,显示的0x522地址
&memstrx[2],0x542
&memstrx[3],0x55​​2

... 等等等等.

我怀疑GCC已经隐式地将结构重新调整为32个字节(从24个字节),强制a(每个条目的64位对齐).我真的不希望这种行为只适用于这种结构.我该如何告诉GCC不要对齐那个结构?

c gcc memory-alignment

2
推荐指数
1
解决办法
4076
查看次数

C编译器bug(浮点运算)?

#include<stdio.h>

int main()
{
    double fract=0;
    int tmp;

    //scanf("%lf",&fract);
    fract=0.312;
    printf("%lf",fract);
    printf("\n\n");
    while(fract>0){
        fract*=(double)10;
        printf("%d ",(int)fract);
        fract-=(int)fract;
    }
    getch();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这段代码的输出为:312

但是somehing不对..我正在使用devcpp 4.9.9.2编译器......

c floating-point

0
推荐指数
3
解决办法
387
查看次数