Bir aygıt sürücüsüne mmap üzerinden erişen bazı C kodlarını dönüştürüyorum. Python'da çok benzer şeyler kolayca yapabileceğimi düşündüm. Ancak bu konuya girdim. Mmap'lenmesi gereken adres PCI yapılandırması tarafından sağlanır, bu yüzden bu adres üzerinde hiçbir kontrolüm yoktur. Bu durumda, bulunan adres 3451912192'dir. Adres alanı, bir işaretsiz tamsayıdır ve 32 bittir.Python, çok büyük adresli mmap çağrısını taşma istisnasına neden oluyor
Bu adres sadece bir işaretli tamsayı işaretsiz bir tamsayı uyuyor ama nerede aralığında olur. Ben mmap'e aradığınızda, ben şu istisna olsun:
OverflowError: long int too large to convert to int
Yani Python yapay o imzalı zannediyor çünkü uymuyor bana numarayı anlatıyor. Bunu bir şekilde çözmek mümkün mü, yoksa mmap çağrısını C yapmak zorunda mıyım?
Not eşdeğer negatif değer işaretçiyi dönüştürme verir:
OverflowError: memory mapped offset must be positive
eryksun Python bakış semantik açıdan doğru ancak kazanılan böylece C arayüzü aslında', imzalanmış bir değeri belirtir işaret C programının göz ardı edebileceği bu kısıtlamayı atlamama izin ver.
Memory at cdc00000 (32-bit, non-prefetchable) [size=1M]
ve 0xcdc00000==3451912192
:
Gerçekten de, lspci
cihazın kaynağına sahip olduğunu ortaya koymaktadır. En azından'un mmap
'daki kontrolünün belki de doğru olmadığı görülecektir. Bunu neden kontrol etmeliyiz? Desteklenmiyorsa, işletim sisteminin bir hata kodu döndürmesine izin verin.
mmap (fd) 'ye ilk argüman olarak ne geçiyorsunuz? –
, posix.open ("/ dev/mem", posix.O_RDWR) 'nin çıktısıdır. – Steve
@eryksum: 32 bitlik bir sistem. Haklısın, 'off_t' gerçekten imzalı bir tip. Yine de kopyalamaya çalıştığım C kodunun böyle bir değer ilettiğini doğruladım. Eğer eşdeğer negatif değere dönüştürürsem, 'mmap' modülü de bana bir hata verir. Sanırım kendi mmap'imi ctip'leri kullanarak deneyebilirim. – Steve