作者mimi0213 (提拉米苏好好吃喔)
站内LinuxDev
标题Re: [问题] 书籍评价询问
时间Tue Jul 15 22:14:25 2014
昨天回应了文章以後,有些朋友私下请教我一些问题。这边我再多分享一些心得。
其实在台湾做真正的kernel研发没几间公司有。就我所知就Qnap, MTK, Marvell,再来就
是一些ic design house会写自己的driver,像是Realtek之类的。Driver需求其实很高。
所以长期来看想做纯kernel的研发,在台湾机会很少。扯远了。来谈谈怎麽增进自己的
Kernel/Driver能力。
1) C语言要弄熟,就K&R。
2) 订阅Linux kernel mailing list,如:Linux-kernel, Linux-usb, Linux-arm...阅读
mailing list你可以知道最新的发展,还有send patch的rule是什麽。往後遇到问题,也
可以直接用gmail查询,不用再到网路上查。重要的人物像是Linus或者是某个subsystem的
maintainer你也可以直接对他的mail做filter,之後就可以到label底下watch他的动态。
还有就是对岸的Chinaunix的内核版也是不错的。
可以阅读kernel source底下的:
Documentation/SubmittingPatches
查询怎麽用:scripts/checkpatch.pl
How to send patches:
http://www.tuxradar.com/content/newbies-guide-hacking-linux-kernel
3) 订阅LWN, 包含Daily news, bi-weekly news。如果没有花钱不会有weekly,但至少两
个礼拜看一次不会lag太多。也会知道最新的版本和大家讨论的问题。对了,如果要知道
最新的version可以订阅
[email protected] ,这个会比Linus本
人的announce还要快,估计Linus是把announce commit放到git repositories以後
script自动就会送出mail announcement。
4) 要了解distribution Kernel怎麽build或者怎麽build uptream kernel之後安装到自
己的PC上面。比方说我自己是用Ubuntu当作工作机,所以有时候会测试Ubuntu Kernel和
Upstream Kernel做bisect找bug。
怎麽build mainline kernel的debian packages:(build好以後可以直接装deb档,deb档
的优点是可以用dpkg -P xxx or apt-get purge 反安装,不像传统的make install管理
上不方便)
https://wiki.ubuntu.com/KernelTeam/GitKernelBuild
怎麽build Ubuntu kernel:
https://wiki.ubuntu.com/Kernel/BuildYourOwnKernel
个人是认为至少要会两种arch的流程比方说x86(pc) & arm。x86是平常自己使用的架构,
arm也许是工作上或者是兴趣自己研究。但唯有真正的使用自己build的kernel才会有感觉
Kernel改进什麽,什麽地方有bug。
什麽?闲太慢?!
你可以使用ccache or distcc加快build code的速度尤其是ccache非常实用。
用apt-get install ccache,之後修改Makefile
--HOSTCC = gcc
++HOSTCC = ccache gcc
>8---------------------------------8<
--CC = $(CROSS_COMPILE)gcc
++CC = ccache $(CROSS_COMPILE)gcc
什麽?还是太慢?!!
cd kernel/source/code
copy /boot/config-xxxx .config
make olddefconfig
make localmodconfig -j`getconf _NPROCESSORS_ONLN`
千万别傻傻的照着Ubuntu default config照单全build。
如果是测试的机器上面没有kernel source code,可以先用sshfs远端mount。但最好要
区网,否则慢到不行,不然倒不如git clone下来。
这个做出来的config就会小很多,因为Ubuntu的config会多build很多modules。经过试验
,debian package从6xxMB降到60MB。
如果你要做nfsroot可以改用make localyesconfig。只是要记得下之前先把要用的东西都
叫起来,比方说,usb pen先插一下,否则会没有vfat。
你问我怎麽知道这些config?? 无聊就make help一下,把觉得有用的都背下来 XDDD
随便google一下,找到的ccache教学:
http://www.vflare.org/2009/03/ccache-to-speed-up-linux-kernel-compile.html
怎麽写hello world module (网路上一堆范例,随便google一个参考看看):
http://www.thegeekstuff.com/2013/07/write-linux-kernel-module/
5) 学会用git,参考书之类像是pro git,连接一堆免费的,可以去amazon看评价,之後
抓电子书看。进阶以後可以直接订阅git mailing list看最新的开发status,和新的功能
。光是看Junio C Hamano的mail就可以学到超多观念,他图画的超好。非常推荐订阅!!
(git真的非常非常非常重要)
http://it-ebooks-search.info/search?q=git
6) 找一个editor把他弄熟,之後不要换来换去,因为同样就是editor,有的人用就可以
用的出神入化。但通常在Linux上面是用VIM,比较常用的就是trinity, ctags, cscope,
easymotion之类的。可以在kernel source root底下下
make tags cscope -j`getconf _NPROCESSORS_ONLN` 这样就只会build x86。如果想只
build ARM的可以加上ARCH=arm。想要全部都build可以用ctags -R && cscope -Rbq &。
推荐:
http://vimawesome.com/
7) 增强OS,Architecture。怎麽说呢?在学校里面如果没有碰kernel只读os & arch会
比较没有感觉。但真正在做kernel以後你如果有看过arch底下的code,比方说开机的时候
arch/arm(x86)/kernel/head.S会填page table做一个temporary的mapping,这时候就会
感觉到arch学的page table, tlb和os恐龙本page table是怎麽协同合作。当然像是要
看懂scheduler, context switch, interrupt, virtual memory, page fault,基本的
恐龙本和hennessy算盘本最好都要很熟悉。如果想深入柱子本也可以看一下。有些人可能
会觉得做driver干嘛懂那麽多,做kernel干嘛要懂那麽多?只能说有机会做到DMA的传输
使用了non-cacheable的cache attribute的时候,你误用了cacheable。或者是在看
memory management的时候看到code里面有alignment由於false sharing(?!)的原因。这
时候就会知道arch的重要性。
在看x86 .s的时候要参考底下IA spec, system programming那本:
http://ppt.cc/Z5MG
以前刚开始学kernel的时候,曾经写过一个x86简单os是参考杨文博的自己动手写操作系
统:
http://ppt.cc/oNbR
arm的spec可以到info center去注册就可以下载:
http://ppt.cc/Xp2X
再来分享一下,个人是利用进修Ph.D.的方法,强迫自己考资格考。(os, arch, compiler
, algo) 强迫自己再加强一下基本技能。
8) 熟悉administrator的基本技能。比方说基本的htop, top。有人会觉得不是专门做
administrator的工作为何要熟悉?因为熟悉user space的tool才能知道怎麽上层怎麽使用
kernel。
推荐两本:
The Linux commandline:
http://it-ebooks.info/search/?q=linux&type=title&page=5
Unix and Linux administration handbook:
http://ppt.cc/uvlK
推荐一个网站:
Commandlinefu:(建议把前几页常用的都背下来)
http://www.commandlinefu.com/commands/browse/sort-by-votes
9) 熟悉Shell script。因为很多上层的initializing process都是用shell scripts。比
方说你可以把initramfs解开upstart的init就是用shell script。熟悉script有助於你
简化日常工作。简化build code,安装deb档的麻烦程序。当然最後awk, sed都是跑不掉。
10) 熟悉debug,像之前提到的debug hacks,这边再提一下还有kernel底下的
/sys/kernel/debug/tracing内容都可以好好研究一下。像是ftrace可以动态filter想要
知道的function call path,以及每个function的执行时间。kprobe可以动态的插入
code去取出变数印出值或者改变code执行的path。并不需要重新编译。在x86底下trace
code很方便。像是最近suse丢出的kgraft and redhat的kpatch可以动态修改kernel
code,有兴趣也可以研究看看。再来coredump一定要看的懂,要知道怎麽用addr2line
还原到原本的执行c code。还有gdb, strace, systemtap, crash, sysrq...太多了,
可以看debug hacks。很多都有写到。可以用qemu或者是vmware开gdb server,做远端
single step debug。就可以从开机一步步看过来。
Ftrace:
Debugging the kernel using Ftrace - part 1 [LWN.net]
http://lwn.net/Articles/365835/
Debugging the kernel using Ftrace - part 2 [LWN.net]
http://lwn.net/Articles/366796/
Secrets of the Ftrace function tracer [LWN.net]
http://lwn.net/Articles/370423/
Kernel source下面的:
Documentation/trace/ftrace.txt
Kprobe:
Documentation/trace/kprobetrace.txt
这里面一堆sample,可以直接拿来用:
samples/kprobes/
dynamic debug也不错用,如果有使用dev_dbg() or pr_debug()就可以动态打开debug
messages:
Documentation/dynamic-debug-howto.txt
这篇可以快速入门一下(The dynamic debugging interface):
http://lwn.net/Articles/434833/
Kgraft V.S. Kpatch
http://ppt.cc/Terq
vmware remote gdb debug
http://ppt.cc/cj0O
10) 熟悉system call,理由就像是上面说的,因为不只要熟悉kernel怎麽运作,也要知
道上层怎麽用,不然会有见树不见林的感觉。打个比方,在user space使用malloc(),
在glibc那里有个简单的memory allocator最後会call sbrk()/brk(),进入到kernel里面
用mmap的方式调大size。一开始并没有相对的mapping,等到page fault发生才使用
anonymous fault的方式把page接上去。<---这样整体看才会有感觉
推荐TLPI, The Linux Programming Interface (man的maintainer, Michael Kerrisk写的
):
http://ppt.cc/g~IL
11) 最後就是针对特定的sub-system去研究,记住,没有人懂所有的东西。kernel两千
多万行
http://www.ohloh.net/p/linux 。没有什麽人是kernel的全面专家,你看mailing
list上面maintainer有时候也会说他不熟悉这块,要请这个专家出来解释。像是在PCI
mailing list上面我就遇到acpiphp的接口maintainer Bjorn也说他不熟。
"I'm not familiar with that path, so either you'll have to narrow it down,
or we can hope that Yinghai or Rafael has some insight."
http://www.spinics.net/lists/linux-pci/msg31467.html
所以引用已故steve jobs的话:Stay hungry, Stay foolish!!
洋洋洒洒打了一大堆,感觉其实也没什麽东西,只是整理资料给刚入门的人参考,希望对
大家有帮助。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.35.245.81
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/LinuxDev/M.1405433684.A.BBD.html
1F:推 KoenigseggG:太神了吧......大感谢! 07/15 22:43
2F:推 wgst88w:Wow~~~ 07/15 23:13
3F:推 judging1:太猛了~~ 07/15 23:33
4F:推 musicguitar:有神!我拜~ 07/15 23:43
5F:→ musicguitar:M起来啦!!! 07/15 23:44
※ 编辑: mimi0213 (114.35.245.81), 07/16/2014 00:51:57
6F:推 mayasky:还有晶心(没进mainline,据说申请中?)和已故Sunplus 07/16 01:35
7F:→ mimi0213:对吼,还有晶心,怎麽忘了前东家XD。toolchain已经进了 07/16 10:53
8F:推 alongalone:靠...这篇有点神阿...>"< 07/16 13:44
9F:推 bdvstg:太有帮助了 推~ 07/16 16:59
10F:推 micklin:有神啊!!! 07/16 18:19
11F:推 zeqw:推! 07/17 10:27
12F:推 james732:推,这篇真的很棒!! 07/18 01:44
13F:推 h168210:大推~~ 07/18 12:06
14F:推 nfsong:跪拜 07/18 13:00
15F:推 redmilk:太强了 让我拜一下! 07/18 15:18
16F:推 kkoala:有看有推A_A 07/19 00:12
17F:推 goldie:已跪 <(_ _)> 07/19 22:54
18F:推 zooking1014:推!! 感谢 07/20 14:21
19F:推 keyword1983:只能推了 07/23 10:32
20F:推 swinds24:太强大了! 07/25 14:43
21F:推 yamasaki07:感谢推 07/27 09:28
22F:推 chadcoco1222:推!! 08/02 23:31
23F:推 idlejustin: 神 09/21 01:05
24F:推 vest12385: 刚想学看到这篇给跪了!!! 06/02 11:07