It's been a little while since I've read about this so someone correct me if I'm wrong.
Each core
mostly acts as if it is it's own isolated processor. The operating system has the job of deciding which core to give each process(technically a thread, a process is made up of one or more threads). Once a core as been assigned a thread it will solely work on that thread. This is because it is very difficult to have two cores work on the same thread without either computing things unnecessarily or just repeating things that the other core has already done.
For example. If you have a statement like:
if(a == b)
do(c)
else
do(d)
In this case, until a==b is computed, the program does not know whether 'do(c)' or 'do(d)' so while one core is computing a==b, the other core has nothing to do.( Side note: processors actually do try to predict what branch to take and then pre-compute it. Interestingly enough it is fairly effective even when all it does to predict is a little rule like 'always take the true if branches' or 'always compute while loops'. But there are much more complicated systems of predicting branches.)
The other reason core are usually very isolated is because of the inherent problems in sharing data(IE what if both cores change a variable at the same time. )
I'm sure there are little ways in which separate cores can cooperate but I would imagine they are specific situations. If I remember right there is something where separate cores can share registers and that can help but my memory on this is very fuzzy(and probably wrong).
So to summarize: The cores in a processor are mostly separate and do not work together very often(on a single thread). A program can be written to take advantage of all the cores but in that case there is just a separate thread created for each core for some specific job and the program merges all of the data. So in the end it is a software thing.
If you're interested in how processors work on a high level I recommend
Inside The Machine. It only goes up to the core 2 duo but the concepts are very interesting mostly still relevant.
If you're interesting in how operating systems schdule tasks like I described and how multi-core processors are handled by the operating sytems then I recommend
Operating System Concepts. This is a long book and not very much of it actually about this topic. But it is still an excellent book if you're interested in the jobs that operating systems have to do and how they do them.
I hope that made sense.