免费注册 查看新帖 |

Chinaunix

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

[实践] 它山之石,可以攻玉--从内核中学到了什么(获奖名单已公布-2014-4-21) [复制链接]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
61 [报告]
发表于 2014-03-18 13:01 |只看该作者
回复 55# dolphin1987

上一周还从内核中挖了一块宝,嵌到了工作中——将内核协议栈中的NAT的快checksum 算法csum_replace4,移植到工作中。


你说的这个应该是快速更新校验和吧。数据报文的某个局部字段被修改了,通过增量的方式,计算出来新的校验和。
   

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
62 [报告]
发表于 2014-03-18 13:03 |只看该作者
回复 58# cxsvip

每个进程单独的 listen 对吧。

那多个进程间应该需要一些同步的机制,保持相关的统计或者动态信息一致吧。

   

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
63 [报告]
发表于 2014-03-18 13:04 |只看该作者
回复 56# gvim

欢迎 gvim 兄有时间时多上来分享啊。

   

论坛徽章:
17
戌狗
日期:2013-09-02 23:43:02技术图书徽章
日期:2014-04-29 14:16:02技术图书徽章
日期:2014-04-24 15:51:26未羊
日期:2014-04-06 22:10:30丑牛
日期:2014-04-06 21:23:29辰龙
日期:2014-04-06 21:20:22处女座
日期:2014-04-06 21:16:18技术图书徽章
日期:2014-04-02 15:10:51金牛座
日期:2014-03-10 22:26:18巨蟹座
日期:2014-02-17 17:12:12技术图书徽章
日期:2014-01-24 10:38:43摩羯座
日期:2013-11-29 18:00:18
64 [报告]
发表于 2014-03-18 15:26 |只看该作者
内核这方面的好话题。支持~

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
65 [报告]
发表于 2014-03-18 16:13 |只看该作者
回复 1# Godbach

1.  内核的哪些数据结构以及 API 被用到或者移植到了和内核没有直接关系的工作中

     list: 这个不用说,初次见到的无不佩服。

     refcount: 对象生命周期管理的利器,一招鲜吃遍天。

     *_operations + container_of: 越来越不喜欢 C++的臃肿的代码复用方式,更喜欢 C这种行为与数据一目了然的做法,清晰而易懂!虽然 C中 OO的确要麻烦些!

     *_alloc, *_init, *_register, *_unregister, *_exit, *_free: 不用多说,这套 API太常用了,万金油!

     最为获益的不是这些零碎的东西,而是因为我站在巨人的肩膀上!

2. 分享一下曾经解决了燃眉之急的某个内核新特性

    暂时还没有过

3. 介绍一下个人曾经研究过的某个内核特性

    设备驱动: 总线,设备,驱动三个核心结构体,比较好的抽象出了物理世界中硬件的工作机制。block dev,char dev则向上提供了用户空间访问的接口!

    网络: socket API,协议栈,网卡驱动三者相互协作,让我们清晰的看到了从用户空间到底层硬件,数据的流动!

    VFS: inode,dentry,file三者的抽象,从物理视角(存储在物理设备上数据)到用户视角的转变。

    MM: page cache -> address_space -> VMA;buddy + slab;page fault的处理。。。

    最后总结:看的很多,结果样样通,样样松!哎,内核浩如烟海,都不过是囫囵吞枣而已!

评分

参与人数 1可用积分 +8 收起 理由
Godbach + 8 很给力!

查看全部评分

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
66 [报告]
发表于 2014-03-18 16:20 |只看该作者
回复 65# asuka2001

赞一个。看来内核的子系统没少研究,也受益很大。

   

论坛徽章:
0
67 [报告]
发表于 2014-03-18 16:38 |只看该作者
回复 61# Godbach


    是的,不好意思没有说清楚。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
68 [报告]
发表于 2014-03-18 16:50 |只看该作者
回复 67# dolphin1987

:wink:


   

论坛徽章:
3
双鱼座
日期:2013-09-04 19:47:39天蝎座
日期:2013-12-11 20:30:532015年亚洲杯之澳大利亚
日期:2015-04-20 00:28:02
69 [报告]
发表于 2014-03-18 22:50 |只看该作者
回复 65# asuka2001


   很同意老兄的说法。。

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
70 [报告]
发表于 2014-03-18 23:57 |只看该作者
本帖最后由 gvim 于 2014-03-19 00:13 编辑

看不少朋友惊艳于linux的list,怎么说呢,算买个广告吧,看看freebsd的tree
http://fxr.watson.org/fxr/source/sys/tree.h?v=FREEBSD10

/* This file defines data structures for different types of trees:
* splay trees and red-black trees.
...
*/
能明白说什么的,我就不多解释了。
从编码角度说,*BSD比Linux的实现高超不少。包括有朋友提到的初始化,总线抽象这些东西,*BSD在1995年左右就已经设计出来,我记得那时候linux应该是1.x->2.0左右吧还处于设计的蛮荒阶段。当然,本帖说的是从内核里学什么,就只比较设计、编码这些,要比功能,现在的*BSD确实差了不少。
以下两个 for,连同调试、打印一共100多行,就是freebsd的初始化代码,抽象程度之高。
同时比对一下:
http://fxr.watson.org/fxr/source ... REEBSD10;im=10#L198
http://fxr.watson.org/fxr/source ... inux-2.6;im=10#L468
  1. 197 void
  2.   198 mi_startup(void)
  3.   199 {
  4.   200
  5.   201         register struct sysinit **sipp;         /* system initialization*/
  6.   202         register struct sysinit **xipp;         /* interior loop of sort*/
  7.   203         register struct sysinit *save;          /* bubble*/
  8.   204
  9.   205 #if defined(VERBOSE_SYSINIT)
  10.   206         int last;
  11.   207         int verbose;
  12.   208 #endif
  13.   209
  14.   210         if (boothowto & RB_VERBOSE)
  15.   211                 bootverbose++;
  16.   212
  17.   213         if (sysinit == NULL) {
  18.   214                 sysinit = SET_BEGIN(sysinit_set);
  19.   215                 sysinit_end = SET_LIMIT(sysinit_set);
  20.   216         }
  21.   217
  22.   218 restart:
  23.   219         /*
  24.   220          * Perform a bubble sort of the system initialization objects by
  25.   221          * their subsystem (primary key) and order (secondary key).
  26.   222          */
  27.   223         for (sipp = sysinit; sipp < sysinit_end; sipp++) {
  28.   224                 for (xipp = sipp + 1; xipp < sysinit_end; xipp++) {
  29.   225                         if ((*sipp)->subsystem < (*xipp)->subsystem ||
  30.   226                              ((*sipp)->subsystem == (*xipp)->subsystem &&
  31.   227                               (*sipp)->order <= (*xipp)->order))
  32.   228                                 continue;       /* skip*/
  33.   229                         save = *sipp;
  34.   230                         *sipp = *xipp;
  35.   231                         *xipp = save;
  36.   232                 }
  37.   233         }
  38.   234
  39.   235 #if defined(VERBOSE_SYSINIT)
  40.   236         last = SI_SUB_COPYRIGHT;
  41.   237         verbose = 0;
  42.   238 #if !defined(DDB)
  43.   239         printf("VERBOSE_SYSINIT: DDB not enabled, symbol lookups disabled.\n");
  44.   240 #endif
  45.   241 #endif
  46.   242
  47.   243         /*
  48.   244          * Traverse the (now) ordered list of system initialization tasks.
  49.   245          * Perform each task, and continue on to the next task.
  50.   246          */
  51.   247         for (sipp = sysinit; sipp < sysinit_end; sipp++) {
  52.   248
  53.   249                 if ((*sipp)->subsystem == SI_SUB_DUMMY)
  54.   250                         continue;       /* skip dummy task(s)*/
  55.   251
  56.   252                 if ((*sipp)->subsystem == SI_SUB_DONE)
  57.   253                         continue;
  58.   254
  59.   255 #if defined(VERBOSE_SYSINIT)
  60.   256                 if ((*sipp)->subsystem > last) {
  61.   257                         verbose = 1;
  62.   258                         last = (*sipp)->subsystem;
  63.   259                         printf("subsystem %x\n", last);
  64.   260                 }
  65.   261                 if (verbose) {
  66.   262 #if defined(DDB)
  67.   263                         const char *func, *data;
  68.   264
  69.   265                         func = symbol_name((vm_offset_t)(*sipp)->func,
  70.   266                             DB_STGY_PROC);
  71.   267                         data = symbol_name((vm_offset_t)(*sipp)->udata,
  72.   268                             DB_STGY_ANY);
  73.   269                         if (func != NULL && data != NULL)
  74.   270                                 printf("   %s(&%s)... ", func, data);
  75.   271                         else if (func != NULL)
  76.   272                                 printf("   %s(%p)... ", func, (*sipp)->udata);
  77.   273                         else
  78.   274 #endif
  79.   275                                 printf("   %p(%p)... ", (*sipp)->func,
  80.   276                                     (*sipp)->udata);
  81.   277                 }
  82.   278 #endif
  83.   279
  84.   280                 /* Call function */
  85.   281                 (*((*sipp)->func))((*sipp)->udata);
  86.   282
  87.   283 #if defined(VERBOSE_SYSINIT)
  88.   284                 if (verbose)
  89.   285                         printf("done.\n");
  90.   286 #endif
  91.   287
  92.   288                 /* Check off the one we're just done */
  93.   289                 (*sipp)->subsystem = SI_SUB_DONE;
  94.   290
  95.   291                 /* Check if we've installed more sysinit items via KLD */
  96.   292                 if (newsysinit != NULL) {
  97.   293                         if (sysinit != SET_BEGIN(sysinit_set))
  98.   294                                 free(sysinit, M_TEMP);
  99.   295                         sysinit = newsysinit;
  100.   296                         sysinit_end = newsysinit_end;
  101.   297                         newsysinit = NULL;
  102.   298                         newsysinit_end = NULL;
  103.   299                         goto restart;
  104.   300                 }
  105.   301         }
  106.   302
  107.   303         mtx_assert(&Giant, MA_OWNED | MA_NOTRECURSED);
  108.   304         mtx_unlock(&Giant);
  109.   305
  110.   306         /*
  111.   307          * Now hand over this thread to swapper.
  112.   308          */
  113.   309         swapper();
  114.   310         /* NOTREACHED*/
  115.   311 }
复制代码

评分

参与人数 1可用积分 +16 收起 理由
Godbach + 16 赞一个!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP