3 ms·
Not having MMU means there's no virtual memory and instructions refer to physical memory addresses, cmiiw? You say Linux won't work without MMU, it can't handl
by jimmyed 6y ago
Not having MMU means there's no virtual memory and instructions refer to physical memory addresses, cmiiw?
You say Linux won't work without MMU, it can't handle physical addresses? Moreover, why won't fork() work without MMU?
- aduitsis 6y agoI would hazard a guess that fork is nowadays implemented by the clone(2) system call, which does use copy-on-write depending on its arguments. It's possible that there are deep assumptions in the Linux code that some fundamental software or hardware memory handling capabilities are present.
- pjc50 6y agoWithout an MMU, you can't do paging. That means fork() cannot do the normal copy-on-write business, because there's no page table to copy the entries in. You also have no inter-process security, so everything can crash everything else including the kernel, and no swap. It used to be the case that all Linux executables had to be loaded at the same virtual address, but ASLR may have removed requirements of this kind. https://stackoverflow.com/questions/38549972/why-elf-executables-have-a-fixed-load-address https://stackoverflow.com/questions/38549972/why-elf-executa...
- kragen 6y agoI'm pretty sure Linux ELF has always allowed you to specify the initial load address. When I first wrote StoneKnifeForth https://github.com/kragen/stoneknifeforth https://github.com/kragen/stoneknifeforth its load address was 0x1000, but at some point Linux stopped allowing load addresses lower than 0x10000 by default (vm.mmap_min_addr). I originally wrote it in 02008, using the lower load address, and fixed it in 02017. It's still not using 0x804800 like normal executables but 0x20000. ASLR does not affect this. Maybe you mean that before ELF support, Linux a.out executables had to be loaded at a fixed virtual address? That's possible—I started using Linux daily in 01995, at which point a.out was already only supported for backward compatibility.
- kragen 6y ago> Not having MMU means there's no virtual memory and instructions refer to physical memory addresses, cmiiw? Pretty much, yeah. > You say Linux won't work without MMU, it can't handle physical addresses? Moreover, why won't fork() work without MMU? When httpdito fork()s two child processes, each of them starts receiving the HTTP request into the request buffer at `buf`. This works because the semantics of fork() give those two children two different buffers at the same memory address, one in each process's address space. The Linux userland relies relatively heavily on these semantics. It was a major obstacle to getting an SSH server running on cisco IOS, for example. An event-driven server like darkhttpd is a much better fit for an MMUless system. Implementing multithreading is easy (it's half a page of assembly) but implementing memory mapping without an MMU requires some kind of interpreter. (Actually you can implement fork() without virtual memory and without an MMU, for example with PDP-11-style segmentation, but the Cortex-M0+ doesn't have any of those facilities either.)
- bogomipz 6y ago>"The Linux userland relies relatively heavily on these semantics. It was a major obstacle to getting an SSH server running on cisco IOS, for example." Can you elaborate on this? Hasn't Cisco IOS at various times run on MIPS and X86 processors?
- kragen 6y agoUnfortunately I'm just reporting secondhand rumors from people who worked at cisco, and I probably should have made that clear. So I don't know how IOS works at the machine-instruction level, just the command line.
- icedchai 6y agoThe original Cisco IOS ran on 68000 series processors which lacked an MMU. Even the later 68K models used an "embedded" version of a processor which did not have an MMU. For example, the Cisco 2500 used a 680EC30. Regular 68030s had MMUs, but the "EC" model did not. Later versions did run on MIPS though.
- 6y ago