All device events happening during the boot process before the udev daemon is
running are lost, because the infrastructure to handle these events lives on
the root file system and is not available at that time. To cover that loss,
the kernel provides a
uevent file for every device in
the sysfs file system. By writing
add to that file, the
kernel resends the same event as the one lost during
boot. A simple loop over all
uevent files in
/sys triggers all events again to create the device
nodes and perform device setup.
As an example, a USB mouse present during boot may not be initialized by the early boot logic, because the driver is not available that time. The event for the device discovery was lost and failed to find a kernel module for the device. Instead of manually searching for possibly connected devices, udev just requests all device events from the kernel after the root file system is available, so the event for the USB mouse device just runs again. Now it finds the kernel module on the mounted root file system and the USB mouse can be initialized.
From userspace, there is no visible difference between a device coldplug sequence and a device discovery during runtime. In both cases, the same rules are used to match and the same configured programs are run.