The normal stack is what you describe. This is where the basic opcodes take their operands.
The call stack is in relation to calls between contracts.
You see, when you send a transaction to a smart contract, the execution there starts with an empty memory and an empty normal stack.
- That is true when you sign a transaction and send it to a contract.
- That is also true when your contract A creates a transaction to call another smart contract B.
In the second case:
- When the execution enters A, the memory and normal stack are empty.
- When the execution leaves A, the memory and normal stack have been populated with stuff A did.
- When the execution enters B, the memory and normal stack are empty.
- When the execution leaves B and returns to A, the EVM needs to:
- flush the memory and normal stack as last seen by B
- and restore, for A, the memory and normal stack to what they were when it left A.
So where did this backup of the state of memory and normal stack go? It was pushed onto the call stack. When this state is popped from the call stack, it is restored into memory and normal stack.