tiny_tty.c 在3.X 内核版本上不能运行 的解决办法



            涉及到LDD3最后一个tty的demo,还是把解决办法贴出来一下


            以前2.6的很多接口都变了,有高手重新移植了LDD3的所有demo到最新的内核版本上。

 https://github.com/duxing2007/ldd3-examples-3.x

希望认识更多的人,一起讨论 How to write drivers for linux devices.

[email protected] (私人邮箱,非诚勿扰)

------------------------------------------------------------------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版本的

tiny_tty.c 在3.X 内核版本上不能运行 的解决办法 <LDD3 学习笔记>_第1张图片


这样就很明显导致了demo的错误.(我没有具体追踪到是多少版本改的接口,但是一直到3.4都是struct tty_struct *tty做参数传入的,而不是现在的tty_port)

应该是2012年改的

http://lwn.net/Articles/521014/


tiny_tty.c 在3.X 内核版本上不能运行 的解决办法 <LDD3 学习笔记>_第2张图片

从上面这个截图(来自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  美丽新世界从这里开始


tiny_tty.c 在3.X 内核版本上不能运行 的解决办法 <LDD3 学习笔记>_第3张图片

你可能感兴趣的:(tiny_tty.c 在3.X 内核版本上不能运行 的解决办法 )