www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.ldc - [Help] all __gshared vairable address is 0.

reply lili <akozhao tencent.com> writes:
Hi:
     I'm writing a OS kernel in D. I meet a problem that all bss 
variables's address is same
     and is 0.

    see code below:

extern(C) extern __gshared ulong  p4_table; //defined in a boot.s 
file
__gshared int xx= void;
abstract final class Vga
{
     void init()
     {
         clearScreen();
         Vga.println(cast(ulong)p4_table); //0
         Vga.println(cast(ulong)&xx); //0
     }
but i see the link map file p4_table and xx has different address.

                 0x0000000000104000                __bss = .
  *(.bss)
  .bss           0x0000000000104000    0x15000 boot.o
                 0x0000000000104000                p4_table
                 0x0000000000105000                p3_table
                 0x0000000000106000                p2_table
                 0x0000000000108000                idt_addr
  *(.bss.*)
  .bss.xx        0x0000000000119000        0x4 vga.o
                 0x0000000000119000                xx

  and when i call asm_fn in d the return value of asm_fn is return 
0x106000 not 0.
  so why did it occur.


[global asm_fn]
asm_fn:
	mov rax, p2_table
	ret

src  https://github.com/lilijreey/OS-D
Aug 25 2019
next sibling parent reply kinke <noone nowhere.com> writes:
On Sunday, 25 August 2019 at 12:12:51 UTC, lili wrote:
 I'm writing a OS kernel in D.
Are you aware of https://github.com/PowerNex/PowerNex, a similar project?
 and when i call asm_fn in d the return value of asm_fn is 
 return 0x106000 not 0.
  so why did it occur.
I'd suggest writing the same function in D and comparing the produced assembly. Use `-output-s` to generate textual assembly files (*.s) directly with LDC. I guess you need to play around with `-relocation-model`.
Aug 25 2019
parent lili <akozhao tencent.com> writes:
On Sunday, 25 August 2019 at 12:57:58 UTC, kinke wrote:
 On Sunday, 25 August 2019 at 12:12:51 UTC, lili wrote:
 I'm writing a OS kernel in D.
Are you aware of https://github.com/PowerNex/PowerNex, a similar project?
 and when i call asm_fn in d the return value of asm_fn is 
 return 0x106000 not 0.
  so why did it occur.
I'd suggest writing the same function in D and comparing the produced assembly. Use `-output-s` to generate textual assembly files (*.s) directly with LDC. I guess you need to play around with `-relocation-model`.
You are right, the problem was fixed when I set -relocation-mode=static. Thanks very much.
Aug 28 2019
prev sibling parent XavierAP <n3minis-git yahoo.es> writes:
On Sunday, 25 August 2019 at 12:12:51 UTC, lili wrote:
 Hi:
     I'm writing a OS kernel in D. I meet a problem that all bss 
 variables's address is same
     and is 0.

    see code below:

 extern(C) extern __gshared ulong  p4_table; //defined in a 
 boot.s file
 __gshared int xx= void;
 abstract final class Vga
 {
     void init()
     {
         clearScreen();
         Vga.println(cast(ulong)p4_table); //0
         Vga.println(cast(ulong)&xx); //0
     }
 but i see the link map file p4_table and xx has different 
 address.
Welp... I don't know. But in any case in principle you should use the portable alias size_t for pointers: https://dlang.org/spec/type.html#size_t
Aug 28 2019