13 fudan_abc

尚未进行身份认证

我要认证

暂无相关简介

等级
TA的排名 4k+

代码质量保证体系——Linux

疫情在肆虐,说心忧天下貌似有些大了,只能先说些小的,在这里尝试描述一下Linux为保证代码质量所做的努力,来完成这个主题的最后一篇,也希望这段不好的日子的最后篇章也早些到来。编码规范这一环节涵盖了两个方面的含义:一份行之有效的编码规范,加上一些辅助检查代码是否符合规范的工具。一个项目可以比作一个国家,这个项目采用的编程语言就是这个国家的官方语言,每个开发者使用这门语言在这个国家里表达自己的...

2020-02-28 15:55:04

Linux开源存储网络详解

这本《Linux开源网络全栈详解:从DPDK到OpenFlow》是那本《Linux开源存储全栈详解》的姊妹篇,把Linux开源网络相关的项目做了个梳理,对于想了解或参与网络相关项目开发的人来说,也会是个不错的参考。至于下面贴出来的序,容我偷了个懒,除了内容的编排,其他部分内容和存储那本雷同^-^======================自1991年Linux诞生,时间已经走过了接近三个十...

2020-01-19 11:28:12

代码质量保证体系——OpenStack

在这个到处都是“云里雾里”的云计算时代,如果不知道点OpenStack、Kubernetes等,出门都不好意思说自己是个程序猿了。编码规范与代码静态检查程序员最讨厌的四件事应该是:写注释,写文档,别人不写注释,别人不写文档。那么对于这样一个貌似很不好相处的群体,有人说,如果莎士比亚生活在当下,他会是一名科技作家,而且他座右铭会变成:“消灭世界上所有的程序员。”消灭当然是做不到的,于是有...

2020-01-19 08:52:37

代码质量保证体系(下)

书接上回,有关代码质量保证体系里勾兑的那些个卿卿我我,还有单元测试、持续集成、代码评审与重构需要与你道来。单元测试StackOverflow上一个有16.7k分的人问了个有关单元测试的问题“How deep are your unit tests?”,意思就是说“单元测试需要做多细?”,或者换句话说“单元测试的这个单元的粒度是怎样的?”针对这个问题,下面的回答获得了压倒性的票...

2020-01-16 11:34:08

代码质量保证体系(上)

比尔·盖茨说:“用代码行数来衡量编程的进度,就如同用航空器零件的重量来衡量航空飞机的制造进度一样。”所以,相对于代码的数量,我们通常更乐意去关注代码本身的质量,也因此,在开源社区里,除了某些特殊的目的,我们也更愿意去关注一个人被接受patch的数目,而不是这些patch里代码的行数。对于“代码质量”的定义,我们应该每个人都能说个不尽相同的三言两语,但是更多的感觉可能是只可意会不可言传,很难真正...

2020-01-13 08:57:31

Linux开源存储全栈详解

最近和同事一起整了本书《Linux开源存储全栈详解:从Ceph到容器存储》,把Linux开源存储相关的项目做了个梳理,对于想了解或参与存储相关项目开发的人来说,应该会是个不错的参考。这里把当时写的序放上来:======================自1991年Linux诞生,时间已经走过了接近三个十年。即将而立之年的Linux早已没有了初生时的稚气,正在各个领域展示自己成熟的魅力。以...

2020-01-06 14:35:30

《Linux Pocket Guide 2e》中文版

前段时间和朋友翻译了Linux Pocket Guide的第二版,这本书并不涉及任何kernel的内容,不过对于linux新手来说,放在手边当参考书还是蛮好的。:)下面是译者序:昨天参加一个careertalk的活动,有邀请几位嘉宾做一些有关职业规划的讲座,其中一位前辈着重强调了Mindset(心态)的问题:当我们是一个普通engineer的时候,我们这么写自己的report“I wo

2013-04-24 20:27:05

Linux那些事儿 之 ext4文件系统(0) 引子

曾经以为人生就这样了,浮躁的心拒绝再看代码。然而来到美国两年之后,我于本月初去了一趟拉斯维加斯,发现在那儿找个美国小姐要八百美金,而且还不是包夜。当那个金发美女都已经走进我的房间,我却因为价钱太贵承受不起而决定取消的时候,我觉得我的人生真是太失败了。那晚,看她出去之后,我内心一阵郁闷,于是打开电脑开始看A片,怎奈看到一半电脑竟然说文件系统崩溃了。我心想ext4文件系统不是号称很强大吗,怎么这么容易

2012-08-25 13:47:53

《Linux那些事儿之我是USB》我是U盘(37)迷雾重重的批量传输(六)

usb_stor_bulk_transfer_sglist()函数有一定的“蛊惑性”,我们前面说过,之所以采用sglist,就是为了提高传输效率。我们更知道,sg的目的就是让一堆不连续的buffers在一次DMA操作都传输出去。其实在USB的故事中,事情并非如此。不过如果你对USB Core里边的行为不关心的话,那就无所谓了。423行,424行,退出或者断链接,就不要传递数据。然后429行

2012-05-07 13:09:04

《Linux那些事儿之我是USB》第二版 前言

从开始写Linux那些事儿系列文字开始,到如今已有四年多了,而从整理出版第一版到现在也已经一载有余了。期间不断有认识或不认识的朋友问我,怎么会想起写这么多如此可爱的文字,我的回答都是:娱乐自己,娱乐大家而已!或许,大家早已经默认技术本是一个沉重或者说枯燥的话题,我们无法用一种娱乐的心态去看待它,甚至说很多人早已丧失了从中获取乐趣的能力。但是,一切本不该如此的,对于不管什么原因踏入这个行业的我们

2012-04-15 19:23:14

《Linux那些事儿之我是USB》我是U盘(36)迷雾重重的批量传输(五)

在讲数据传输阶段之前,先解决刚才的历史遗留问题。usb_stor_bulk_transfer_buf()中,406行,有一个很有趣的函数interpret_urb_result()被调用。这个函数同样来自drivers/usb/storage/transport.c中:265 static int interpret_urb_result(struct us_data*us, unsign

2012-03-08 22:09:34

《Linux那些事儿之我是USB》我是U盘(35)迷雾重重的批量传输(四)

有时候我也被这个问题所困扰,我不知道是我不明白,还是这世界变化太快。连Linux中都引入了过期这么一个概念。设置一个时间,如果时间到了该做的事情还没有做完,那么某些事情就会发生。比如需要烤蛋糕,现在是8点30,而我们要烤45分钟,所以希望闹钟9点一刻响,当时间到了,闹钟就如期待的一样,响个不停。在计算机中,也需要做这样的事情,有些事情,需要时间控制,特别是网络、通信等,凡是涉及数据传输,就得考

2012-01-05 23:16:21

《Linux那些事儿之我是USB》我是U盘(34)迷雾重重的批量传输(三)

在usb_stor_Bulk_transport()中,这个函数中调用的第一个最重要的函数,那就是usb_stor_bulk_transfer_buf()。仍然是来自drivers/usb/stroage/transport.c:391 int usb_stor_bulk_transfer_buf(struct us_data*us, unsigned int pipe,392

2011-12-26 19:58:11

《Linux那些事儿之我是USB》我是U盘(33)迷雾重重的批量传输(二)

其实故事已经讲了很久,但如果你觉得到这里你已经把故事都看明白了,那么你错了。不仅仅是错了。不信,我们就继续看,先看512行,us->transport(),这个函数指针同样是在storage_probe时被赋值,对于U盘,它遵守的是Bulk-Only协议,因此us->transport()被赋值为usb_stor_Bulk_transport()。来看usb_stor_Bulk_transport

2011-12-15 22:15:35

《Linux那些事儿之我是USB》我是U盘(32)迷雾重重的批量传输(一)

374行,us->proto_handler()其实是一个函数指针,知道它指向什么吗?我们早在storage_probe()中,确切地说,在get_protocol()就赋了值,当时只知道是get protocol,却不知道究竟干什么用,现在该用上了,一个指针要是没什么用人家才不会为它赋值呢。当初我们就讲了,对于U盘,proto_handler被赋值为usb_stor_transparent_sc

2011-12-06 21:56:32

《Linux那些事儿之我是USB》我是U盘(31)SCSI命令之我型我秀

usb_stor_control_thread()基本讲完了,但是其中下面这几行,正是高潮中的高潮。所谓的批量传输,所谓的Bulk-Only协议。正是在这里体现出来的。371           /* we've got a command, let's do it! */372           else {373               US_DEBUG(usb_stor_s

2011-12-01 22:49:50

《Linux那些事儿之我是USB》我是U盘(30)彼岸花的传说(The End)

解决了这个INQUIRY的问题,我们就可以继续往下走了,372行,这就是真正的批量传输的地方,proto_handler()就是正儿八经的处理SCSI命令的函数指针。而usb_stor_control_thread之前的所有代码就是为了判断是不是有必要调用函数proto_handler(),比如超时了,比如模块该卸载了,比如设置断开flag了,比如要处理的就是这个有问题的INQUIRY等,这些情况

2011-11-29 20:00:36

《Linux那些事儿之我是USB》我是U盘(29)彼岸花的传说(八)

对于use_sg为0的情况,我们接下来再看168行,offset是函数调用传递进来的参数,注释里说得很清楚,就是用来标志偏移量的,每次复制几个字节它就增加几个字节,最大它也不能超过request_bufflen,这是显然的。usb_stor_access_xfer_buf()这个函数所做的事情就是从srb->request_buffer往buffer里边复制数据,或者反过来从buffer往srb-

2011-11-24 23:24:11

《Linux那些事儿之我是USB》我是U盘(28)彼岸花的传说(七)

很显然,我们是把为INQUIRY命令准备的数据保存到了我们自己定义的一个结构体中,即structdata_ptr[36],但是我们是为了回应一个SCSI命令,最终需要知道答案的是SCSI核心层。正是它们传递了一个scsi_cmnd结构体下来,即srb。struct scsi_cmnd中有两个成员,即unsigned request_bufflen和void *request_buffer,应该把d

2011-11-21 18:50:33

《Linux那些事儿之我是USB》我是U盘(27)彼岸花的传说(六)

我们继续接着上一节往下看。fill_inquiry_response(),这个函数来自drivers/usb/storage/usb.c中。266 void fill_inquiry_response(struct us_data *us,unsigned char *data,267                unsigned int data_len)268 {269

2011-11-13 22:15:17

查看更多

勋章 我的勋章
  • 专栏达人
    专栏达人
    授予成功创建个人博客专栏的用户。专栏中添加五篇以上博文即可点亮!撰写博客专栏浓缩技术精华,专栏达人就是你!
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv2
    勤写标兵Lv2
    授予每个自然周发布4篇到6篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。