2012年总结

这几天年会、婚礼轮轴转,这会终于能闲下心来写点东西,总结一下过去一年的点滴!

此刻是2013-01-27 21:33,以我目前的写作水平,我不知道此文最后会是什么样子,只能先来头脑风暴一下2012的关键词。

学英语、找工作、改变、记录、忙里偷闲这几个词可以总结我的2012年。

学英语

英语一直是我的硬伤,听说读写样样烂,尽管我认为去狂补也无济于事,但为了找工作,只能放手一搏,企求屌丝能够逆袭。

学习英语音标,背单词,背常用短语,学习语法,听VOA Special,做听写,写日记(这个后来实在写不下去了,因为每天的日记都千篇一律)。

背过几遍托福单词,由VOA Special过渡到VOA Standard,后来听老托福听力,慢慢有了点信心。

万事开头难,遇到不熟悉的事情,总会担心无法搞定,但我们只要克服心中的畏惧,使劲搞,可能就会离成功越来越近。

后来把国内的某个考试通过了,成绩尚可,但我还是觉得英语比较差,到了一个更高的瓶颈,而且发现我的中文也有同样的问题:写不通顺、说不流畅、读下句忘前句、听话只记当前句。

语言是我一个很头疼的问题,未来可能会给我带来不少麻烦,必须想办法去完善,书读得少、话说得少、少与人交流是导致这个问题的几个重要原因。

还是多看点书、多背点文章、学唱几首歌、多和人说话吧!

找工作

这是人生的几件大事之一,是2012年的头等大事,给予了足够的重视,却未做好充分的准备。

6月份才正式开始准备找工作,看书、复习算法,先后看了《深入理解计算机系统》、《编程之美》、《编程珠玑》、《程序员面试宝典》、《深入理解Java虚拟机》、《Cracking the Coding Interview》等书,复习了线性代数、概率与统计、组合数学等知识,陆陆续续也在网上看了一些面试题,从8月底开始面试,一直到11月底结束战斗。

先来说一些好的。首先,简历还算漂亮,之前玩过一些技术,也做过一些有趣的项目,还是有比较实在的内容。其次,大部分笔试做得还行,有几个笔试应该算是挺不错的。最后,很多公司前几轮的技术面试基本能通过,主要考查内容是写代码或问一些比较细节的技术问题。

不足的是中后期的面试几乎都挂在最后一轮,在谈人生谈理想中谈挂了,最后自己总结的一个原因是:害怕说话,面试前就觉得面试可能会不成功结果怎么可能理想。没有野心,没有魄力,没有信心,不知道最想做的事情是什么,不知道喜欢什么,对未来没做好规划,交流能力欠缺,不会表达自己……这些导致了一次次的面试失败。

周围的同学经过一些面试后总结出经验,一个个都练成了面霸,而我依然还是新手,跟面试官谈话容易找不到头绪,时不时还会紧张,特别是谈人生谈理想时,简直被同学们完爆好几条街。

众多公司的面试当中,Google给人的体验最好的,很遗憾的是在9月底时就和Google、Microsoft和Hulu这些公司说再见,以至于我后面失去了信心和斗志,我真得还需要去好好锤炼。

求职过程中的几多辛酸能有几人理解,现在差不多已成定局,虽然不是最期盼的,但也比较满意,应该是离下一步的目标最接近。这几个月中想明白了一些问题,这对个人的成长来说非常重要。

单就找工作历程就可以另开一篇文章来写了,这个有时间再来构思吧。

改变

有一天,上帝突然对我说:“你不能再做一个木讷呆板的码农,你要改变!”于是,我开始尝试改变自己。

其实,在很久很久以前,我曾以为只要技术做得足够好就行了,但现在才发现原来光有技术是不够的,身体状况、精神状态、交际能力等可能会阻碍我在技术领域走得更远。于是,我必须做出改变。

心想着要干牛逼的事情,但我自知不是一个牛逼的人,只是个听话的学生、孩子,而不是聪明的学生,对于给予的任务,会想尽办法做到最好,却很少去想为什么要做那样的事情、去想为什么要接受那样的任务、去想做那样的事情后对自己有何提高,一直在做很多各式各样的事情,很杂很泛,没有重心,没有积累,没有提高,而且过得比较累。有时眼高手低,不愿做一些不起眼的事情,有些事情不愿意做第二次,其实如果能把基本的事情做牛逼了也是一件了不起的事情,任何事情都能让一个人成长,只有自己看得不够远安于现状时才会原地踏步。因此,我不能什么都想做,否则我会一直是个半吊子,我必须找到一个喜欢做的事情,深入去学习去探索,以期成为某个方面的专家。

什么都能接受意味着什么都不想接受,要以挑剔的眼光看世界,能分清是非黑白,有喜好与厌恶,在尘世中保持一颗平凡而真诚的心。

多看书、多看电影,并在其中学习琢磨作者、导演、人物的思想、情绪以及感情等。

多说话,改变一贯沉默不语的风格,不过目前还未改变彻底,或许,我天生就是个观察者和行动者,话不多。

多与人交往,扩大交际圈子,通过交流来学习一些课本上没有东西,在生活中学习。

多运动,打羽毛球,游泳,健身,保持一个强健的体魄,才有精力学习与工作。羽毛球水平一般,游泳刚学会自由泳,动作不是很规范,游得很慢且比较吃力。

开始吃以前不吃的葱、姜、蒜、芹菜等。

记录

主要是记录了一年完整的简短日志和财政收支。

我也没想到我能完成上面的任务。但目前的日志还存在一些问题,比如信息不够详细:没有时间、地点、人物及重要事件。

在年初做的财政计划就是每月将收入的30%存起来,有几个月支出比较大,超出了收入,虽然整年支出比较多,最后算下来还是攒了一笔小钱。

忙里偷闲

忙学习、忙项目、忙找工作、忙毕设,但劳逸结合可能效率会更佳,特别是看到各种程序员猝死的消息,更不敢像以前那样拼命了,本来体质就没别人好,容易把命都拼没了,因此大胆做出了改变,每周抽出点时间看看电影或出去玩玩,积极参与各种活动。

春游、夏游、上海两日游、骑行、海边游泳等各种活动还不少,后来又萌发学习摄影的念头,要以摄影师的眼光看世界,记录生活的点滴,于是买了个单反,但现在手中利器还不太会使用,各种摄影技术还不知晓,路还很长,慢慢学习。

某天,好像发神经似的想学习笛子,于是就在京东买了一把G调竹笛和一本笛子教程,学习笛子的初衷是为了练气,因为平时说话老感觉气不顺,于是要练习呼吸,这个理由似乎有点无哩头。买完也没花太多时间去练,目前还不会。

现在又觉得我想做的事情太多了,需要砍掉一些,不能太贪心了,专心搞好一个就好了。

=====================================================

华丽的分界线下就要来看看去年所做的2012年计划的完成情况以及做2013年计划。

去年所做的新年计划如下:

1. 工作:年后把一切杂事处理完,开始新的工作;
2. Java:继续学习,最好能脱离IDE;
3. 找工作:可能去外企?互联网公司?一切皆是未知数,不想花太多时间在准备找工作上,找一个喜欢的、成长空间较大的职位就好;
4. 英语:加强口语、写作,希望能达到与外国人简单交流、写paper的程度,如果能过六级或托福考试那更好;
5. Hadoop:学习MapReduce、熟悉外围系统、学习源码;
6. 练说话之道:能清楚地表达思想,与人流畅沟通,变得自信;
7. 读好书,2012年书单:http://book.douban.com/doulist/1432612/;
8. 提高游泳、羽毛球技术;
9. 去一个离北京远点的地方旅行;
10. 了解中国IT行业及互联网的发展趋势,寻找适合自己的方向;
11. 让自己更稳重、更有主见、胸襟更宽广。

1、2、3、8、9基本完成。

4、5、6没达到理想程度。

书单中的深入理解计算机系统、C程序设计语言、设计模式、编程珠玑、重构、编程之美、程序员修炼之道、Effective Java中文版、厚黑学、怪诞心理学、如何阅读一本书、史蒂夫·乔布斯传、一系列英语相关书籍、学会提问:批判性思维指南看完,大概完成了50%。

10中目前还是没能找到适合自己的方向,有点迷茫,只知道自己喜欢干实事,想做一些跟数据相关的事情,在工作之余我得找一个方向来学习。我需要去了解自己认识自己,根据自己所擅长的事情来定目标,利用自己的天赋来达成目标。

2013年计划:

  1. 完成毕业设计,顺利毕业
  2. 按期入职,熟悉公司环境,完成研修期任务,顺利转正
  3. 学习一个新的技术
  4. 尝试混一些问答社区,像Stack Overflow、Quora、知乎等
  5. 学习数学,从小就喜欢数学,但上本科后竟给落下了,数学是个奇妙的东西
  6. 学习英语,在外企工作必须用英语交流,对以后的发展肯定也有好处,目前计划是:每天看和读一篇文章、每天听英语新闻、背一些美文、学唱一些英文歌、争取写日记
  7. 学习摄影,有空的话多出去拍些照片,在实践中学习
  8. 多看书,不过买了一堆纸质书又没看后,为了节能环保,我还是看电子书吧
  9. Topcoder攒rating
  10. 运动健身,找羽毛球、游泳、仰卧起坐、卧推
  11. 了解一些新的方向,比如机器学习、机器视觉、数据挖掘、数据库等其中的一两个
  12. 学习经济学知识
  13. 在博客上多写一些有价值的文章
  14. 有一个计划,实现这个计划的时间可能会比较长,最后也可能没能实现,但不管怎样,努力去奋斗吧

好了,就列这么多了,2013年估计也没太多的空闲可利用时间

当对社会和自己认识越清晰,就越觉得对有些事情自己无能为力…

谨以此文纪念我逝去的2012年!

研究生第8季

  岁末年初,现正拖着2012的尾巴走向2013,在这跨年夜(我已记不起从什么时候起,12.29这一晚上多了点跨年的味道),身边几个同学在看跨年晚会,本也想凑个热闹,无奈我的Archlinux不给力呀,怎么整都播不了mms协议,只能另找乐子。本想写篇2012年的总结,但我习惯等回家时静下心来好好梳理一年发生的事,想起这么一篇小记被落下了,赶紧收拾心情,写下一点笨拙而苍白的文字。

小记:

  • 准备某个英语考试,并以不错的成绩通过了,但我不能明说,了解我的亲们你们懂的,这是我多年心中的痛,英语依然还是我的痛处,写12年总结时会再细细道来。
  • 参加阿里巴巴的一些活动,为找工作准备。
  • 学习Linux驱动,不过项目上的事情进展不是很顺,后来就没有然后了。
  • 参加几个活动,听师兄师姐介绍找工作经验,对后来找工作很有帮助,感谢你们无私地把一些宝贵经验倾囊相授。
  • 崔皓组织北理工的同学去蟹岛游乐场,玩得很high,有些高空项目还有有点惧。见到了不少生人,但是我不是那种初次见面就能成为朋友的人,与很多人仅仅是一面之缘,在为人处事方面还是要多多改善。
  • 看《深入理解计算机系统》、《编程之美》、《编程珠玑》、《Linux设备驱动》、《如何阅读一本书》、《Java程序员面试宝典》、《其实你不懂广东人》、《美语发音13秘诀》。
  • 写中英文简历。
  • 参加Hulu Open Day,被Hulu的高品质、快节奏工作所感染,希望能进入到这样的团队中,可惜自己还不够优秀。比较幸运,得到一个奖品——Hulu挎包。
  • 搬回了青年公寓,离开科一招那一刻心中对科一招的不舍之心喷涌而出,平时看起来冷漠,关键时刻却几多伤感。
  • 两个好友相继结婚,身边的人一个个开始组建家庭,不知什么时候我才能认真考虑这个问题。
  • 回家,这几年很少回家,也很少往家里打电话,面对家人真不知说什么好,总不能说技术吧,在这方面,我真的是很不孝,趁现在回家还方便,有时间就多回家看看,探望日益年长的父母。
  • 研读“结构之法算法之道”、“何海涛博客”等网站的算法题及文章
  • 看公开课《Algorithms Part I》
  • 实验室北戴河夏游,大一时去过一次,因此并不是很期待,不过比较喜欢参加集体活动,所以报名了,最后大家对这一次出游评价都不是太好。
  • 开始找工作内推,阿里巴巴一二面,阿里巴巴所有也就两轮面试,这是最早拿到的offer。

  这一篇继续以流水帐的形式记录我在6、7、8月份的一些经历和体会,或许这会是记研究生系列的最后一篇,最近三个月发生的事我会在年终的总结中详细说,未来半年最重要的事情是毕设,比较单调。回头看这两年,能坚持每个季度写一篇小结对我个人来说已很不容易,虽然已在这个世界活了二十五年有余,但我写过的文字、说过的话少得可怜,看过的书也是屈指可数,导致在语言组织与人际交往等方面的能力很弱,我因此在求职过程中吃了很大的亏。于是,我现在会鼓励多去尝试一些新鲜的事物,不要因为不熟悉就退避三舍,不会可以学习,多接触一些人和事有利于自己的成长。要有眼光和远见,不要局限于当下所拥有和掌握的东西,要明确自己的目标,做好一切准备去争取自己想要的东西,持续学习,不断积累,厚积薄发。

  完结。。。

Hadoop基准测试

测试对于验证系统的正确性、分析系统的性能来说非常重要,但往往容易被我们所忽视。为了能对系统有更全面的了解、能找到系统的瓶颈所在、能对系统性能做更好的改进,打算先从测试入手,学习Hadoop几种主要的测试手段。本文将分成两部分:第一部分记录如何使用Hadoop自带的测试工具进行测试;第二部分记录Intel开放的Hadoop Benchmark Suit: HiBench的安装及使用。

1. Hadoop基准测试

Hadoop自带了几个基准测试,被打包在几个jar包中,如hadoop-*test*.jar和hadoop-*examples*.jar,在Hadoop环境中可以很方便地运行测试。本文测试使用的Hadoop版本是cloudera的hadoop-0.20.2-cdh3u3。

在测试前,先设置好环境变量:

$ export $HADOOP_HOME=/home/hadoop/hadoop
$ export $PATH=$PATH:$HADOOP_HOME/bin

使用以下命令就可以调用jar包中的类:

$ hadoop jar $HADOOP_HOME/xxx.jar

(1). Hadoop Test

当不带参数调用hadoop-test-0.20.2-cdh3u3.jar时,会列出所有的测试程序:

$ hadoop jar $HADOOP_HOME/hadoop-test-0.20.2-cdh3u3.jar
An example program must be given as the first argument.
Valid program names are:
  DFSCIOTest: Distributed i/o benchmark of libhdfs.
  DistributedFSCheck: Distributed checkup of the file system consistency.
  MRReliabilityTest: A program that tests the reliability of the MR framework by injecting faults/failures
  TestDFSIO: Distributed i/o benchmark.
  dfsthroughput: measure hdfs throughput
  filebench: Benchmark SequenceFile(Input|Output)Format (block,record compressed and uncompressed), Text(Input|Output)Format (compressed and uncompressed)
  loadgen: Generic map/reduce load generator
  mapredtest: A map/reduce test check.
  minicluster: Single process HDFS and MR cluster.
  mrbench: A map/reduce benchmark that can create many small jobs
  nnbench: A benchmark that stresses the namenode.
  testarrayfile: A test for flat files of binary key/value pairs.
  testbigmapoutput: A map/reduce program that works on a very big non-splittable file and does identity map/reduce
  testfilesystem: A test for FileSystem read/write.
  testipc: A test for ipc.
  testmapredsort: A map/reduce program that validates the map-reduce framework's sort.
  testrpc: A test for rpc.
  testsequencefile: A test for flat files of binary key value pairs.
  testsequencefileinputformat: A test for sequence file input format.
  testsetfile: A test for flat files of binary key/value pairs.
  testtextinputformat: A test for text input format.
  threadedmapbench: A map/reduce benchmark that compares the performance of maps with multiple spills over maps with 1 spill

这些程序从多个角度对Hadoop进行测试,TestDFSIO、mrbench和nnbench是三个广泛被使用的测试。
Read more »

解决ArchLinux的utorrent文件名中文乱码问题

晚上看师弟机器上的新版utorrent的界面看起来比我机器上的友好,于是用yaourt utorrent安装了新版的utorrent(aur/utserver 27079-1),安装很顺利,安装完成后修改/etc/conf.d/utserver文件中的以下内容:

UTSERVER_USER="utserver"

将utserver换成我的用户名,然后运行以下命令启动utserver:

sudo rc.d start utserver

然后在浏览器输入地址http://127.0.0.1:8080/gui/,很正常,修改下载目录和临时目录。找了几个种子进行试验,界面能显示中文信息,也能正常下载,下载完成后,发现问题来了:文件名中的中文字符全成了问号(???)?好像很久很久之前也遇到这个问题,但忘了怎么解决,只悔当时没做笔记。

接着,逐步排查问题,先看看utserver的日志文件/var/log/utserver/utserver.log,发现第一行如下所示:

Using locale C

这样原因就很明确了,locale没设置正确,utserver启动后,我期望能看到的第一条日志是下面这样:

Using locale en_US.UTF-8

有目标就好办了,首先,我尝试在命令行运行utserver,我所期待的结果出现了,进一步确定是运行后台daemon时locale没设置正确,与该问题相关的是/etc/rc.conf配置文件中的两个环境变量:

LOCALE="en_US.UTF-8"
DAEMON_LOCALE="yes"

如果DAEMON_LOCALE设置为”yes”,那么运行daemon时使用$LOCALE,如果$LOCALE为空,使用locale C;如果DAEMON_LOCALE设置为”no”,使用locale C。但是我的/etc/rc.conf配置文件没有问题。

接着我想是不是应该在运行utserver时设置环境变量LANG,于是在/etc/conf.d/utserver文件中添加以下内容:

LANG=en_US.UTF-8

发现不奏效,最后只能去看/etc/rc.d/utserver这个脚本里的内容,内容不多, 很快就将目标锁定到下面这条命令:

su -l -s /bin/sh -c "/usr/bin/utserver $UTSERVER_ARGS >/dev/null 2>&1" $UTSERVER_USER

这条命令的作用是切换到$UTSERVER_USER这个用户,利用/bin/sh来运行utserver,那问题就应该出在切换用户后locale没正确设置,于是我将命令改为:

 su -l -s /bin/sh -c "export LANG=en_US.UTF-8; /usr/bin/utserver $UTSERVER_ARGS >/dev/null 2>&1" $UTSERVER_USER

重新启动utserver,我所期待的结果出现了,至此,问题解决了。

在Linux系统上,出现各种问题是很正常的现象,在这种情况下不要慌,先查看日志,寻找解决之道,也可以上Google搜索已观察到的现象,看看别人是如何解决我们所遇到的问题。

HDFS源码分析(10):HDFS输入/输出流

前提

Hadoop版本:hadoop-0.20.2

概述

在上一篇文章中HDFS源码分析(9):DFSClient初步介绍了HDFS客户端的相关内容,但由于篇幅关系,没有对HDFS的输入/输出流进行介绍,而这正是本文的重点。数据的读取和写入是客户端最重要的功能,也是最主要的逻辑,本文将分成输入和输出两部分对HDFS的文件流进行分析。主要的类位于org.apache.hadoop.hdfs.DFSClient类中。

DFSInputStream

DFSInputStream的主要功能是向namenode获取块信息,并且从datanode读取数据,但涉及到的问题也不少:一个文件被分割成多个块,每个块可能存储在不同的datanode;如果一个datanode挂了,要尝试另一个datanode;文件损坏了……因此,我们必须仔细地进行分析,那么,当要在客户端添加或修改功能时才不至于无从下手。

先来看看类图,从总体上把握类之间的关系,由于类比较多,所以略去了不少类,只剩下一些重要的类,因此下面的类图并不完整:

看大图可能需要越过某座墙
Read more »

HDFS源码分析(9):DFSClient

前提

Hadoop版本:hadoop-0.20.2

概述

在上一篇文章中HDFS源码分析(8):FileSystem已对Hadoop的文件系统接口进行了简单的介绍,相信读者也能猜到HDFS会对外提供什么样的接口。为了让读者对HDFS有个总体的把握,本文将对DistributedFileSystem和DFSClient进行分析,这两个类都位于包org.apache.hadoop.hdfs下。

好了,废话不多说,真奔主题吧。

DistributedFileSystem

DistributedFileSystem是用于DFS系统的抽象文件系统的实现,继承自FileSystem,用户在使用HDFS时,所使用的文件系统就是该实现。但是DistributedFileSystem的实现并不复杂,没有过多的逻辑,大部分方法会间接调用DFSClient的方法,使DFSClient能兼容Hadoop的FileSystem接口,从而能在Hadoop系统中工作,这不就是设计模式中的Adapter(适配器)模式吗?

我们先来看看与DistributedFileSystem相关的类图,由于涉及到的类繁多,因此只列出关键类的属性和方法,其它的类只有类名:

看大图可能需要越过某座墙
Read more »

HDFS源码分析(8):FileSystem

前提

Hadoop版本:hadoop-0.20.2

概述

之前已对HDFS的datanode部分的源码进行了分析,还剩client和namenode这个最最重要的部分,本着从简单入手,打算继续把namenode当成是一个黑盒,先分析client的代码,毕竟client的代码行数与namenode相比要少得多。

很粗地把client的代码浏览了一下,发现client暴露给用户的接口是DistributedFileSystem这个东东,该类实现了FileSystem这个通用文件系统的抽象类。FileSystem位于core中,并不是HDFS专用的,先对FileSystem进行分析,有助于从宏观上去剖析DFS。

本以为把FileSystem这个类的代码看一遍应该就差不多了,看着看着才发觉FileSystem这个类好庞大、关联依赖的类好多,从下面的类图就可以看出来。虽说类多、方法多,但逻辑相对简单,比较容易理解。


Read more »

《Linux设备驱动程序》第十八章 TTY驱动程序读书笔记

  • 简介
    • tty设备的名称是从过去的电传打字机缩写而来,最初是指连接到Unix系统上的物理或虚拟终端
    • Linux tty驱动程序的核心紧挨在标准字符设备驱动层之下,并提供了一系列的功能,作为接口被终端类型设备使用
    • 有三种类型的tty驱动程序:控制台、串口和pty
    • /proc/tty/drivers
    • 当前注册并存在于内核的tty设备在/sys/class/tty下都有自己的子目录
  • 小型TTY驱动程序
    • <linux/tty_driver.h>
    • struct tty_driver
    • tiny_tty_driver = alloc_tty_driver(TINY_TTY_MINORS);
    • static struct tty_operations serial_ops = {.open=tiny_open, .close=tiny_close, .write=tiny_write, .write_room=tiny_write_room, .set_termios=tiny_set_termios,}
    • tiny_tty_driver->owner=THIS_MODULE;
    • tiny_tty_driver->driver_name=”tiny_tty”;
    • tiny_tty_driver->name=”ttty”;
    • tiny_tty_driver->devfs_name=”tty/ttty%d”;
    • tiny_tty_driver->major=TINY_TTY_MAJOR;
    • tiny_tty_driver->type=TTY_DRIVER_TYPE_SERIAL;
    • tiny_tty_driver->subtype=SERIAL_TYPE_NORMAL;
    • tiny_tty_driver->flags=TTY_DRIVER_REAL_RAW|TTY_DRIVER_NO_DEVFS;
    • tiny_tty_driver->init_termios=tty_std_termios;
    • tiny_tty_driver->init_termios.c_cflag=B9600|CS8|CREAD|HUPCL|CLOCAL;
    • tty_set_operaions(tiny_tty_driver, &serial_ops);
    • retval = tty_register_driver(tiny_tty_driver);
    • for (i=0;i<TINY_TTY_MINORS; ++i) tty_unregister_device(tiny_tty_driver, i);
    • tty_unregister_driver(tiny_tty_driver);
    • termios结构
      • 用来提供一系列安全的设置值
      • struct termios
        • tcflag_t c_iflag;
        • tcflag_t c_oflag;
        • tcflag_t c_cflag;
        • tcflag_c c_lflag;
        • cc_t c_line;

Read more »

《Linux设备驱动程序》第十七章 网络驱动程序读书笔记

  • 简介
    • 网络接口是第三类标准Linux设备,本章将描述网络接口是如何与内核其余的部分交互的
    • 网络接口必须使用特定的内核数据结构注册自身,以备与外界进行数据线包交换时调用
    • 对网络接口的常用文件操作是没有意义的,因此在它们身上无法体现Unix的“一切都是文件”的思想
    • 网络驱动程序异步自外部世界的数据包
    • 网络设备向内核请求把外部获得的数据包发送给内核
    • Linux内核中的网络子系统被设计成完全与协议无关
    • 在网络世界中使用术语“octet”指一组8个的数据位,它是能为网络设备和协议所能理解的最小单位
    • 协议头(header)是在数据包中的一系列字节,它将通过网络子系统的不同层
  • 连接到内核
    • loopback.c、plip.c和e100.c
    • 设备注册
      • 驱动程序对每个新检测到的接口,向全局的网络设备链表中插入一个数据结构
      • <linux/netdevice.h>
      • struct net_device
      • struct net_device *alloc_netdev(int sizeof_priv, const char *name, void (*setup) (struct net_device *));
        • name是接口的名字,这个名字可以使用类似printf中%d的格式,内核将用下一个可用的接口号替代%d
      • <linux/etherdevie.h>
        • struct net_device *alloc_etherdev(int sizeof_priv);
      • 光纤通道设备使用alloc_fcdev(<linux/fcdevice.h>)
      • FDDI设备使用alloc_fddidev(<linux/fddidevice.h>)
      • 令牌环设备使用alloc_trdev(<linux/trdevice.h>)
      • register_netdev函数
    • 初始化每个设备
      • example
        • ether_setup(dev);
        • dev->open = open_function;
        • dev->stop = release_function;
        • dev->set_config = config_function;
        • dev->hard_start_xmid = tx_function;
        • dev->do_ioctl = ioctl_function;
        • dev->get_stats = stats_function;
        • dev->rebuild_header = rebuild_header_function;
        • dev->hard_header = header_function;
        • dev->tx_timeout = tx_timeout_function;
        • dev->watchdog_timo = timeout;
        • dev->flags |= IFF_NOARP;
        • dev->features |= NETIF_F_NO_CSUM;
        • dev->hard_header_cache = NULL;
      • priv = netdev_priv(dev);
    • 模块的卸载
      • unregister_netdev函数从系统中删除接口
      • free_netdev函数将net_device结构返回给系统

Read more »

《Linux设备驱动程序》第十三章 USB驱动程序读书笔记

  • 简介
    • 通用串行总线(USB)是主机和外围设备之间的一种连接
    • 从拓扑上来看,一个USB子系统并不是以总线的方式来布置的;它是一棵由几个点对点的连接构建而成的树
    • 这些连接是连接设备和集线器(hub)的四线电缆(地线、电源线和两根信号线)
    • USB协议规范定义了一套任何特定类型的设备都可以遵循的标准,如果一个设备遵循该标准,就不需要一个特殊的驱动程序
    • Linux内核支持两种主要类型的USB驱动程序
      • 宿主系统上的驱动程序
        • 控制插入其中的USB设备
      • 设备上的驱动程序
        • 控制该设备如何作为一个USB设备和主机通信
  • USB设备基础
    • Linux内核提供了一个称为USB核心的子系统来处理大部分的复杂性
    • 端点
      • USB通信最基本的形式是通过一个名为端点(endpoint)的东西
      • USB端点只能往一个方向传送数据,从主机到设备(输出端点)或者从设备到主机(输入端点)
      • USB端点有四种不同的类型
        • 控制
          • 控制端点用来控制对USB设备不同部分的访问
          • 每个USB设备都有一个名为“端点0”的控制端点
        • 中断
          • 每当USB宿主要求设备传输数据时,中断端点就以一个固定的速率来传送少量的数据
        • 批量
          • 批量(bulk)端点传输大批量的数据
        • 等时
          • 等时(isochronous)端点同样可以传送大批量的数据,但数据是否到达是没有保证的
      • 控制和批量端点用于异步的数据传输,只要驱动程序决定使用它们
      • 内核中使用struct usb_host_endpoint结构体来描述USB端点,该结构体在另一个名为struct usb_endpoint_descriptor的结构体中包含了真正的端点信息
      • struct usb_host_endpoint
        • bEndpointAddress
        • bmAttributes
        • wMaxPacketSize
        • bInterval
    • 接口
      • USB端口被捆绑为接口
      • USB接口只处理一种USB逻辑连接
      • struct usb_interface
        • struct usb_host_interface *altsetting
        • unsigned num_altsetting
        • struct usb_host_interface *cur_altsetting
        • int minor
    • 配置
      • USB接口本身被捆绑为配置
      • 一个USB设备可以有多个配置,而且可以配置之间切换以改变设备的状态
      • struct usb_host_config
      • struct usb_device
      • include/linux/usb.h.
      • USB设备是非常复杂的,它由许多不同的逻辑单元组成
        • 设备通常具有一个或者更多的配置
        • 配置经常具有一个或者更多的接口
        • 接口通常具有一个或者更多的设置
        • 接口没有或者具有一个以上的端口

Read more »

Page 1 of 141234510...Last »