免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 塑料袋
打印 上一主题 下一主题

看到论坛前辈们用一帖就勾引出来那么多牛人,我也想试试 [复制链接]

论坛徽章:
0
491 [报告]
发表于 2006-12-19 23:10 |只看该作者
支持继续讨论下去,难道cu只有secworld和塑料袋真正懂内核吗,那也太............

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
492 [报告]
发表于 2006-12-20 08:32 |只看该作者
原帖由 bwater 于 2006-12-19 23:10 发表
支持继续讨论下去,难道cu只有secworld和塑料袋真正懂内核吗,那也太............


我没有当初的好心情了。

在CU这里,谁学习Kernel更深入,谁比较浅薄,以CU的群众基础,是分辨不出来的。
个人学习Kernel,只能是如人饮水,冷暖自知。

俺也想过总结前一段的看的知识,写帖子出来分享,我想还是不会比那本《Linux虚拟内存管理》差太多的,不过想必不要说看懂,有耐心看的人估计也没几个,何必做这损己不利人的事呢,不如再认真一点写,弄本书出,摸俩钱花。

论坛徽章:
0
493 [报告]
发表于 2006-12-20 12:03 |只看该作者
原帖由 塑料袋 于 2006-12-20 08:32 发表


我没有当初的好心情了。

在CU这里,谁学习Kernel更深入,谁比较浅薄,以CU的群众基础,是分辨不出来的。
个人学习Kernel,只能是如人饮水,冷暖自知。

俺也想过总结前一段的看的知识,写帖子出来分享, ...

其实我不是想看热闹,而是要挖掘下cu的哪个大牛值得我去崇拜

论坛徽章:
0
494 [报告]
发表于 2006-12-20 12:59 |只看该作者
我质疑楼主真的是牛
看你怎么回复我,我就能判断你是不是属牛
1 工作几年了
2 现在什么工作
3 做过哪些性质的工作

论坛徽章:
0
495 [报告]
发表于 2006-12-20 14:55 |只看该作者
很少来这个版块,一来就看到这么多的牛人。狂汗!

论坛徽章:
0
496 [报告]
发表于 2006-12-20 22:32 |只看该作者
原帖由 塑料袋 于 2006-12-20 08:32 发表


我没有当初的好心情了。

在CU这里,谁学习Kernel更深入,谁比较浅薄,以CU的群众基础,是分辨不出来的。
个人学习Kernel,只能是如人饮水,冷暖自知。

俺也想过总结前一段的看的知识,写帖子出来分享, ...


没必要一下子就变的这么内敛吧?本人还是喜欢你无知的狂性.
你不是要看看一贴可以勾出多少牛人吗?
你不是立志要成为大陆第一的Linux专家高手吗?
你不是要干掉所有CU人吗?
你不是三天就可以精通汇编,七天就了解CPU结构吗?
你不是自称自己是参透九阳真经的杨过吗?
你不是经常去凤楼修行吗?
你不是前一阵子刚得了性病吗?
怎么现在又要....
出书骗人了?

开始看本贴感觉你的功力真的很深,太TM强了,当然和我比还是有一定差距的.但最后你太得意了以至于贴出了自己分析的代码.看了你的注释我哭了,塑料袋竟然不知道那个"--"操作是干什么的,不知道count和del_list之间的关系,不知道什么是互斥保护,同志们当你们看到285楼的时候才知道LZ原来是个大骗子,才知道他根本就不懂什么是过程,什么是kernel.什么是spinlock,什么是count,原来他什么都不懂......自以为看过源代码就号称天下第一了.竟然用成色来品称自己?这种人嘴里的"内核"就会像"小姐","同志","黑客",让人听着变味,听着不舒服.你说我能不伤心吗?事后一想,高手们一般都只在首页部分看看有什么热门话题,如果没有,人就闪了.人家LZ把贴放到CU的IT职业生涯本来就是想保密的,因为本版没有首页推荐功能,所以只能仅供LZ自娱自乐.

楼主说他的问题,CUer们可能十年都解决不了,但我想以他现在的功力出书,就像是在大街上大小便一样,让人做呕.

如果你认为iput的重入会让进程挂掉,就试着写一个exp吧.这样你的研究成果会出现在cve的网站的.也可以让全世界的人都知道CU也有一个0day.最厉害的是发现的vul可以影响所有的linux内核,比h00lyshit强多了,它的只能攻击2.6.17-5以下内核,知道你不喜欢鸟语(我也不喜欢),但我已经很努力了,一些外来词我真不知道怎么翻译给你听.

如果楼主不愿意接招,我也就不费心等待了.但最后劝你几句
1)拳怕少壮,这句话不适合你了.你已经27岁了,但连tcp/ip,proc,chardev,你还都不了解,可以说你在内核上不会有什么大的成就了.不如在家多陪陪老婆,别把时间放到无聊的读核上去.
2)听说你是apache+php,但不知道你可不可以做出一个像sysadmin的web系统来控制Linux kernel.

[ 本帖最后由 secworld 于 2006-12-20 22:37 编辑 ]

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
497 [报告]
发表于 2006-12-21 09:16 |只看该作者
原帖由 secworld 于 2006-12-20 22:32 发表


没必要一下子就变的这么内敛吧?本人还是喜欢你无知的狂性.
你不是要看看一贴可以勾出多少牛人吗?
你不是立志要成为大陆第一的Linux专家高手吗?
你不是要干掉所有CU人吗?
你不是三天就可以精通汇编,七天就 ...


不是我变的内敛,是这两天暂时没心思说废话。

我跟你论究Kernel里的程序,是一件费尽吐沫的事。我宁可让所有CUer瞧不起我,也不想把时间浪费在对一个不摸kernel门的人,讲解kernel里边的程序上。

论坛徽章:
0
498 [报告]
发表于 2006-12-21 12:58 |只看该作者

500楼 留名!!!!

上CU 不久,就这样的热闹,看来人气旺啊,
不过LZ 你勾引牛人的目的达到了,可不要撒腿哦

论坛徽章:
0
499 [报告]
发表于 2006-12-21 17:50 |只看该作者
原帖由 塑料袋 于 2006-12-21 09:16 发表


不是我变的内敛,是这两天暂时没心思说废话。

我跟你论究Kernel里的程序,是一件费尽吐沫的事。我宁可让所有CUer瞧不起我,也不想把时间浪费在对一个不摸kernel门的人,讲解kernel里边的程序上。


如果你不贴你的注释,我可能会认为你真的很牛,但很遗憾,看了注释后可以明确的告诉你,你现在的功力是读核食物链的最底层,连小虾米都不是,顶多是个单细胞的浮游生物吧。我把你在285楼的问题引用过来吧,省的菜鸟和老牛都浪费时间去翻你以前的贴子。我知道你这两天心情不好,因为从我发贴到现在正好是48小时,你却依旧不能参透其中奥秘。失眠了吧?绝望了吧?
我知道这段代码已经远远超过了你的智力极限,你是一个只见语句不见语意的蠢材。你的什么《半年来我的读核体会》简直叫人笑掉大牙,你刚知道用面向对象的方式来读核?七年前这就是共识了,你却以为你找到了什么香饽饽。
等你看懂了才在CU发狂吧,从现在计时,大家都来看看塑料袋到底需要多长时间才能参透其中内核中very常见的保护机制。


  1. 我看的是2.4.32的内容,iput()函数相关的部分我不理解,谁如果能解答我的疑惑,感激不尽,谢谢.主要是第二个问题想不明白






  2. 问题一
  3. i_count==0时,如果inode->i_nlink>0,且inode存在于hash表中时, 有这样三行代码
  4.    spin_lock(&inode_lock);
  5.      inodes_stat.nr_unused--;
  6.      list_del_init(&inode->i_hash);

  7. 它为什么能这么肯定的把inode从hash中删除?并且inodes_stat.nr_unused--;
  8. 从判断出i_count==0,到这三行代码,以前有一段时间,并没有持有自旋锁,执行到这三行时,也许已经inode->i_count>0



  9. 问题二

  10. static inline void sync_one(struct inode *inode, int sync)
  11. {

  12.    while (inode->i_state & I_LOCK) {
  13.          __iget(inode);
  14.          spin_unlock(&inode_lock);
  15.          __wait_on_inode(inode);
  16.          iput(inode);
  17.          spin_lock(&inode_lock);
  18.    }
  19.     __sync_one(inode, sync);
  20. }

  21. iput在i_count==0时会通过write_inode_now调用这个函数,但是在调用这个函数时,并不一定i_count>0,也许i_count=0. 因为调用write_inode_now之前,已经释放了自旋锁,使其他CPU通过hash得到本inode成为可能
  22. i_count=0时,SMP上另一进程在kupdate的话,会设置这个i_state为I_LOCK,所以本函数再次iget,然后又iput,
  23. 在这之间__wait_on_inode的时候,也许另一进程iget到这个inode,对其操作,然后把它标记为I_DIRTY
  24. ,在i_count==2时调用iput,结束对这个inode的使用,这时i_count==1
  25. 终于轮到__wait_on_inode(inode)被唤醒再次运行,这个函数在i_count==1时马上又iput,在write_inode_now时,并不持有自旋锁,并不排除SMP上运行kupdate进程的可能,因此这个inode又是I_LOCK,而i_count==0,所以又需要再次iget,iput,这样下去,进程不挂掉??????






  26. 关联到的代码附加如下


  27. iput()
  28.    ...释放预分配块

  29.   /* i_count--,得到inode_lock自旋锁
  30.    * 如i_count>0,释放自旋锁,返回0,iput结束
  31.    * 如i_count=0,继续持有自旋锁,返回1
  32.      */
  33.      if (!atomic_dec_and_lock(&inode->i_count, &inode_lock))
  34.            return;

  35.      if (!inode->i_nlink) {

  36.            inode彻底失效,咱不说这种情况

  37.     }else{ /* 我想了很久这种情况,这里只是暂时持有自旋锁,保证了在这个点上暂时i_count==0*/

  38.             if (!list_empty(&inode->i_hash)) {

  39.                    if (!(inode->i_state & (I_DIRTY|I_LOCK)))
  40.                            __refile_inode(inode);
  41.                    inodes_stat.nr_unused++;
  42.                    spin_unlock(&inode_lock);
  43.                    if (!sb || (sb->s_flags & MS_ACTIVE))
  44.                           return;


  45.                    /* 执行到这里时,由于前几行代码已经释放了自旋锁,所以也许SMP已经使这个
  46.              *inode->i_count>0
  47.                     */

  48.                    write_inode_now(inode, 1); /*执行这个函数时会不会使进程挂掉????????*/


  49.                    /* inodes_stat.nr_unused--????为什么这么肯定就能nr_unused--
  50.                     * 也许inode还有引用
  51.              */
  52.                      
  53.                    spin_lock(&inode_lock);
  54.                    inodes_stat.nr_unused--;
  55.                    list_del_init(&inode->i_hash);
  56.             }

  57.             list_del_init(&inode->i_list);
  58.             inode->i_state|=I_FREEING;
  59.             inodes_stat.nr_inodes--;
  60.             spin_unlock(&inode_lock);


  61.             if (inode->i_data.nrpages)
  62.                     truncate_inode_pages(&inode->i_data, 0);
  63.             clear_inode(inode);
  64.      }






  65. void write_inode_now(struct inode *inode, int sync)
  66. {
  67. struct super_block * sb = inode->i_sb;

  68.      if (sb) {
  69.            spin_lock(&inode_lock);
  70.            while (inode->i_state & I_DIRTY)
  71.            sync_one(inode, sync);
  72.            spin_unlock(&inode_lock);

  73.            /* 一旦释放了自旋锁,可能inode马上再次被I_DIRTY,前边自旋锁内的循环前功尽弃。
  74.         *
  75.             */
  76.             if (sync)
  77.             wait_on_inode(inode);
  78.        }
  79.        else
  80.              printk(KERN_ERR "write_inode_now: no super block\n");
  81. }





  82. /* 这时inode->i_count>0,也可能inode->i_count==0,因为在调用write_inode_now前,已经释放了自旋锁
  83. *
  84. * 假如这个进程正在被同步中, 设置了I_LOCK, 而i_count==0时,本函数再次iget,iput,又一次执行了 iput,而这次iput时,完全可能会与上一个iput执行相同的路线, 比如说在iput中write_inode_now前的瞬间,SMP上的另一个进程又把这个inode标记为脏,然后又切换进kupdate进程,进程开始同步这个inode,又设置了I_LOCK,而这时i_count==0
  85. 因此这个进程不会完蛋??
  86. */
  87. static inline void sync_one(struct inode *inode, int sync)
  88. {

  89.    while (inode->i_state & I_LOCK) {
  90.           __iget(inode);
  91.           spin_unlock(&inode_lock);
  92.           __wait_on_inode(inode);
  93.           iput(inode);
  94.           spin_lock(&inode_lock);
  95.    }

  96.     __sync_one(inode, sync);
  97. }  







  98. /*  参数( inode ,是否同步)
  99.   *
  100.   *  inode 入locked 链,释放自旋锁,执行:
  101.   *            dirty_page 链换至locked_page,回写
  102.   *                     inode 回写至磁盘块,等待
  103.   *            locked_page链换至clean_page 链,等待
  104.   *  inode 得到自旋锁,清I_LOCK,按优先级顺序选择链
  105.   */
  106. static inline void __sync_one(struct inode *inode, int sync)
  107. {
  108.         unsigned dirty;

  109.         /* 对inode 上锁,换链至s_locked_inodes*/
  110.         list_del(&inode->i_list);
  111.         list_add(&inode->i_list, &inode->i_sb->s_locked_inodes);



  112.         if (inode->i_state & (I_LOCK|I_FREEING))
  113.                 BUG();

  114.         /* Set I_LOCK, reset I_DIRTY */
  115.         dirty = inode->i_state & I_DIRTY;
  116.         inode->i_state |= I_LOCK;
  117.         inode->i_state &= ~I_DIRTY;
  118.         spin_unlock(&inode_lock);


  119.         /* 不判断是否uptodata ,就将address space->dirty_pages 中的页
  120.           * 转移至locked_pages  链,根据dirty 判断是否不等待的回写
  121.           */
  122.         filemap_fdatasync(inode->i_mapping);


  123.         /* 如果inode 设置了I_DIRTY_SYNC | I_DIRTY_DATASYNC,
  124.           * 则回写磁盘inode 和超级块
  125.           *
  126.           * 顺便等待页回写完成
  127.           */
  128.         if (dirty & (I_DIRTY_SYNC | I_DIRTY_DATASYNC))
  129.                 write_inode(inode, sync);


  130.         /* 不判断是否uptodata ,就将address space->locked_pages 中的页
  131.           * 转移至clean_pages  链,根据锁定 判断是否等待
  132.           */
  133.         filemap_fdatawait(inode->i_mapping);

  134.         spin_lock(&inode_lock);




  135.         /* 对inode 解锁,换链判断顺序为s_dirty_inode,inode->i_count,
  136.           * inode->i_data.nr_pages,最后万不得已到inode_unused 链  
  137.           */
  138.         inode->i_state &= ~I_LOCK;
  139.         __refile_inode(inode);
  140.         wake_up(&inode->i_wait);
  141. }

复制代码


我不是高手,你说的对,我就是一个不摸kernel门的人,但却比你强,你看不懂的我懂,你不会的我会。想做Linux内核大陆第一高手,先看看可不可以干掉所有cuer,我就是第一个cuer。

论坛徽章:
0
500 [报告]
发表于 2006-12-21 18:03 |只看该作者
下战书了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP