init() is launched as a kernel_thread, similar to kftpd and khttpd. But the kernel doesn't need to wait for init() to exit (it never does), so there is no PID management required.

As for inter-thread communication, that's easy: variables within the kernel are GLOBALs, assuming one chooses the right parameters when creating the kernel_thread.

(under Linux, everything is a thread. Some threads share address spaces ("true threads"), and some don't ("processes")).

Cheers