Search code examples
ctimesolarisunix-timestamphigh-resolution-clock

get process start time in kernel module solaris


I am trying to get process start time in kernel module.
I get the proc struct pointer, and from the proc I take field p_mstart ()

typedef struct  proc {
.....
/*
* Microstate accounting, resource usage, and real-time profiling
*/
hrtime_t p_mstart;      /* hi-res process start time */

this return me the number: 1976026375725303

struct proc* iterated_process_ptr = curproc
LOG("***KERNEL***: PID=%d, StartTime=%lld",iterated_process_ptr->p_pidp->pid_id, iterated_process_ptr->p_mstart);

What is this number ? In the documentation solaris write:

The gethrtime() function returns the current high-resolution real time. Time is expressed as nanoseconds since some arbitrary time in the past.

And in the book Solaris Internals they write:

Within the process, the operating system maintains a high-resolution teimstamp that marks process start and terminate times, A p_mstart field, the process start time, is set in the kernel fork() code when the process is created.... it return 64-bit value expressed in nanosecond

The number 1976026375725303 does not make sense at all.
If i divide by 1,000,000,000 and then by 3600 in order to get hours, i get 528 hours, 22 days, but my uptime is 5 days..


Solution

  • Based on answer received at google group: comp.unix.solaris.

    Instead of going to proc -> p_mstart

    I need to take

    iterated_process_ptr ->p_user.u_start  
    

    This bring me the same struct (timestruc_t) as userspace

    typedef struct psinfo {  
    
    psinfo ->pr_start;  /* process start time, from the epoch */