A computer-implemented method to schedule one or more operating system threads through a hypervisor that manages heterogeneous processing cores, the method comprising: presenting, by a hypervisor, based on a hypervisor policy, one or more virtual cores to an operating system, wherein each virtual core isolates the operating system from one or more capability differences between physical processing cores accessible to a computing device; receiving a thread scheduling request from the operating system to run instructions of a thread on an identified virtual core of the one or more virtual cores presented by the hypervisor, comprising receiving a virtual core identification from the operating system that identifies the virtual core to which the operating system requests to schedule the thread, wherein the thread is an application thread or a thread associated with an internal operation of the operating system; determining one or more processing needs of the received scheduling request; accessing a scheduling policy that specifies one or more goals for operating the computing device; selecting, regardless of the particular virtual core that the operating system selects for executing a thread, a physical processing core on which to execute the thread associated with the received scheduling request, wherein the selection is made based on the accessed scheduling policy; handling one or more capability differences between the thread and the selected physical processing core, comprising emulating an instruction that is not available on the selected physical processing core or replacing an instruction that is not available on the selected physical processing core with one or more equivalent instructions that are supported by the selected physical processing core; and scheduling the thread to execute on the selected physical processing core. presenting, by a hypervisor, based on a hypervisor policy, one or more virtual cores to an operating system, wherein each virtual core isolates the operating system from one or more capability differences between physical processing cores accessible to a computing device; receiving a thread scheduling request from the operating system to run instructions of a thread on an identified virtual core of the one or more virtual cores presented by the hypervisor, comprising receiving a virtual core identification from the operating system that identifies the virtual core to which the operating system requests to schedule the thread, wherein the thread is an application thread or a thread associated with an internal operation of the operating system; determining one or more processing needs of the received scheduling request; accessing a scheduling policy that specifies one or more goals for operating the computing device; selecting, regardless of the particular virtual core that the operating system selects for executing a thread, a physical processing core on which to execute the thread associated with the received scheduling request, wherein the selection is made based on the accessed scheduling policy; handling one or more capability differences between the thread and the selected physical processing core, comprising emulating an instruction that is not available on the selected physical processing core or replacing an instruction that is not available on the selected physical processing core with one or more equivalent instructions that are supported by the selected physical processing core; and scheduling the thread to execute on the selected physical processing core.