According to the MP spec:
One processor runs at boot time, the BSP (Boot System Processor). All
other CPUs, APs (Application Processors), are disabled either by
hardware or the BIOS (or both). The APs have to be enabled by the OS
(hence AT compatibility), via APIC IPIs (INIT & STARTUP). Before
enabling, they are in a halt state with interrupts disabled (however
INIT & STARTUP IPIs are not masked).
So the rest of the logical CPUs are started up by sending them Inter-Processor Interrupts, after putting some code wherever it is they will try to run code from.
It's probably more useful to think of it in terms of programming the APIC (Advanced Programmable Interrupt Controller) to deliver an interrupt to the other cores to wake them up. The ACPI tables provide the necessary information to decide exactly what to do. (Thanks to Ross Ridge for the clarification: this is done with normal store instructions into MMIO space).
This should be sufficient for a conceptual understanding of how it works, rather than to actually implement it yourself for a custom OS. As Michael Petch commented earlier, Ciro Santilli's answer on a similar question has some specific code which deals with some of the complications.