The clock is implemented using Linux timers. These deliver SIGALRM or SIGVTALRM,depending on whether the interrupted process is the idle thread or not. The difference is that the idle thread sleeps while other threads don't, so it needs to receive SIGALRM. These signals get the same treatment as device interrupts - they are passed into the IRQ code for processing.