I've been wondering for a while about how a user-level server is able to communicate with another server(file server, memory server, etc...) when it first loads.
How is it possible for the server to send messages if it doesn't know where to send them? Also, how can the server know if other servers even exist?
Sending messages to servers
Those are the common approaches. What you're really looking for (in true Computer-Science overgeneralization) is a namespace of server processes wherein any process can look up a server process to perform some task.
Note that the namespace need not be global. You can quite easily give each process its own namespace if you like, as long as the names all eventually map to identifiers in some global namespace. Plan 9 took an approach a bit like this, giving every process its own "file-system" full of "files" representing various system resources under various names.
You can also choose to support or not support aliasing. You could have a name refer to another name, which refers to another name. That could continue with arbitrary depth until either a cycle is formed or a globally-valid identifier is reached.
Heck, you could also put resources other than server processes into the namespace. Plan 9 did.
And yes, these are legitimate design decisions you should make. Not making them leads to kludging things on later, or rewriting. Not one line of my kernel survives from the original version, and I can tell you that making up for an earlier lack of design is not a pleasant task.
Note that the namespace need not be global. You can quite easily give each process its own namespace if you like, as long as the names all eventually map to identifiers in some global namespace. Plan 9 took an approach a bit like this, giving every process its own "file-system" full of "files" representing various system resources under various names.
You can also choose to support or not support aliasing. You could have a name refer to another name, which refers to another name. That could continue with arbitrary depth until either a cycle is formed or a globally-valid identifier is reached.
Heck, you could also put resources other than server processes into the namespace. Plan 9 did.
And yes, these are legitimate design decisions you should make. Not making them leads to kludging things on later, or rewriting. Not one line of my kernel survives from the original version, and I can tell you that making up for an earlier lack of design is not a pleasant task.