Each user account (aka address, aka EOA) can have 256 subaccounts. These are discrete margin accounts that are under the control of the main account but DO NOT share risk or collateral with one another. The subAccountId is a number between 0 and 255 (uint8).
If you do not want to worry about subaccounts, just pass in a subAccountId of 0.
In terms of signatures, the signer is still the user account.
The operation to generate a subaccount takes the XOR of the primary address and the subaccount id to generate a subaccount's address. In the contract this is treated as a discrete account with its own associated state, but is controlled and signer for by the primary user account.
address subAccount = address(uint160(account) ^ uint160(subAccountId));