当我将我的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) 如何在保护模式下执行间接远跳转/调用?首先我认为这样做是允许的:
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-64 处理器的 NUMA 文档,不幸的是我只找到了 NUMA 的优化文档。
我想要的是:如何在系统中初始化 NUMA(这包括获取系统的内存拓扑和处理器拓扑)。有谁知道有关 X86-64 AMD 和 Intel 处理器的 NUMA 的好文档吗?
如何在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],0x552
... 等等等等.
我怀疑GCC已经隐式地将结构重新调整为32个字节(从24个字节),强制a(每个条目的64位对齐).我真的不希望这种行为只适用于这种结构.我该如何告诉GCC不要对齐那个结构?
#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编译器......