涉及到LDD3最后一个tty的demo,还是把解决办法贴出来一下
以前2.6的很多接口都变了,有高手重新移植了LDD3的所有demo到最新的内核版本上。
https://github.com/d
希望认识更多的人,一起讨论 How to write drivers for linux devices.
jasonleaster@gmail.com (私人邮箱,非诚勿扰)
------------------------------------------------------------------Cut line------------------------------------------------------------------------
'struct tty_struct' have no member named 'flip' 的解决办法
我稍微修改了上面的demo代码,发现代码是有问题的,struct tty_struct 里面已经没有 flip 成员了,而代码需要的是count成员,实际上count成员被直接放置在tty_struct 里面了
解决办法
tty->flip.count 修改为 tty->count 即可
关于tty_flip_buffer_push() 入口参数更改的解决办法:
对于内核的版本的修改,对于API的修改是有很大影响的,这里的tty_flip_buffer_push()的入口参数就受到了影响。
我对比了2.6和3.13两个版本关于这个API的情况
左边是3.13版本的 右边是2.6版本的
这样就很明显导致了demo的错误.(我没有具体追踪到是多少版本改的接口,但是一直到3.4都是struct tty_struct *tty做参数传入的,而不是现在的tty_port)
应该是2012年改的
http://lwn.net/Articles/521014/
从上面这个截图(来自3.12版本)中可以看到,接口是没有EXPORT_SYMBOL的,而2.6版本是有的!我不知道为什么新内核把这个接口实现了又不导出,导致的结果就是我在用tty_buffer_init的时候会报警,编译能过,但是就是不能用!
解决办法:添加EXPORT_SYMBOL(tty_buffer_init);
然后重新编译和主机版本相应版本内核!(最好用 sudo apt-get install linux-source-主机内核版本)
记得修改.config
- 修改.config内的CONFIG——MODVERSIONS和CONFIG_MODULE_SRCVERSION_ALL选项为n
- (这里不改,编译出的xxx.ko无法加载,因为ubuntu5.04的内核版本是2.6.10-5,而不是2.6.10 ,版本是不一样的。)
- #make oldconfig
- #make
- #make modules
- #make modules_install
版本完全匹配太麻烦了,不是想的那么简单,解决办法就是——替换内核!
make install <--这步是建立initrd(加载LKM用的程序)
shutdown -r now 美丽新世界从这里开始