2011-07-19 7 views
9

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.

+0

mmap (fd) 'ye ilk argüman olarak ne geçiyorsunuz? –

+0

, posix.open ("/ dev/mem", posix.O_RDWR) 'nin çıktısıdır. – Steve

+0

@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

cevap

1

Benzer bir sorunla karşılaştım, ayrıca 64bit makinede 64bit olarak derlenmiş bir Python'a daha büyük bir 4GB veri yığınını da mmap istemiştim.

Ben doğru en temel piton-nesne struct sadece 32bit bir nesne boyutu üyesi içerir oldu o iş vermedi ana nedeni, hatırlıyorsanız. Ve bunu değiştirmek çok zor, söyleyebildiğiniz gibi, tüm dili gözden geçirmeniz ve özellikle derlenmiş tüm uzantıları düzeltmeniz gerekiyor.

Emin değilim, ancak bu Python 3.0 ile yapılmış olabilir.