Looking at this line
start_address = address.start + self.start_address
I think the below would make more sense.
start_address = self.start_address
As of now, I get this behavior something like this:
>>> seg
<2048 byte segment @ 0x90000000>
>>> seg[0x90000000:0x90000010]
<16 byte segment @ 120000000>