w4linux — внешний (external) проект WrmOS, содержащий паравиртуализированное ядро Linux и пользовательское окружение Busybox. Данный проект позволяет совмещать real-time часть проекта (например Machine Control) и всё богатство програмного обеспечения, предоставляемое Linux'ом (например драйверы, веб-сервисы, телекоммуникационные протоколы и т.д.). Эта статья описывает как собрать и запустить проект w4linux.
Содержание 1. Сборка и запуск w4linux
1. Сборка и запуск w4linux [наверх]
Шаг 1.1. Получить кроссплатформенный тулчейн
Подробную информацию смотрите в статье Как получить тулчейн.
Шаг 1.2. Получить исходники WrmOS
Клонировать репозиторий из github:
git clone https://github.com/wrmlab/wrmos.git
или загрузить zip архив.
Шаг 1.3. Получить исходники w4linux
Клонировать репозиторий из github:
git clone https://github.com/wrmlab/w4linux.git
или загрузить zip архив.
Шаг 1.4. Собрать проект w4linux
Запустить сборку проекта w4linux для архитектуры SPARC и платформы LEON3 (это может занять несколько минут):
cd w4linux make build P=cfg/prj/linux-qemu-leon3.prj W=../wrmos B=../build/linux-qemu-leon3 -j
В результате мы получим образ загрузчика с файловой системой, содержащей исполняемый файл приложения linux.elf:
ls ../build/linux-qemu-leon3/ldr/bootloader.elf
Шаг 1.5. Запустить w4linux на виртуальной машине QEMU
qemu-system-sparc -M leon3_generic -display none -serial stdio \ -kernel ../build/linux-qemu-leon3/ldr/bootloader.elf
В результате мы увидим следующий вывод:
[ldr] _ _ ___ __ __ ___ ___ [ldr] | | | | _ \ \/ | / _ \/ __| [ldr] | |/\| | / |\/| || (_) \__ \ [ldr] |__/\__|_|_\_| |_(_)___/|___/ [ldr] From Russia with love! [ldr] [ldr] cpu #0/1 ready, sp=0x4069c4c8. [ldr] [ldr] hello: 13:57:16 Jun 5 2018. [ldr] gccver: 7.3.0. [ldr] hware: sparc, leon3, qemu, qemu_leon3. [ldr] ram: [0x40000000 - 0x48000000) 128 MB. [ldr] ramfs: [0x40292000 - 0x40690000) 4088 KB. [ldr] ## name data size content [ldr] 1 kernel.elf 0x40293000 373468 'ELF ...' [ldr] 2 sigma0.elf 0x402ee2dc 43180 'ELF ...' [ldr] 3 roottask.elf 0x402f8b88 153140 'ELF ...' [ldr] 4 config.alph 0x4031e1bc 1475 '# config ...' [ldr] 5 uart.elf 0x4031f000 83944 'ELF ...' [ldr] 6 console.elf 0x40334000 116444 'ELF ...' [ldr] 7 linux.elf 0x40351000 3396528 'ELF ...' [ldr] [ldr] elf: foreach: elf=0x40293000, sz=0x5b2dc. [ldr] app=kernel, va=0x40000000, pa=0x40000000, sz=0x00001000, load=1. [ldr] app=kernel, va=0xf0020000, pa=0x40020000, sz=0x00201000, load=1. [ldr] app=kernel, va=0x00000000, pa=0x00000000, sz=0x00000000, load=0. [ldr] elf: foreach: elf=0x402ee2dc, sz=0xa8ac. [ldr] app=sigma0, addr=0x00000000, sz=0x00000000, acc=0, progbits=0, name=. [ldr] app=sigma0, addr=0x40221000, sz=0x00006000, acc=5, progbits=1, name=.text. [ldr] app=sigma0, addr=0x40227000, sz=0x00001000, acc=4, progbits=1, name=.rodata. [ldr] app=sigma0, addr=0x40228000, sz=0x00001000, acc=6, progbits=1, name=.data. [ldr] app=sigma0, addr=0x40229000, sz=0x00004000, acc=6, progbits=1, name=.bss. [ldr] app=sigma0, addr=0x00000000, sz=0x00000010, acc=0, progbits=0, name=.gnu.attributes. [ldr] app=sigma0, addr=0x00000000, sz=0x00000b10, acc=0, progbits=0, name=.symtab. [ldr] app=sigma0, addr=0x00000000, sz=0x00000bdf, acc=0, progbits=0, name=.strtab. [ldr] app=sigma0, addr=0x00000000, sz=0x00000044, acc=0, progbits=0, name=.shstrtab. [ldr] app=sigma0, va=0x40221000, pa=0x40221000, sz=0x0000c000, load=1. [ldr] elf: foreach: elf=0x402f8b88, sz=0x25634. [ldr] app=roottask, addr=0x00000000, sz=0x00000000, acc=0, progbits=0, name=. [ldr] app=roottask, addr=0x4022d000, sz=0x0001b000, acc=5, progbits=1, name=.text. [ldr] app=roottask, addr=0x40248000, sz=0x00004000, acc=4, progbits=1, name=.rodata. [ldr] app=roottask, addr=0x4024c000, sz=0x00001000, acc=6, progbits=1, name=.data. [ldr] app=roottask, addr=0x4024d000, sz=0x00044000, acc=6, progbits=1, name=.bss. [ldr] app=roottask, addr=0x40291000, sz=0x00001000, acc=6, progbits=1, name=.stack. [ldr] app=roottask, addr=0x00000000, sz=0x00000010, acc=0, progbits=0, name=.gnu.attributes. [ldr] app=roottask, addr=0x00000000, sz=0x00001780, acc=0, progbits=0, name=.symtab. [ldr] app=roottask, addr=0x00000000, sz=0x00002cc9, acc=0, progbits=0, name=.strtab. [ldr] app=roottask, addr=0x00000000, sz=0x0000004b, acc=0, progbits=0, name=.shstrtab. [ldr] app=roottask, va=0x4022d000, pa=0x4022d000, sz=0x00065000, load=1. [ldr] memory regions: [ldr] [40000000 - 40001000) sz=0x00001000, kernel. [ldr] [40020000 - 40221000) sz=0x00201000, kernel. [ldr] [40221000 - 4022d000) sz=0x0000c000, sigma0. [ldr] [4022d000 - 40292000) sz=0x00065000, roottask. [ldr] [40690000 - 4069d000) sz=0x0000d000, bootloader. [ldr] [4069d000 - 48000000) sz=0x07963000, free. [ldr] elf: foreach: elf=0x40293000, sz=0x5b2dc. [ldr] load: loc=0x40294000, pa=0x40000000, sz=0x00001000, load=1. [ldr] load: loc=0x40295000, pa=0x40020000, sz=0x00201000, load=1. [ldr] load: loc=0x40293000, pa=0x00000000, sz=0x00000000, load=0. [ldr] elf: foreach: elf=0x402ee2dc, sz=0xa8ac. [ldr] load: loc=0x402ef2dc, pa=0x40221000, sz=0x0000c000, load=1. [ldr] elf: foreach: elf=0x402f8b88, sz=0x25634. [ldr] load: loc=0x402f9b88, pa=0x4022d000, sz=0x00065000, load=1. [ldr] KIP found at 0x40020000. [ldr] Go to kernel. [----:0.000000] kernel: cpu #0 hello, sp=0xf006cf00. [sgm0:0.006661] inf: hello. [sgm0:0.009527] inf: free memory = 0x7970000. [alph:0.055043] inf: hello. [alph:0.060676] inf: get memory from sigma0. [alph:0.269694] inf: got memory: 0x7970000 bytes. [alph:0.272740] inf: Project config: [alph:0.273016] inf: Board config: [alph:0.273273] inf: ## device paddr size irq [alph:0.273630] inf: 0 uart 0x80000100 0x00000100 3 [alph:0.274062] inf: Memory config: [alph:0.274340] inf: ## name size cached contig [alph:0.274775] inf: Apps config: [alph:0.275124] inf: [0] [alph:0.275363] inf: name: uart [alph:0.275659] inf: short_name: uart [alph:0.275955] inf: file: ramfs:/uart.elf [alph:0.276307] inf: stack_sz: 0x1000 [alph:0.276672] inf: heap_sz: 0x4000 [alph:0.276978] inf: max_aspaces: 1 [alph:0.277269] inf: max_threads: 3 [alph:0.277559] inf: max_prio: 120 [alph:0.277854] inf: fpu: 0 [alph:0.278157] inf: malloc_strategy: on_startup [alph:0.278477] inf: devices: 0 [alph:0.278765] inf: memory: [alph:0.279047] inf: args: uart [alph:0.279362] inf: [1] [alph:0.279594] inf: name: console [alph:0.279892] inf: short_name: cons [alph:0.280208] inf: file: ramfs:/console.elf [alph:0.280537] inf: stack_sz: 0x1000 [alph:0.280830] inf: heap_sz: 0x4000 [alph:0.281126] inf: max_aspaces: 1 [alph:0.281405] inf: max_threads: 3 [alph:0.281697] inf: max_prio: 110 [alph:0.281983] inf: fpu: 0 [alph:0.282282] inf: malloc_strategy: on_startup [alph:0.282587] inf: devices: [alph:0.282864] inf: memory: [alph:0.283139] inf: args: [alph:0.283414] inf: [2] [alph:0.283644] inf: name: linux [alph:0.283935] inf: short_name: lx [alph:0.284216] inf: file: ramfs:/linux.elf [alph:0.284537] inf: stack_sz: 0x1000 [alph:0.284866] inf: heap_sz: 0x40000 [alph:0.285231] inf: max_aspaces: 9 [alph:0.285570] inf: max_threads: 22 [alph:0.285918] inf: max_prio: 100 [alph:0.286284] inf: fpu: 0 [alph:0.286635] inf: malloc_strategy: on_startup [alph:0.287013] inf: devices: [alph:0.287350] inf: memory: [alph:0.287689] inf: args: [alph:0.288061] inf: get iospace from sigma0. [alph:0.289429] inf: got iospace from sigma0. [alph:0.290195] inf: prepare named memory regions for apps. [alph:0.290967] inf: prepared named memory regions for apps. [alph:0.291404] inf: create app=uart. [alph:0.300403] inf: create app=console. [alph:0.303546] inf: create app=linux. [uart:0.374879] inf: hello. [uart:0.377880] inf: argc=2, argv=0xff2000. [uart:0.378609] inf: arg[0] = uart. [uart:0.378880] inf: arg[1] = uart. [uart:0.379183] inf: myid=131. [uart:0.381028] inf: map_io: addr=0x70000100, sz=0x100. [uart:0.385900] inf: create_thread: rc=0, id=132. [uart:0.387753] inf: create_thread: rc=0, id=133. [u-tx:0.388715] inf: tx: hello: tx_thread. [u-tx:0.389091] inf: tx: myid=132. [u-rx:0.390172] inf: rx: hello: rx_thread. [u-rx:0.390560] inf: rx: myid=133. [u-hw:0.391376] inf: attach_int: dev=uart, irq=3. [u-tx:0.392104] inf: attach: thread 'uart-tx-stream' is registered, key: 5f1e5/5f1fe. [u-tx:0.392641] inf: attach: wait attach msg. [u-rx:0.393106] inf: attach: thread 'uart-rx-stream' is registered, key: 5f781/5f797. [u-rx:0.393625] inf: attach: wait attach msg. [cons:0.444318] inf: hello: myid=134. [cons:0.453151] inf: create_thread: rc=0, id=135. [cons:0.455107] inf: create_thread: rc=0, id=136. [c-dr:0.456121] inf: drv: myid=135. [c-dr:0.457696] inf: attach: got id=132, for thread 'uart-tx-stream', key: 5f1e5/5f1fe. [u-tx:0.458540] inf: attach: attached to 135. [u-tx:0.458948] inf: tx: attached to client=135 [c-cl:0.461121] inf: cli: myid=136. [c-dr:0.461918] inf: attach: got id=133, for thread 'uart-rx-stream', key: 5f781/5f797. [u-rx:0.462655] inf: attach: attached to 135. [u-rx:0.463056] inf: rx: attached to client=135 [c-cl:0.463636] inf: cli: thread 'console-server' is registered, key: 70b66/70b7d. [ lx:0.524237] inf: hello. [ lx:0.534241] inf: argc=0x1, argv=0x00fbe000. [ lx:0.535144] inf: arg[0] = linux. [ lx:0.538623] inf: App attached to system console. [ lx:0.539806] inf: create_threads: vcpu 0 ... [ lx:0.542869] inf: create_thread: kernel-mapper ... [ lx:0.547448] inf: stack_va=0xe0000000, stack_sz=0x1000. [ lx:0.550763] inf: rc=0, id=138. [ lx:0.551957] inf: create_thread: kernel-exc thread ... [ lx:0.553232] inf: stack_va=0xe0002000, stack_sz=0x1000. [ lx:0.555176] inf: rc=0, id=139. [ lx:0.556335] inf: create_thread: kernel thread ... [ lx:0.557545] inf: stack_va=0xe0004000, stack_sz=0x1000. [ lx:0.559484] inf: rc=0, id=140. [ lx:0.561105] inf: create_thread: pager thread ... [ lx:0.562352] inf: stack_va=0xe0006000, stack_sz=0x1000. [ lx:0.564336] inf: rc=0, id=141. [ lx:0.565583] inf: create_task: user task ... [ lx:0.566798] inf: stack_va=0xe0008000, stack_sz=0x1000. [ lx:0.569876] inf: rc=0, id=142. [ lx:0.571114] inf: create_thread: user-mapper thread ... [ lx:0.572350] inf: stack_va=0xe0009000, stack_sz=0x1000. [ lx:0.574353] inf: rc=0, id=143. [ lx:0.575512] inf: create_task: user task ... [ lx:0.576649] inf: stack_va=0xe000d000, stack_sz=0x1000. [ lx:0.579298] inf: rc=0, id=144. [ lx:0.580463] inf: create_thread: user-mapper thread ... [ lx:0.581691] inf: stack_va=0xe0010000, stack_sz=0x1000. [ lx:0.583557] inf: rc=0, id=145. [ lx:0.584687] inf: create_task: user task ... [ lx:0.585889] inf: stack_va=0xe0012000, stack_sz=0x1000. [ lx:0.588631] inf: rc=0, id=146. [ lx:0.589785] inf: create_thread: user-mapper thread ... [ lx:0.590999] inf: stack_va=0xe0013000, stack_sz=0x1000. [ lx:0.592871] inf: rc=0, id=147. [ lx:0.594009] inf: create_task: user task ... [ lx:0.595156] inf: stack_va=0xe0017000, stack_sz=0x1000. [ lx:0.597980] inf: rc=0, id=148. [ lx:0.599152] inf: create_thread: user-mapper thread ... [ lx:0.600383] inf: stack_va=0xe001a000, stack_sz=0x1000. [ lx:0.602273] inf: rc=0, id=149. [ lx:0.603405] inf: create_task: user task ... [ lx:0.604555] inf: stack_va=0xe001c000, stack_sz=0x1000. [ lx:0.607222] inf: rc=0, id=150. [ lx:0.608354] inf: create_thread: user-mapper thread ... [ lx:0.609570] inf: stack_va=0xe001d000, stack_sz=0x1000. [ lx:0.611468] inf: rc=0, id=151. [ lx:0.612597] inf: create_task: user task ... [ lx:0.613735] inf: stack_va=0xe0021000, stack_sz=0x1000. [ lx:0.616408] inf: rc=0, id=152. [ lx:0.617538] inf: create_thread: user-mapper thread ... [ lx:0.618724] inf: stack_va=0xe0024000, stack_sz=0x1000. [ lx:0.620610] inf: rc=0, id=153. [ lx:0.621751] inf: create_task: user task ... [ lx:0.622912] inf: stack_va=0xe0026000, stack_sz=0x1000. [ lx:0.625592] inf: rc=0, id=154. [ lx:0.626767] inf: create_thread: user-mapper thread ... [ lx:0.627969] inf: stack_va=0xe0027000, stack_sz=0x1000. [ lx:0.629844] inf: rc=0, id=155. [ lx:0.631022] inf: create_task: user task ... [ lx:0.632156] inf: stack_va=0xe002b000, stack_sz=0x1000. [ lx:0.634840] inf: rc=0, id=156. [ lx:0.636042] inf: create_thread: user-mapper thread ... [ lx:0.637396] inf: stack_va=0xe002e000, stack_sz=0x1000. [ lx:0.639280] inf: rc=0, id=157. [ lx:0.640471] inf: create_thread: console input thread ... [ lx:0.641737] inf: stack_va=0xe0030000, stack_sz=0x1000. [ lx:0.643608] inf: rc=0, id=158. [l-in:0.646020] inf: hello: console_input_thread, param=0x0. [l-in:0.647350] inf: my global_id=158. [l-m0:0.653399] inf: hello: mapper_thread, krn=1. [l-m0:0.658582] inf: my global_id=138. [l-U0:0.668453] inf: hello: mapper_thread, krn=0. [l-U0:0.668894] inf: hello: mapper_thread, krn=0. [l-U0:0.669339] inf: hello: mapper_thread, krn=0. [l-U0:0.669803] inf: hello: mapper_thread, krn=0. [l-U0:0.670285] inf: hello: mapper_thread, krn=0. [l-U0:0.670732] inf: hello: mapper_thread, krn=0. [l-U0:0.671177] inf: hello: mapper_thread, krn=0. [l-U0:0.671621] inf: hello: mapper_thread, krn=0. [l-U0:0.725776] inf: my global_id=143. [l-U0:0.726895] inf: my global_id=145. [l-U0:0.728018] inf: my global_id=147. [l-U0:0.729118] inf: my global_id=149. [l-U0:0.730263] inf: my global_id=151. [l-U0:0.731367] inf: my global_id=153. [l-U0:0.732456] inf: my global_id=155. [l-U0:0.733539] inf: my global_id=157. [l-e0:0.735421] inf: hello: kernel_thread, exch_level=2. [l-k0:0.736588] inf: hello: kernel_thread, exch_level=1. [l-p0:0.737743] inf: hello: upager_thread. [l-e0:0.740094] inf: my global_id=139. [l-k0:0.741194] inf: my global_id=140. [l-p0:0.742437] inf: my global_id=141. [l-u0:0.749607] inf: hello: user_thread, param=0x0. [l-u0:0.751499] inf: hello: user_thread, param=0x0. [l-u0:0.752700] inf: hello: user_thread, param=0x0. [l-u0:0.753858] inf: hello: user_thread, param=0x0. [l-u0:0.755048] inf: hello: user_thread, param=0x0. [l-u0:0.756211] inf: hello: user_thread, param=0x0. [l-u0:0.757397] inf: hello: user_thread, param=0x0. [l-u0:0.758658] inf: hello: user_thread, param=0x0. [l-u0:0.759842] inf: my global_id=142. [l-u0:0.760977] inf: my global_id=144. [l-u0:0.762039] inf: my global_id=146. [l-u0:0.763098] inf: my global_id=148. [l-u0:0.764223] inf: my global_id=150. [l-u0:0.765371] inf: my global_id=152. [l-u0:0.766504] inf: my global_id=154. [l-u0:0.767616] inf: my global_id=156. [l-u0:0.768793] inf: switch to kernel. [l-u0:0.769877] inf: switch to kernel. [l-u0:0.771005] inf: switch to kernel. [l-u0:0.772112] inf: switch to kernel. [l-u0:0.773359] inf: switch to kernel. [l-u0:0.774450] inf: switch to kernel. [l-u0:0.775549] inf: switch to kernel. [l-u0:0.776642] inf: switch to kernel. [l-k0:0.778432] inf: wait_msg_loop: suspend usr thread id=142. [l-k0:0.780842] inf: wait_msg_loop: suspend usr thread id=144. [l-k0:0.782122] inf: wait_msg_loop: suspend usr thread id=146. [l-k0:0.783385] inf: wait_msg_loop: suspend usr thread id=148. [l-k0:0.784659] inf: wait_msg_loop: suspend usr thread id=150. [l-k0:0.785892] inf: wait_msg_loop: suspend usr thread id=152. [l-k0:0.787125] inf: wait_msg_loop: suspend usr thread id=154. [l-k0:0.788403] inf: sp_bank[0].base_addr=0xd0000000, sp_bank[0].num_bytes=0x1392000. [ 0.000000] Linux version 4.12.1 (worm@comp) (gcc version 7.3.0 (Buildroot 2018.02.2) ) #3 Tue Jun 5 13:57:13 MSK 2018 [ 0.000000] bootconsole [earlyprom0] enabled [ 0.000000] ARCH: [ 0.000000] SUN4M IDPROM: Warning, unknown format type! IDPROM: Warning, bogus id_machtype value, 0x0 [ 0.000000] Ethernet address: 00:00:00:00:00:00 [ 0.000000] bootmem_init: hello. [ 0.000000] bootmem_init: done. [ 0.000000] Built 1 zonelists in Zone order, mobility grouping off. Total pages: 8110 [ 0.000000] Kernel command line: console=ttyWrm0 [ 0.000000] PID hash table entries: 64 (order: -4, 256 bytes) [ 0.000000] Dentry cache hash table entries: 2048 (order: 1, 8192 bytes) [ 0.000000] Inode-cache hash table entries: 1024 (order: 0, 4096 bytes) [ 0.000000] Sorting __ex_table... [ 0.000000] Memory: 13872K/16380K available (1867K kernel code, 94K rwdata, 0K rodata, 880K init, 467K bss, 2508K reserved, 0K cma-reserved, 0K highmem) [ 0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 [ 0.000000] NR_IRQS:64 [ 0.000000] init_IRQ: hello. [ 0.000000] leon_init_timers: HZ=100, irq=10. [ 0.000000] leon_unmask_irq: IMPLME. [ 0.000000] console [ttyWrm0] enabled [ 0.000000] console [ttyWrm0] enabled [ 0.000000] bootconsole [earlyprom0] disabled [ 0.000000] bootconsole [earlyprom0] disabled [ 0.000000] Console: colour dummy device 80x25 [ 0.000000] clocksource: timer_cs: mask: 0xffffffffffffffff max_cycles: 0x1358c14ce, max_idle_ns: 57775908723750000 ns [ 0.080000] Calibrating delay loop... 4272.12 BogoMIPS (lpj=21360640) [ 0.080000] pid_max: default: 32768 minimum: 301 [ 0.080000] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes) [ 0.080000] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes) [ 0.100000] devtmpfs: initialized [ 0.100000] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns [ 0.100000] wrmos-uart 00000000: w4con_uart_probe: uart(0) driver initialized. [ 0.100000] clocksource: Switched to clocksource timer_cs [ 0.200000] workingset: timestamp_bits=30 max_order=12 bucket_order=0 [ 0.210000] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 252) [ 0.210000] io scheduler noop registered [ 0.210000] io scheduler deadline registered [ 0.210000] io scheduler cfq registered (default) [ 0.210000] io scheduler mq-deadline registered [ 0.210000] io scheduler kyber registered [ 0.260000] leon: power management initialized [ 0.260000] hctosys: unable to open rtc device (rtc0) [ 0.260000] leon_unmask_irq: IMPLME. [ 0.260000] Freeing unused kernel memory: 880K [ 0.260000] This architecture does not have kernel memory protection. Starting logging: OK Initializing random number generator... [ 1.470000] random: dd: uninitialized urandom read (512 bytes read) done. Welcome to Buildroot buildroot login:
Step 1.6. Работа в Linux shell
В результате загрузки вы увидите приглашение залогиниться:
... Welcome to Buildroot buildroot login:
Введите имя пользователя "root" и вы получите доступ к busybox shell:
... Welcome to Buildroot buildroot login: root Jan 1 00:00:52 login[37]: root login on 'console' # # ls / bin init linuxrc opt run tmp dev lib media proc sbin usr etc lib32 mnt root sys var # # cat /proc/cpuinfo cpu : wrm.os virtual CPU vendor : WrmLab version : 0.01 (experimental) fpu : yes #
- Войдите или зарегистрируйтесь, чтобы оставлять комментарии