docs: def read(self, offset, length):
          """Read a string of bytes from the specified `offset` in bytes,
          relative to the base physical address of the MMIO region.
  
          Args:
              offset (int, long): offset from base physical address, in bytes.
              length (int): number of bytes to read.
  
          Returns:
              bytes: bytes read.
  
          Raises:
              TypeError: if `offset` type is invalid.
              ValueError: if `offset` is out of bounds.
  
          """
          if not isinstance(offset, (int, long)):
              raise TypeError("Invalid offset type, should be integer.")
  
          offset = self._adjust_offset(offset)
          self._validate_offset(offset, length)
          return bytes(self.mapping[offset:offset + length])