2012-02-21 49 views
2

mmap/dev/port可以吗?当我尝试时,我得到'没有这样的设备'。Python mmap/dev/port

Python 2.7.2+ (default, Oct 4 2011, 20:06:09) 
[GCC 4.6.1] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import os 
>>> import mmap 
>>> os.open('/dev/port', os.O_RDWR|os.O_NDELAY) 
3 
>>> mapfd = mmap.mmap(3, 0xfff) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
mmap.error: [Errno 19] No such device 
>>> 

我已经能够使用相同的选项mmap常规文件。

+0

mmaping'/ dev/port'会有什么意义? mmaping'/ dev/mem'是有意义的,'/ dev/port'不是。 – ninjalj 2012-02-21 20:52:25

+0

@ninjalj它只是让我直接写入一个ioport地址,而不必在每次读/写之前寻找。 – tMC 2012-02-21 23:03:00

+0

也许使用ctypes的pwrite? – sherpya 2012-02-22 00:43:30

回答

4

errno的19列为 “没有这样的设备”(Linux)的,或 “操作不通过设备支持”(FreeBSD的)。

综观drivers/char/mem.c/dev/port的源代码,尤其是struct file_operations,你会see

770 #ifdef CONFIG_DEVPORT 
771 static const struct file_operations port_fops = { 
772   .llseek   = memory_lseek, 
773   .read   = read_port, 
774   .write   = write_port, 
775   .open   = open_port, 
776 }; 
777 #endif 

此设备不支持MMAP。只有开放,寻求,阅读和写作。

+0

+1指向内核源代码。我的kernel-fu不如真棒。 – tMC 2012-02-22 02:41:24

0

正如已经指出的那样,/dev/portmmap -able。但看到你如何使用Python - 让我们利用动态类型的真正力量!为什么不创建一个类似mmap的对象,它支持相同的接口,但在下面使用lseek