In Ethereum each contract has a key-value storage that uses a Patricia Trie. The root of the storage tree is saved in the contract state, together with the bytecode, balance and nonce.
At a high level the solidity language defines how the different types are mapped to storage so at runtime the correct keys are computed when a variable is modified.
At a low ...
Each contract account has persistent storage. The EVM loads and executes the contract code when calling the contract function. When executing the code, the EVM reads or writes the contract's storage value.