Why x86 apps cannot run on ARM processors?

Solution 1:

In this case, the kernel does less than you expect it does. In particular, the kernel does not translate/parse/interpret/mangle the machine code a compiled binary is made of.

when someone compiles source code into a binary, what they are doing is really translating that source code into machine code instructions that the CPU understands.

One of the things that makes x86 a platform, is a shared Instruction Set across all compatible hardware. That way, a compiler can expect that any x86 CPU will understand the PUSH instruction and do the expected thing when you execute it via a thread.

ARM uses a different instruction set. In this case, the source code needs to be compiled (translated) into instructions an ARM CPU can understand (instructions defined in it's instruction set).

Not all programs use "native" binaries (binaries that consist exclusively of well formed instructions that are implemented by the CPUs instruction set). languages like Java and C# compile to a virtual assembly language, and are JIT compiled to native instructions at runtime. Others use interpreters that have been customized for a given platform.

So in sum, ARM CPUs do not recognize the language that x86 compiled programs use and vice versa. While the Kernel will control things like hardware access and CPU scheduling, it does not change the instructions of the programs executing on the system. it just creates the process, kicks off execution, and grants execution time on the CPU, so that many processes can share it semi-simultaneously.