La función millis utiliza el Timer0 y una interrupción por desbordamiento de ese timer.
El timer se configura para un periodo de 1 Khz. Por ello, cuando desborda, se genera una interrupción y dentro de esa interrupción es donde se actualiza el timer0_millis.
En un pic se puede hacer usando el timer1 y el periodo. Lo ajustas para obtener un periodo de 1 Khz y cuando se produzca la interrupción incrementas en 1 una variable global de 32 bits que será el tiempo en ms transcurridos desde que diste alimentación al pic.
Saludos.