The signed data is 0x19 ‖ version ‖ version-specific data ‖ data. Versions: 0x00 (data with an intended validator address), 0x01 (structured data, which is EIP-712) and 0x45, the letter E, for personal_sign: 0x19 followed by Ethereum Signed Message: and a newline, the message length in decimal ASCII and the message. RLP-encoded transactions cannot begin with 0x19, which is the point of the prefix.
The wallet hashes the result with Keccak-256 and signs with secp256k1; the signature is 65 bytes r ‖ s ‖ v with v 27 or 28. For the message hello the digest is 0x50b2c43fd39106bafbba0da34fc430e1f91e3c96ea2acee2bc34119f92b37750. Verifiers recover the address with ecrecover (or a library's verifyMessage) and compare it; smart accounts need ERC-1271 instead.
personal_sign shows users opaque text and offers no domain or chain binding, so applications should include those in the message (Sign-In with Ethereum does) or prefer EIP-712 for anything with structure or value.