Hello Adam,
I tried to find where the code, data and stack segments of L4 tasks are loaded into physical memory by moe.
I instrumented the code of "pkg/libloader/include/elf" and "pkg/l4re_kernel/server/src/loader.c" programs by using the "phys( )" method of Dataspace object in order to know the physical addresses, as shown in the code snippet below.
I tested the hello example, by running 4 instances of the hello program.
The problem is that I was unable to get the physical addresses, all the addresses seem to be virtual, as shown in the logs below.
Could you please tell me what is wrong in my investigation, what is the right way to obtain the physical memory addresses of an L4 user programs.
Thank you very much in advance.
Best regards,
Mahdi
Phdr_load(l4_addr_t base, Const_dataspace bin, App_model *mm,
unsigned r_flags, Dbg const &dbg)
: base(base), r_flags(r_flags), bin(bin), mm(mm), dbg(dbg)
{}
void operator () (Elf_phdr const &ph) const
{
using L4Re::chksys;
if (ph.type() != PT_LOAD)
return;
if (!ph.memsz())
return;
char *paddr = (char*)(l4_trunc_page(ph.paddr()) + base);
l4_umword_t offs = l4_trunc_page(ph.offset());
l4_umword_t page_offs = ph.offset() & (L4_PAGESIZE-1);
l4_umword_t fsz = ph.filesz();
if (fsz && page_offs != (ph.paddr() & (L4_PAGESIZE-1)))
{
dbg.printf("malformed ELF file, file offset and paddr mismatch\n");
chksys(-L4_EINVAL, "malformed elf file");
}
l4_umword_t size = l4_round_page(ph.memsz() + page_offs);
l4_addr_t phys_offset = 0;
l4_addr_t phys_addr;
l4_size_t phys_size;
if ((ph.flags() & PF_W) || ph.memsz() > fsz || mm->all_segs_cow())
{
// copy section
Dataspace mem = mm->alloc_ds(size);
mem->phys(offs, phys_addr, phys_size);
printf("Phdr_load(): alloc dataspace at physical address [%p], size [%lx]\n", phys_addr, phys_size);
mm->prog_attach_ds(l4_addr_t(paddr), size, mem, 0, r_flags, "attaching rw ELF segment");
printf("Phdr_load(): attaching rw ELF segment: prog_attach_ds [l4_addr(%p) paddr(%p), offs %lu, size %lu, all segs cow? %d]\n", l4_addr_t(paddr), paddr, offs, size, mm->all_segs_cow());
mm->copy_ds(mem, 0, bin, offs, fsz + page_offs);
}
else
{
// map from file
mm->prog_attach_ds(l4_addr_t(paddr), size, bin, offs,
r_flags | L4Re::Rm::Read_only,
"attaching ro ELF segment");
printf("Phdr_load(): map from file (attaching ro ELF segment), prog_attach_ds [paddr = %p (%p), offs %lu, size %lu, all segs cow? %d]\n", l4_addr_t(paddr), paddr, offs, size, mm->all_segs\
_cow());
}
}
L4 Bootstrapper
Build: #140 Fri Dec 11 16:15:21 CET 2015, 4.8.3 20140320 (prerelease)
Scanning up to 512 MB RAM, starting at offset 32MB
Memory size is 512MB (60000000 - 7fffffff)
RAM: 0000000060000000 - 000000007fffffff: 524288kB
Total RAM: 512MB
Scanning fiasco
Scanning sigma0
Scanning moe
Moving up to 7 modules behind 61100000
moving module 02 { 6110a000-6114363f } -> { 611fa000-6123363f } [235072]
moving module 01 { 61100000-6110938b } -> { 611f0000-611f938b } [37772]
moving module 00 { 610a8000-610fff17 } -> { 61198000-611eff17 } [360216]
moving module 06 { 6108e000-610a7597 } -> { 6117e000-61197597 } [103832]
moving module 05 { 6108d000-6108d28f } -> { 6117d000-6117d28f } [656]
moving module 04 { 61032000-6108cc1f } -> { 61122000-6117cc1f } [371744]
moving module 03 { 61010000-61031473 } -> { 61100000-61121473 } [136308]
Loading fiasco
Loading sigma0
Loading moe
find kernel info page...
found kernel info page at 0x60002000
Regions of list 'regions'
[ 60000000, 60000113] { 114} Root mbi_rt
[ 60001000, 60001aff] { b00} Kern fiasco
[ 60002000, 60066fff] { 65000} Kern fiasco
[ 60090000, 60096edf] { 6ee0} Sigma0 sigma0
[ 60098000, 6009e177] { 6178} Sigma0 sigma0
[ 60140000, 60172177] { 32178} Root moe
[ 60178000, 601934ab] { 1b4ac} Root moe
[ 61000000, 6100f537] { f538} Boot bootstrap
[ 61100000, 61197fff] { 98000} Root Module
API Version: (87) experimental
Sigma0 config ip:60090100 sp:00000000
Roottask config ip:60140260 sp:00000000
Starting kernel fiasco at 600012c8
Realview System ID: Rev=1 HBI=190 Build=f Arch=5 FPGA=00
Hello from Startup::stage2
Number of IRQs available at this GIC: 96
FPU0: Arch: VFPv3(3), Part: VFPv3(30), r: 0, v: 9, i: 41, t: hard, p: dbl/sngl
SERIAL ESC: allocated IRQ 37 for serial uart
Not using serial hack in slow timer handler.
Welcome to Fiasco.OC (arm)!
L4/Fiasco.OC arm microkernel (C) 1998-2013 TU Dresden
Rev: rexported compiled with gcc 4.8.3 for Realview []
Build: #202 Thu Dec 10 15:24:05 CET 2015
Calibrating timer loop... done.
MDB: use page size: 20
MDB: use page size: 12
SIGMA0: Hello!
KIP @ 60002000
allocated 4KB for maintenance structures
SIGMA0: Dump of all resource maps
RAM:------------------------
[4:60000000;60000fff]
[0:60067000;6008ffff]
[0:60097000;60097fff]
[0:6009f000;6013ffff]
[4:60140000;60172fff]
[0:60173000;60177fff]
[4:60178000;60193fff]
[0:60194000;610fffff]
[4:61100000;61197fff]
[0:61198000;7effffff]
IOMEM:----------------------
[0:0;5fffffff]
[0:80000000;ffffffff]
MOE: Hello world
MOE: found 506512 KByte free memory
MOE: found RAM from 60000000 to 7f000000
MOE: allocated 496 KByte for the page array @0x6009f000
MOE: virtual user address space [0-bfffffff]
MOE: rom name space cap -> [C:501000]
BOOTFS: [61100000-61121474] [C:503000] l4re
BOOTFS: [61122000-6117cc20] [C:504000] ned
BOOTFS: [6117d000-6117d290] [C:505000] hello.cfg
BOOTFS: [6117e000-61197598] [C:506000] hello
MOE: cmdline: moe rom/hello.cfg
MOE: Starting: rom/ned rom/hello.cfg
STACK: b1000000 (8000) KIP: affff000
Moe::Dataspace alloc app stack for moe, dataspace phys addr = 0 size = 6017d070
MOE: loading 'rom/ned'
Phdr_load(): map from file (attaching ro ELF segment), prog_attach_ds [paddr = 0xb0000000 (0xb0000000), offs 0, size 102400, all segs cow? 0]
Phdr_load(): alloc dataspace at physical address [(nil)], size [0]
Phdr_load(): attaching rw ELF segment: prog_attach_ds [l4_addr(0xb0020000) paddr(0xb0020000), offs 131072, size 28672, all segs cow? 0]
l4re_kernel:
ARGC=2
ARGV=b1007eb4
ENVP=b1007ec0
AUXP=b1007ec4
arg: 'rom/ned'
arg: 'rom/hello.cfg'
l4re_kernel -> Loader::start binary dataspace [phys @addr = 61122000] size = [5ac20]
STACK: 80000000 (8000) KIP: affff000
Phdr_load(): map from file (attaching ro ELF segment), prog_attach_ds [paddr = 0x1000000 (0x1000000), offs 0, size 331776, all segs cow? 0]
l4re_kernel: L4Re_app_model::alloc_ds dataspace phys @addr = [b0201e34] size = [b0010b58] flags 0
Phdr_load(): alloc dataspace at physical address [0x10d4], size [1000]
Phdr_load(): attaching rw ELF segment: prog_attach_ds [l4_addr(0x1058000) paddr(0x1058000), offs 360448, size 45056, all segs cow? 0]
Ned says: Hi World!
Ned: loading file: 'rom/hello.cfg'
STACK: b1000000 (8000) KIP: affff000
Phdr_load(): map from file (attaching ro ELF segment), prog_attach_ds [paddr = 0xb0000000 (0xb0000000), offs 0, size 102400, all segs cow? 0]
Phdr_load(): alloc dataspace at physical address [0x2a], size [1]
Phdr_load(): attaching rw ELF segment: prog_attach_ds [l4_addr(0xb0020000) paddr(0xb0020000), offs 131072, size 28672, all segs cow? 0]
STACK: b1000000 (8000) KIP: affff000
hello1 | l4re_kernel:
hello1 | ARGC=1
hello1 | ARGV=b1007f14
hello1 | ENVP=b1007f1c
hello1 | AUXP=b1007f20
hello1 | arg: 'rom/hello'
hello1 | l4re_kernel -> Loader::start binary dataspace [phys @addr = 6117e000] size = [19598]
hello1 | STACK: 80000000 (8000) KIP: affff000
hello1 | Phdr_load(): map from file (attaching ro ELF segment), prog_attach_ds [paddr = 0x1000000 (0x1000000), offs 0, size 90112, all segs cow? 0]
hello1 | l4re_kernel: L4Re_app_model::alloc_ds dataspace phys @addr = [b0201e34] size = [b0010b58] flags 0
hello1 | Phdr_load(): alloc dataspace at physical address [0x10d4], size [1000]
hello1 | Phdr_load(): attaching rw ELF segment: prog_attach_ds [l4_addr(0x1018000) paddr(0x1018000), offs 98304, size 32768, all segs cow? 0]
hello1 | Hello World!
Phdr_load(): map from file (attaching ro ELF segment), prog_attach_ds [paddr = 0xb0000000 (0xb0000000), offs 0, size 102400, all segs cow? 0]
Phdr_load(): alloc dataspace at physical address [0x2a], size [1]
Phdr_load(): attaching rw ELF segment: prog_attach_ds [l4_addr(0xb0020000) paddr(0xb0020000), offs 131072, size 28672, all segs cow? 0]
STACK: b1000000 (8000) KIP: affff000
Phdr_load(): map from file (attaching ro ELF segment), prog_attach_ds [paddr = 0xb0000000 (0xb0000000), offs 0, size 102400, all segs cow? 0]
Phdr_load(): alloc dataspace at physical address [0x2a], size [1]
Phdr_load(): attaching rw ELF segment: prog_attach_ds [l4_addr(0xb0020000) paddr(0xb0020000), offs 131072, size 28672, all segs cow? 0]
hello2 | l4re_kernel:
hello2 | ARGC=1
hello2 | ARGV=b1007f14
hello2 | ENVP=b1007f1c
hello2 | AUXP=b1007f20
hello2 | arg: 'rom/hello'
hello2 | l4re_kernel -> Loader::start binary dataspace [phys @addr = 6117e000] size = [19598]
hello2 | STACK: 80000000 (8000) KIP: affff000
hello2 | Phdr_load(): map from file (attaching ro ELF segment), prog_attach_ds [paddr = 0x1000000 (0x1000000), offs 0, size 90112, all segs cow? 0]
hello2 | l4re_kernel: L4Re_app_model::alloc_ds dataspace phys @addr = [b0201e34] size = [b0010b58] flags 0
hello2 | Phdr_load(): alloc dataspace at physical address [0x10d4], size [1000]
hello2 | Phdr_load(): attaching rw ELF segment: prog_attach_ds [l4_addr(0x1018000) paddr(0x1018000), offs 98304, size 32768, all segs cow? 0]
hello2 | Hello World!
STACK: b1000000 (8000) KIP: affff000
Phdr_load(): map from file (attaching ro ELF segment), prog_attach_ds [paddr = 0xb0000000 (0xb0000000), offs 0, size 102400, all segs cow? 0]
Phdr_load(): alloc dataspace at physical address [0x2a], size [1]
Phdr_load(): attaching rw ELF segment: prog_attach_ds [l4_addr(0xb0020000) paddr(0xb0020000), offs 131072, size 28672, all segs cow? 0]
hello4 | l4re_kernel:
hello4 | ARGC=1
hello4 | ARGV=b1007f14
hello4 | ENVP=b1007f1c
hello4 | AUXP=b1007f20
hello4 | arg: 'rom/hello'
hello4 | l4re_kernel -> Loader::start binary dataspace [phys @addr = 6117e000] size = [19598]
hello4 | STACK: 80000000 (8000) KIP: affff000
hello4 | Phdr_load(): map from file (attaching ro ELF segment), prog_attach_ds [paddr = 0x1000000 (0x1000000), offs 0, size 90112, all segs cow? 0]
hello4 | l4re_kernel: L4Re_app_model::alloc_ds dataspace phys @addr = [b0201e34] size = [b0010b58] flags 0
hello4 | Phdr_load(): alloc dataspace at physical address [0x10d4], size [1000]
hello4 | Phdr_load(): attaching rw ELF segment: prog_attach_ds [l4_addr(0x1018000) paddr(0x1018000), offs 98304, size 32768, all segs cow? 0]
hello4 | Hello World!
hello3 | l4re_kernel:
hello3 | ARGC=1
hello3 | ARGV=b1007f14
hello3 | ENVP=b1007f1c
hello3 | AUXP=b1007f20
hello3 | arg: 'rom/hello'
hello3 | l4re_kernel -> Loader::start binary dataspace [phys @addr = 6117e000] size = [19598]
hello3 | STACK: 80000000 (8000) KIP: affff000
hello3 | Phdr_load(): map from file (attaching ro ELF segment), prog_attach_ds [paddr = 0x1000000 (0x1000000), offs 0, size 90112, all segs cow? 0]
hello3 | l4re_kernel: L4Re_app_model::alloc_ds dataspace phys @addr = [b0201e34] size = [b0010b58] flags 0
hello3 | Phdr_load(): alloc dataspace at physical address [0x10d4], size [1000]
hello3 | Phdr_load(): attaching rw ELF segment: prog_attach_ds [l4_addr(0x1018000) paddr(0x1018000), offs 98304, size 32768, all segs cow? 0]
hello3 | Hello World!
hello1 | Hello World!
hello2 | Hello World!
hello4 | Hello World!
hello3 | Hello World!
hello1 | Hello World!
hello2 | Hello World!
hello4 | Hello World!
hello3 | Hello World!
hello1 | Hello World!
hello2 | Hello World!
hello4 | Hello World!
hello3 | Hello World!