This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: mmap read of single byte accesses more that just that byte
Type: behavior Stage:
Components: Extension Modules Versions: Python 2.7
process
Status: closed Resolution: not a bug
Dependencies: Superseder:
Assigned To: Nosy List: FazJaxton, jcea
Priority: normal Keywords:

Created on 2014-06-17 20:18 by FazJaxton, last changed 2022-04-11 14:58 by admin. This issue is now closed.

Messages (3)
msg220877 - (view) Author: Kevin Smith (FazJaxton) Date: 2014-06-17 20:18
I am using the mmap module on Linux with python 2.7.6 to access memory-mapped IO.  The device that I am accessing implements a hardware FIFO that holds 16-bit values and pops an entry when the MSB of the entry is read.  I am trying to use the mmap module to do an 8-bit read of the LSB then an 8-bit read of the MSB, which should pop the value.  However, I am finding that the LSB read is sometimes popping the value before I read the MSB.

I am mapping the memory like this:
        self.fd = os.open ("/dev/mem", os.O_RDWR | os.O_SYNC)
        self.mempage = mmap.mmap (self.fd, mmap_size, mmap.MAP_SHARED,
                mmap.PROT_READ | mmap.PROT_WRITE, offset = pc104_base)

Then trying to read a value like this:
        val = self.mempage[pos]

The LSB of the hardware device is a lower address than the MSB.  The read of the LSB seems to sometimes overlap into a read of the MSB, which causes the following read of the MSB to be incorrect, as the value has already been popped.  Sometimes the reads of the MSB are correct; I am not sure why this behavior is not consistent across all reads.

The reads for this device need to be 8-bit, as the bus the device is connected to only supports 8-bit reads.

I think that a single-byte access of the memory mapping should only access a single byte in the underlying memory region.
msg220920 - (view) Author: Jesús Cea Avión (jcea) * (Python committer) Date: 2014-06-18 02:41
Kevin, mmap is not appropriate for your use. Looks like writing your own module would be simple enough. If performance is not a problem, maybe ctypes/cffi pointer magic encapsulate in your own custom class would be enough for you.

I mark this bug as "not a bug" since you are using mmap+python outside of "specs". Feel free to reopen if you don't agree but, please, provide a rationale.
msg220921 - (view) Author: Jesús Cea Avión (jcea) * (Python committer) Date: 2014-06-18 02:48
You could even use "ctypes" to access the underlining "mmap" OS syscall. But accessing individual bytes using native python is not guaranteed to work because python is too high level for that. For instance, it could read 64 bits (a word) to only use 8 at the end.

I recommend you to write a tiny C module or investigate "ctypes"/"CFFI" pointer access to a native mmap-ed area.

Good luck.
History
Date User Action Args
2022-04-11 14:58:05adminsetgithub: 65996
2014-06-18 02:48:25jceasetmessages: + msg220921
2014-06-18 02:41:59jceasetstatus: open -> closed

nosy: + jcea
messages: + msg220920

resolution: not a bug
2014-06-17 20:18:53FazJaxtoncreate