When new process is started then special data structure is created by operating system which contains whatever information is needed to manage the process. This data structure is OS internal data, process cannot access it directly. It contains information like how many (and where) memory pages are allocated, what files are opened, threads, etc. But you interact with it by using various system API's (CreateFile, VirtualAlloc, CreateThread, etc...).
how can a program map itself into it's own address space?
This is not done by program itself, this is done by OS. When it allocated all that internal data structure, it maps exe file to memory in newly allocated process.