21
Jan

白色陶瓷娃娃



  小董婷买草娃娃的时候我也要了一个白色的陶瓷娃娃!虽然有点贵,但是玩么!还是挺不错的!
回来在水里泡了泡,每天给浇点水,居然这几天开始疯狂的长了!!!呵呵!不错吧!
   早上豆瓣电台给我放了一首Eric Clapron的音乐,有点激动了,好长时间都没有听他的音乐了,暑假去宝鸡市里面逛的时候发现他的CD买到50块一张!有点忒贵了!没有买!!!

呵呵,看我的陶瓷娃娃吧!!



29
Dec

我学生时代之源代码



自己的学生时代就要结束了,不管有多么的不舍,终究是要结束的,但还是想做点什么吧!至少是对自己这个浑浑噩噩的前20多年有一个交代,也不用去管到底是好还是不好了。总结历史只是让我们能更清楚的认识自己,认识自己应该走的路。。。



想把自己学生时代的东西总结一下,总结一本册子,从小学到目前应该也写了不少东西了,应该也是一本非常有意思的个人传记吧,哈哈,现在就开始给自己写传记了,老是把自己看的太牛了。。。应该要低调阿。。。

书名就叫《我学生时代之源代码》吧,名字感觉有点不顺呢!!!斟酌。。。 


25
Dec

冬至记事



冬至吃饺子,说是中国的传统习俗了。百度了一下关于冬至的相关知识,冬至还是有着深厚的内涵的。无论从天体行星运行到民族习俗,无一不是表明冬至这个一天的重要。现在,一些地方还把冬至作为一个节日来过。北方地区有冬至宰羊、吃饺子、吃馄饨的习俗,南方地区在这一天则有吃冬至米团、冬至长线面的习惯。各个地区在冬至这一天还有祭天祭祖的习俗。毕竟是一次民俗的节日。我还是一个比较传统的年青人么。对于这些节日我还是感觉文化气息和底蕴要比更为深厚一些。

而最近我也是一直在组织各样的活动,而这次我想组织一次冬至这一天的聚会,因为我不准备去过所谓的平安夜或是圣诞节,这个好像和中国没有什么关系。而现在人们却把这样的节日商业化的到了让人恶心的地步。

所以想在这样一个传统节日的时候来点特别的,让其他人也能感觉到传统节日在我们的生活中还是很有意义的。这样一个想法也是琢磨了一周了,之前很早就记住了这个日子,再计算了时间和其他人的近期计划,感觉还是有意义去搞的,也是会有很多人来参与的。呵呵!计划的还是比较好的。。。

果不其然,那天白天我出去陪朋友转了转,然后在下午3点多的时候回来了,和师弟师妹们出去张罗着买了点水果,当然还有饺子。还和董婷师妹出去买了一点菜蔬–她说要给我们大家煲个汤,呵呵,这个小师妹老是给我们说她做什么什么好吃的,老馋我们,今天就看她的手艺了。老苏和老谢还去把电磁炉拿了过来,万事具备,只欠宾客了,都准备好了,开始给她们打电话通知了,其实在之前也都给他们打过招呼了,现在也就是告诉他们开饭了。武婷自告奋勇的要给大家煮饺子,呵呵!最后我也记不清出来了多少人,但是粗粗的估计一下也有20左右人吧!呵呵还是比较大的饺子大聚餐阿!

把大家都叫齐了,也开吃了,看着大家调汁的调汁,弄水果的弄水果,煮饺子的煮饺子,呵呵,其实吃饭在这种时候也就成了一种简单的形式,重要的是大家在一去弄吃的,大家有说有笑的那种感觉。把大伙聚到了一起,一起开始真正的生活,这个时候感觉大家都是真实的,生活也才是真实的。虽然后来由于饺子比较香甜大家吃的不够了,看着大家意犹未尽的样子,我想–也许下一年我可以不用去提醒大家了,他们会自己聚到一起。



20
Dec

一颗不安份的心



就要离开学校了,总想着还应该做点什么事情,做点有意义的事情,做点我力所能及还能对别人都有意义的事情。在这个学校学习生活了6年多了,在这里我们都收获了不少,也应该为她做点什么了。。。

呵呵,总是有一颗不安份的心!正如我总结的那句话—一切的躁动都想归于平静,但一切的平静也会不甘于平静!

那就继续不安份下去吧!

最近每周我都在组织讨论,在新校区组织讨论之后,接着就在老校区连续几周都没有停的组织讨论会,以方面我需要学习,另一方面还是想留下来一些东西。上上周邀请曹老师给我还讲了一下软件测试理论和一些基本方法,上周的小苏的登录管理系统讲述和虚拟文件系统讨论,这周的审计系统的讨论,这一路下来反而感觉我收获颇多呢!!!

下周准备讨论一下lsm的动西和继续完成虚拟文件系统的实现问题,还有这个次还想组织一次针对于研究生的Linux基础讲座,当然我是主讲啦!呵呵。。。老校区这边研究生还有很多对Linux感兴趣的同学,所以也想通过这次活动让他们可以学习的更顺利一点!

Linux基础讲座

针对对象:对Linux感兴趣的研究生
活动主题:
1.The Culture and History of UNIX and GNU/Linux
2.The Subsystem of GNU/Linux
3.How to Ride This Black Beauty

主办组织:西邮Linux兴趣小组

地点: 西安 雁塔区 西安邮电学院(老校区)15楼会议室
类型: 讲座/沙龙

计划分为三场去讲,主要针对于咱们学校的研究生,时间在进一步确定吧!哈哈



20
Dec

禅悟凡事



也不知道怎么会写这样以题目!只是它在我脑边一闪而已!

听着宗胜大哥的《凡人歌》。。。我就是一个平凡的人,去做着一些平凡的而且自认为有意义的事。

舍友给我假设:“如果真有2012这样的灾难,你怎么办!”,过好我的每一天吧,该怎么生活还是怎么生活,那是天灾非你个人能力所及的,而且真能有机会坐方舟逃过,那对你的机会也是渺茫的,何不去享受现在每一天的生活呢。

酒桌上一位兄弟对我说:“人最难的是什么–宽容一切!”。你能都每一个认都能宽容的对待么?扪心而问“不能”。但我在学者去宽容,宽容让我每天可以笑的很自然!让我的心得以自由。

佛家倡导无欲无求,认为无欲无求是人生的最高境界,但我却不以为然,无欲无求-这岂不是最大的欲望么!呵呵!!没有欲望即是最大的欲望,没有自由即是最大的自由,没有方向这才是最大的方向!

终是在学习对事代物以平常心待之,尤其在现在这个比较混乱的社会,更需要平常之–最大的欲望阿!

你我皆凡人,生在人世间,终日奔波苦,一刻不得闲,既然不是仙,难免有杂念!



9
Dec

人生的经历总是有益的



上周四作了一次xhttpd项目开发的讲座,把xhttpd开发所需要的技术和相关知识点都讲了一遍,去讲的也是比较匆忙,因为原计划要简述2个半小再加半小时的互动,结果最后在1个半小时讲完了加了10分钟的一个互动,原因是去的有点迟了,师妹们还要赶着回老校区,所以就。。。讲述的也是有点快了。

其实在那边简述也就是想把这个项目再次的介绍给小组的同学们,说实话这个项目对于练习和提高是非常有帮助的。我也确实真是想把这个项目继续在小组内部发展下去,最近小苏师妹在做登录系统,看她还是做的津津乐道的,从基本的登录识别,到用户的添加,管理用户信息的更新,到用户密码用md5加密再验证,而且也让我学到了不少以前学习时遗漏的知识点。呵呵!也算让我看到这个自由项目发展的希望了。

上周日让武婷在老校区这边也做了一个sysfs的讲座,中间我又补充了一些,武婷现在也算是很厉害了。sysfs也算是搞的比较透彻了,接下来我想应该让她做点什么了,呵呵。。。。

好好做吧,我还是要尽力的去做!毕竟对我对她们来说这都是一种经历。人生的经历总是有益的!



9
Dec

日子



也许真是要离开了,总是感觉在离开前应该做点什么,就如我所信奉的信念一样:在可能的情况下尽量做一些对其他人有用的事。在这个学校也有6年多的时间了,也可以说我最为美好青春岁月是在这样一个学校渡过的,当然我也是很享受我这几年的光阴,虽说也有那么点点的遗憾,也感觉那才是正常的生活,况且太完美那就不是真实的我了。

总想留下点什么,能给别人留下点什么。

在剩下的这段时间里,我会尽量的去对参与小组的活动,我也争取能把那几个小项目真正能够放在小组继续发展下去。我带走了,项目也许就会沉寂下来,留下来将会有更大的用处,我想是这样的。而且我也在努力的这样做。毕竟要走了,总要做点更为有意义的事情吧!

还有实验室的师弟师妹们,毕竟在一起时间那么长了,总想也是能力所能及的为他们做点什么留点什么。在一起学习生活还是很开心的,小孙师妹说在我离开的时候要给我唱首歌–《启程》。呵呵!是“启程”阿!现在想每周组织一次讨论学习,也让她们快点走成长吧。

接下来的日子里,好好做好毕业设计,好好去做那些应该做的、而且有意义的事情!



23
Nov

整理了两张linux网络分析的图





17
Nov

ipv4内核初始化分析-sock的创建



sock创建的主要数据结构是下面这个结构体:

  1. static struct net_proto_family inet_family_ops = {
  2.         .family = PF_INET, //这里的值可以是PF_AX25,PF_UNIX,PF_IPX,PF_INET6。。。
  3.     // 这些都在include/linux/socket.h 这个文件中定义了,
  4.         .create = inet_create,                                                                  
  5.         .owner  = THIS_MODULE,
  6. };

从include/linux/socket.h这个里面可以看出,所谓的PF_INET和AF_INET就是一回事,只是叫法不一样而已
AF = Address Family
PF = Protocol Family
AF_INET = PF_INET
  所以,理论上建立socket时是指定协议,应该用PF_xxxx,设置地址时应该用AF_xxxx。当然AF_INET和PF_INET的值是相同的,混用也不会有太大的问题。
在写网络程序的时候,建立TCP socket一般是这样的:
sock = socket(PF_INET, SOCK_STREAM, 0);
  然后在绑定本地地址或连接远程地址时需要初始化sockaddr_in结构,其中指定address family时一般设置为AF_INET,即使用IP。

  1. static int __init inet_init(void){
  2. 。。。。
  3. (void)sock_register(&inet_family_ops);
  4. 。。。。
  5. }
  6. static const struct net_proto_family *net_families[NPROTO] __read_mostly;

这里进行了内核socket操作操作的注册

  1. int sock_register(const struct net_proto_family *ops)
  2. {
  3. 。。。
  4.  net_families[ops->family] = ops;
  5. 。。。
  6. }

这里是sock创建时调用的函数

  1. static int __sock_create(struct net *net, int family, int type, int protocol,
  2.                          struct socket **res, int kern)
  3. {
  4. 。。。
  5. const struct net_proto_family *pf;
  6. 。。。这里是根据想用的协议来取得相应的sock创建函数
  7. pf = rcu_dereference(net_families[family]);
  8. 。。。
  9. err = pf->create(net, sock, protocol);
  10. 。。。
  11. err = security_socket_post_create(sock, family, type, protocol, kern);
  12. //这里是启用了lsm的安全模块后的,这里不做为重点分析,以后再分析。
  13. 。。。
  14. *res = sock;
  15. }

下面就pf->create(net, sock, protocol);函数进行分析。分析内核如何创建socket。
pf所指向的create这个函数的真实实现是这里net/ipv4/af_inet.c中的这个函数:
static int inet_create(struct net *net, struct socket *sock, int protocol)

在这个函数中创建并且根据用户请求sock的类型去初始化sock的相关操作。即初始化了sock->ops;
在以后的sock相关调用的时候就直接调用sock->ops->xxx函数了,比如sock->ops->bind,
sock->ops->connect,sock->ops->listen,sock->ops->sendmsg,sock->ops->recvmsg,
sock->ops->setsockopt。。。
而且还初始化了sock相关状态等信息。
而这里用于初始化sock->ops的数据结构是inetsw数组,这个数据是事先注册好的一个结构体数组。在后面会继续分析到。



11
Nov

内核中ipv4分析—协议族的初始化



在内核中ipv4的初始化工作是由这个函数来做的。

  1. static int __init inet_init(void)

而这个函数一开始要做的事就是注册协议族。如下:

  1. rc = proto_register(&tcp_prot, 1);//注册tcp的协议族
  2. 。。。
  3.         rc = proto_register(&udp_prot, 1);//注册udp的协议族
  4. 。。。
  5.         rc = proto_register(&raw_prot, 1);//注册raw原始协议族
  6. 。。。

这些协议族都注册到proto_list这个链表上了,

  1. static LIST_HEAD(proto_list);

关于已经注册的协议族的信息可以在/proc/net/protocols中查看。
如下,在我的系统中已经注册的协议族有PACKET,RAWv6,UDPLITEv6,UDPv6,TCPv6 ,UNIX,UDP-Lite,
RAW,UDP ,TCP,NETLINK
这里表示了这些协议族的使用情况和使用的内存分配方式,以及已经实现的方法。

而这些信息都是由net/core/sock.c 中的proto_seq_printf函数打印输出到protocols文件中的。原型如下:

  1. static void proto_seq_printf(struct seq_file *seq, struct proto *proto)

在proc系统下对应的文件是/proc/net/protocols

  1. helight@zhwen:/proc/net$ cat protocols 
  2. protocol  size sockets  memory press maxhdr  slab module     cl co di ac io in de sh ss gs se re sp bi br ha uh gp em
  3. PACKET     520      0      -1   NI       0   no   kernel      n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n
  4. RAWv6      680      0      -1   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  n  y  y  y  y  n  n
  5. UDPLITEv6  664      0      -1   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  n  n  y  y  y  y  n
  6. UDPv6      664      0       1   NI       0   yes  kernel      y  y  y  n  y  n  y  n  y  y  y  y  n  n  y  y  y  y  n
  7. TCPv6     1332      1      31   no     304   yes  kernel      y  y  y  y  y  y  y  y  y  y  n  y  n  n  y  y  y  y  y
  8. UNIX       452    326      -1   NI       0   yes  kernel      n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n
  9. UDP-Lite   536      0      -1   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  y  n  y  y  y  y  n
  10. RAW        516      0      -1   NI       0   yes  kernel      y  y  y  n  y  y  y  n  y  y  y  y  n  y  y  y  y  n  n
  11. UDP        536      3       1   NI       0   yes  kernel      y  y  y  n  y  n  y  n  y  y  y  y  y  n  y  y  y  y  n
  12. TCP       1204     21      31   no     304   yes  kernel      y  y  y  y  y  y  y  y  y  y  n  y  n  n  y  y  y  y  y
  13. NETLINK    460      6      -1   NI       0   no   kernel      n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n

其中这里的cl co di ac io in de sh ss gs se re sp bi br ha uh gp em分别表示以下函数的实现。

  1. proto_method_implemented(proto->close),
  2. proto_method_implemented(proto->connect),
  3. proto_method_implemented(proto->disconnect),
  4. proto_method_implemented(proto->accept),
  5. proto_method_implemented(proto->ioctl),
  6. proto_method_implemented(proto->init),
  7. proto_method_implemented(proto->destroy),
  8. proto_method_implemented(proto->shutdown),
  9. proto_method_implemented(proto->setsockopt),
  10. proto_method_implemented(proto->getsockopt),
  11. proto_method_implemented(proto->sendmsg),
  12. proto_method_implemented(proto->recvmsg),
  13. proto_method_implemented(proto->sendpage),
  14. proto_method_implemented(proto->bind),
  15. proto_method_implemented(proto->backlog_rcv),
  16. proto_method_implemented(proto->hash),
  17. proto_method_implemented(proto->unhash),
  18. proto_method_implemented(proto->get_port),
  19. proto_method_implemented(proto->enter_memory_pressure));