我一直在使用用户程序writeread.c
(引用here),使用ftdi_sio
Linux驱动程序。
我使用了我使用的Ubuntu Lucid附带的默认ftdi_sio
- 然后,作为一个完整性检查,决定从源代码重建ftdi_sio
。我不想下载整个内核源代码,因此我选择了所谓的“构建树外模块”:
...这意味着您只能安装linux-headers-*
个软件包(而不是安装整个linux-source-*
) - 以及相应的内核模块源 - 以构建内核模块。
所以,我基本上在文件夹中得到了以下文件:
并运行make
- 和ftdi_sio.ko
内核对象编译,也可以insmod
编译而没有问题。
问题就在这里 - 只要我使用低速(115200 bps),之间就没有可观察到的差异:加载'vanilla'驱动程序(使用{{1 }} );并加载新构建的驱动程序(使用sudo modprobe ftdi_sio
) - 关于userland程序(sudo modprobe usbserial; sudo insmod /path/to/ftdi_sio.ko
)的性能。
但是,如果我以2000000 bps的速度尝试相同,那么'vanilla'驱动程序可以正常工作 - 而构建驱动程序会导致用户程序(writeread.c
)的 segfault 。特别是,这个段错误发生在writeread.c
- 内存资源 - 因为驱动程序最终会从环回连接读取更多字节,而不是它自己编写的!但是,这本身与本次讨论无关,因为我终于找到了一种方法来使构建的free()
起作用(编辑:只是注意到在{{3}中也给出了类似的程序) } ):
ftdi_sio
所以,我的问题是:有人可以向我澄清,为什么 - 即使在运行$ sudo modprobe -r ftdi_sio # remove 'vanilla' driver from memory
...
# build the driver
$ cd /path/to/ftdi_sio_2.6.32/
$ make clean && make
# check vanilla version
$ ls -la /lib/modules/2.6.32-25-generic/kernel/drivers/usb/serial/ftdi_sio.ko
-rw-r--r-- 1 root root 102396 2010-10-17 01:47 /lib/modules/2.6.32-25-generic/kernel/drivers/usb/serial/ftdi_sio.ko
# (re)move the 'vanilla' kernel object
$ sudo mv /lib/modules/2.6.32-25-generic/kernel/drivers/usb/serial/ftdi_sio.ko ~/Desktop/ftdi_sio_orig.ko
# symlink our built version, as if it is the 'vanilla' one
$ sudo ln -s /path/to/ftdi_sio_2.6.32/ftdi_sio.ko /lib/modules/2.6.32-25-generic/kernel/drivers/usb/serial/
# check
$ ls -la /lib/modules/2.6.32-25-generic/kernel/drivers/usb/serial/ftdi_sio.ko
lrwxrwxrwx 1 root root 57 2010-10-26 12:49 /lib/modules/2.6.32-25-generic/kernel/drivers/usb/serial/ftdi_sio.ko -> /path/to/ftdi_sio_2.6.32/ftdi_sio.ko
# call depmod
$ sudo depmod
# !! plug in USB at this point, built driver autoloads;
# however, running `writeread.c` will segfault!
# !! REBOOT at this point
# after reboot:
# !! plug in USB at this point, built driver autoloads;
# and `writeread.c` runs without segfault
之后 - 我仍然必须重新启动,以便内置驱动程序表现正常吗?换句话说:是否有任何其他命令我可以调用(可能在depmod
之后),以便驱动程序在加载时正常工作,没有重启?
我问的原因是,我怀疑每次重新编译内核模块时,符号表都会改变 - 所以为了确保它正常工作,我必须运行depmod
并重新启动在每次构建驱动程序之后 - 我认为这将是一种单调乏味的事情:)所以,能够重建内核模块并在同一会话中使用它而不必重新启动会很好。
嗯,提前感谢任何答案,
干杯!!
生成文件:
depmod
答案 0 :(得分:4)
简而言之,不,我看不出你正在做的序列有什么问题,或者为什么会导致这种行为。
内核允许插入新构建的模块这一事实基本上意味着你已经正确构建它并且它也已正确插入,所以没有版本不匹配或任何东西。
我猜想当你以2000000 bps的速度运行测试时,你首先测试了香草驱动程序,然后测试了新的驱动程序?所以我的猜测是驱动程序没有正确清理,所以当你再次运行测试时(使用新的驱动程序)你会看到一个段错误。但就像我说的那样,这是猜测。