星期三, 九月 19, 2007

compiz-fusion安装心得

按道理直接emerge -av compiz-fusion就可以了
不知道为什么在我这里总是提示找不到一堆的头文件(.h)文件,我在/usr/kde/3.5/include下都能找到,所以在emerge 开始后,ctrl+z挂起,然后把这些头文件copy to /var/tmp/portage/x11-wm....下然后接着编译就可以通过了,我一开始是copy3.5下的不行,后来copy devel下的就可以了,同时export KDEDIR=/usr/kde/devel,也不知道到底是哪个起作用,反正在出错就都试试。

Read More...

星期一, 九月 17, 2007

极限,化学,史上最牛验证码,你见过吗?

史上最牛验证码,你见过吗?现在,不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了验证码技术。登陆论坛、在别人的博客留言,无不需要输入验证码。日前,论坛里出现了这样的史上最牛验证码。不看不知道,它确实很牛!先来贴个图,你就知道这验证码有多牛了!



看到此验证码,你有什么反应?

1、

头晕眼花,看不懂,算了,关闭!

2、

极度怀疑中,电脑显示错了?不停刷新

3、

好在自己数学不错!埋头苦算中……(绝对理科生) 这就是在网络上广为流传的史上最强验证码。先是出现在一个外国网站,据说是一个老外的博客,继而出现在中文网站……

这就是原件:



如 此验证码,居然也有高人攻克下。这就是小编在论坛发现的强解: timsking 发表于2007-6-09 13:20:57 这太简单了,结果为ln2。 当x趋近于0时,arctgx等价于x,所以lim (arctgx*sin(1/x))可化为lim(sin(1/x)*x) ,当x趋近于0时,此项为无穷小乘以有界的一个数为0,所以In(2+0)=In2

国内最牛验证码探秘
小编按着论坛里的地址找到了这个最牛验证码的出处,一个化工资讯网站。点击注册会员,果然,一串专业数理知识的验证码跃然于显示屏。



放大



小编评价: 化学知识大检测!必须具备高二或以上理科化学基础水平。你要忘记了我也没法。再来看看这个:


小编评价: 高中数学集合测验,必须具备高一或以上数学知识。跟你们说过数学重要了吧! 大家有没有注意到验证码输入框后面“想知道答案吗?”这几个字,小编迫不及待的点开,结果是……



该网站注册验证码特点:

1、专业的数理化知识,看这公式专业的。
2、给出公式要求你写出结果。注意,不是要你再输入一遍验证码,而是要你写出结果哦。看来解方程、化学式识别是少不了的了。
3、问你想知道答案吗?却来个这样的框!恶搞百分百。

小编发现:
通过不停的刷新发现,这里注册的验证码十分有限,不停的跳出重复的,除了以上出现的验证码以外,另有两个化学式验证码。


有兴趣的网友们,是不是也努力补习一下化学知识,破解一下。

Read More...

星期三, 九月 12, 2007

给Blogger加上Picasa 相册(幻灯片播放形式)

1.进入Blogger Beta Widget for Picasa Web Albums

2.进入自己的Google Picasa Web Albums,把需要嵌入的相册设为共享;

3.点击已共享的相册的预览图,进入里面,它的右下角会有RSS地址,复制这个地址:
picasaweb_blogger_insert1.gif

4.把这个地址粘贴进Blogger Beta Widget for Picasa Web Albums的第一个文本框里,再点击下面的Generate Widget and Code按钮即可生成代码,再把代码粘贴进网页源代码里即可;

5. 如果你正在使用Blogger beta,更方便,你可以在上面生成代码后,直接点击Generate Widget and Code按钮下面的Add Picasa Web Album Widget按钮,这样你的Picasa Web Albums相册就会自动被加入你的Blogger beta blog里。详细效果请查看我的Blogger beta blog右侧栏

  此外,在生成代码前,你当然也可以设定相册的相关参数,比如播放间隔时间等等。另外,你还可以根据自己的喜好,对代码进行适当的修改。

Read More...

转载:交叉编译场景分析(arm-linux)--序

去年花了一个多月时间,为arm-linux平台编译程序库,其中包括zlibreadlinencursestslibTinyXlibpngjpegcairopangoglibatkgtk+match系列、SCIMGPE系列。由于之前没有经验,走了不少弯路,虽然从中学到了一些知识,大部分时间都浪费了。最近一些同事和朋友常问我一些关于交叉编译的问题,我想有必要总结一下,和大家分享一些心得。

什么是交叉编译呢?在回答这个问题前,我们先解释两个概念:

机:运行编译过程的计算机。

目标机:运行编译结果(可执行文件)的计算机。

一般情况下,主机和目标机是同一类型的计算机,这就是正常的编译,没有什么好说的。所谓交叉编译就是在主机上为目标机编译,比如在PC上编译,然后在手机上运行,这种编译就叫交叉编译。

交叉编译需要交叉编译器,不同的目标机(主要是看芯片类型)需要不同的交叉编译器,比如我们这里要介绍的arm-linux交叉编译,所用的交叉编译器就是arm-linux-gcc系列。

构建一个交叉编译器(toolchain),说简单也简单,说复杂也复杂。原理上很简单,实际情况常常比较复杂,原因是编译器一直处于开发状态,你要了解某个版本的稳定性,要去找patch。有时候还要看你的运气好不好,折腾一个星期才搞定也是很常见的。

网上已经有不少已经构建好了的交叉编译器(toolchain),除非你想了解如何构建交叉编译器,否则直接下载一个来用是比较明智的做法。这里不打算介绍如何构建交叉编译器的知识。

在做交叉编译前,你最好了解autoconf系统工具的用法,遇到问题时,可以快速定位。先找一本autoconf的书看看,可以说是磨刀不识砍柴功,否则后面会浪费更多的时间。

Read More...

转载:kernel新手培训计划

原本是我用Notes mail 写的培训kernel新人的计划,copy过来 有些格式可能有点乱, 附件里面是 我举的例子。 新手可以对照。
老手就不要看了,见笑了。

如果你从事kernel还没有入门, 或者在公司里面根本论不到你作kernel , 也许你可以对照我的计划自学。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


下面是我列出的新人kernel 学习计划, kernel很复杂, 想要入门不容易 。整个计划也基本上反应了我个人对于kernel的学习过程, 感觉上路子还是对的, 对别人应该也比较合适。 有些东西我也没有完全掌握, 比如并发和竟态,需要在长期的开发中积累经验才能彻底掌握, 我们只是从理论上先掌握它。



推荐书籍:

l ldd3(linux device driver 第三版,有中文版)

l ulk2 (understanding linux kernel 第二版,中文版),针对2.4 kernel,看起来,不太适合我们。

l ulk3 (understanding linux kernel 第三版,只有英文版) , 针对 2.6,不错, 我也正在看。

推荐学习网站:
www.kerneltravel.net

bbs网站:
www.linuxforum.net 里面的内核论坛和嵌入式论坛和driver论坛, 可以问问题。

一 , 入门阶段

target:

知道什么是kernel ,大致了解kernel,解除对kernel的恐惧心理

1> Makefile

- target:
Makefile 要熟悉,至少对应用程序的Makefile裁减要比较了解, 总之 对
Makefile 比较熟悉, 这是了解kernel的架构组织的基础 。

- 建议练习:
交叉编译应用程序,裁减Makefile 。

- Status: 已经都练习过了。

- Enhance: 建议平时学习,多多学习Makefile , 可以重点关注kernel代码里面的
Makefile的写法, 以及如何修改Kconfig 文件 ,如何在kernel源代码
中, 加入新功能代码,如何添加修改Makefile

2> 在普通的PC上升级Linux kernel

- target:
熟悉如何编译kernel 的源代码,升级kernel 后,要配置哪些文件,才能正确
的运行kernel

- Status:

- Enhance:


3> 掌握如何用KGDB 调试kernel的源代码

- Target:
掌握KGDB 和 kgdb 调试器的用法和常用的命令, 图形界面可选, 但是命令行
界面一定要掌握。




二,进阶阶段:

Target:
进入到具体的编程阶段,加一些练习代码。 熟悉kernel的函数用法


4> 熟悉module的写法, 这是进入kernel的捷径

- Target:
掌握module的的写法, 具体的Makefile怎么样写?怎么编译?掌握和module有
关的常用的函数,比如 export_symbol() ,MODULE_LICIENCE() 等等, 总之,ldd3头两章要看的比较熟悉才行。

可以熟练的写一些module ,其实这些module都可以看成是一个driver或者一个内核模块的缩写或者简化版本。
比如一个helloworld 的module 。 虽然简单, 也能反应很多问题。 driver就是在上面的基础上控制硬件而已。



- 练习:

看ldd3 上面的 22 页上面的helloworld 小module程序。
参照 http://dirac.org/linux/writing/lkmpg/2.6/chinese/lkmpg_chs/ 来练习module的写法, 和实现一些简单的功能, 这些和arm 和x86 都是无关的, 是通用的。



5> 在x86 机器上练习如何给kernel加上一些系统调用。

- target :

了解什么是“系统调用” , 系统调用的原理, 和 glibc里面的c函数有什么区别, 如何在kernel代码里面加系统调用 , 用户程序如何调用这个系统调用 。

知道如何在kernel现有的基础上加上一些系统调用。

- 参考资料:
http://www.kerneltravel.net/journal/iv/index.htm 陈莉君老师的网站

- 练习:
我这里有个例子,比如实现一个系统调用:查找某个进程的pid (当然用ps ax
|grep 很容易搞定, 我们这里只是练习而已)
可以参考我的例子:
(See attached file: module_syscall.c) (See attached file:
chardev_test.c) , 供参考, 这是我原来自己练习的例子。



6> 熟悉kernel一些常用的机制,一些基本函数的用法,
Target:
了解kernel api的用法,
例子:自旋锁, 信号量,同步,互斥。
推荐书籍:ldd3 (linux device driver 3rd) ,非常好
必看章节:
第一章设备驱动程序简介,入门。
第二章构造和运行模块, 了解什么是模块, 怎么编译, 大致怎么写?
第三障字符设备, 写一个简单的模块,可以实现read write() 函数, 和硬件无关, 因为我们不关心driver
第四章debug , 掌握printk的用法
选看章节,或者提高章节
第五章并发和竟态 一定要掌握

参考资料:

ldd3
下面是我在www.linuxforum.net 上的一个讨论关于自旋锁和信号量分析的讨
论:对于了解信号量和spinlock的用法,比较有好处。
(See attached file: spinlock讨论帖子.pdf)
大家也可以充分利用www.linuxforum.net 边讨论边学习。这种方式进步很快。

练习:
- 一个module , 实现read/write/ioctl() 函数。
- enhance上面的module , 要实现互斥同步的功能。 比如 实现一个module
, 当一个进程read的时候, 另一个进程再去读的时候,要阻塞调用,当第一个进程
释放这个资源的时候,第二个进程要被唤醒。
这是我的例子:参考:(See attached file: chardev_test_waitqueue.c)

关于,更多的互斥的例子,可以参考下面我的自己以前练习的例子:
(See attached file: chardev_test_atomic.c)(See attached file:
chardev_test_sema.c)(See attached file: chardev_test_waitqueue.c)(See
attached file: chardev_test_wait_kmalloc.c)
下面是 kernel里面timer的用法, 可以参考。

(See attached file: chrdev_timer.c)


编译module的时候 ,需要Makefile ,
下面的Makefile可以作为例子:
针对2.4 kernel的例子(仅仅是例子, 不要照抄)
(See attached file: Makefile)
针对2.6 kernel 的例子:
(See attached file: Makefile)



6> 进阶资料

可以看看 www.kerneltravel.net 上面的文章, 相当不错,
推荐:内核中的调度与同步
http://www.kerneltravel.net/journal/vi/syn.htm

中断解析
http://www.kerneltravel.net/journal/viii/index.htm

7> 根据工作需要去看相应的代码, 比如 要看jffs2,就要看jffs2的代码,
如果看实时, 就要看RT的实现代码。

Read More...

转载:如何交叉编译 应用程序,技巧,注意事项

如何交叉编译 应用程序,技巧,注意事项。

最近大家都涉及交叉编译应用程序, 感觉大家的路子有点偏 ,觉得有必要纠正一下。

一般的应用程序 ,编译的步骤无外呼 ./configure && make && make install

但是对于 交叉编译不能照搬 , 尤其要注意不能轻易make install (当然如果指定了 --prefix就无所谓了, 否则可能会覆盖标准路径的程序就惨了)
这里有两个思路:

1>对于刚开始交叉编译的人来说, 往往很晕 , 总想借助 ./configure 后面加一堆参数来解决 ,比如 ./configure --target=arm-9tdmi-linux-gnu --host=arm-9tdmi-linux-gnu 来搞定 ,
对于一般的小的程序来说, 应该没有问题, 而且也推荐大家这样用, 但是要注意 , 这样作之前 ,先要 ./configure --help |grep --host ,看看有没有这样的选项, 如果没有呢?
想想也可能, 如果程序的作者根本没有考虑到除了x86的平台呢?你只能自己改写Makefile 了。

所以 ,./configure 不是万能的,而且语法很混乱 ,不要指望 ./configure 给你作一切。而且局限很大。

2>所以这个时候 ,就要求交叉编译的第二个层次, 自己改写Makefile ,想怎么改就怎么改,灵活性最大 需要你开始就./configure 一下, 跟平台有关的参数一律不加。
./configure 过后就会生成Makefile 了, 里面的gcc相关的参数,包括lib的路径当然是x86下的了, 比如 /usr/local/lib/ , /usr/lib/ ,/lib/ 什么的, 改掉就是了。 或者注释掉。
gcc 要换成 arm-linux-gcc一类的编译器, (如果不想每次都改, 参考下面的 include prerules.mk的做法) ,
总之, 这要求你的Makefile掌握的很熟练, 思路就是 边编译 ,发现问题,再改, 即使一开始Makefile不熟练, 到后来,也熟练了。 是个练习Makefile的好方式。


总之, 我们最后要的就是Makefile , 看你怎么能得到它。



一个最标准的Makefile (去掉很多无用的东西)

通过./configure 生成的Makefile ,你会发现冗余的地方非常多, 其实关键的地方,就那么20几条, 可以试着精简一下, 这样对程序的组织架构会熟悉的快一些, 毕竟Makefile反应了
程序(具体就是 .c 和 .h )之间的依赖关系 。


openssh 的Makefile我没有精简过(当然要精简也很容易), 举个telnetd的例子,

说明一下:

---------------------------telnetd ----------------------------------------

#-----------------------------------------------------
TOPDIR := $(shell /bin/pwd)
TOPDIR := $(TOPDIR)/..

#prerules.mk 包含了这些变量的定义, 比如 $CC , $CPP , $CXX , $CFLAGS 等等。
#尽量不要在这里出现, CC=arm-linux-gcc这样的定义,扩展性不好, 尽量用 全局变量,便于管理和拓展。
include $(TOPDIR)/prerules.mk
#-----------------------------------------------------

EXEC = telnetd

#好的Makefile都是这样写的, 也就是具体生成一个可执行文件或者lib库, 需要哪些.o , 这些.o 会依据后面的 .c.o : 规则来编译出来的。
OBJS = telnetd.o state.o termstat.o slc.o sys_term.o \
utility.o global.o authenc.o logwtmp.o logout.o


#$(CC) 的编译选项, 一般程序自己的带的,不要改它, 而且一般都是+= , 不要用 = ,
CFLAGS += -DEMBED -DPARANOID_TTYS -DUSE_TERMIO -DKLUDGELINEMODE -D_GNU_SOURCE -Wall

ifdef CONFIG_DEFAULTS_LIBC_UCLIBC
LDLIBS := -lutil $(LDLIBS)
endif

all: $(EXEC) #很显然all是最关键的了, 也要发在最开始的地方。 这样make 就相当于make all , 这是大家的潜规则。

.c.o:
$(CC) -c -o $@ $< $(CFLAGS) -I../include/ -I. -Ixxx 在交叉编译的时候, 要在这个后面添上自己的 头文件的路径。 $(EXEC): $(OBJS) $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS$(LDLIBS_$@)) #这里的LDFLAGS=-lcrypt -lzlib -L../lib -L. 总之根据自己的需要往里面增加。 $(STRIP) telnetd #如果不需要调试, 一定要strip一下, 比如 15M的file ,strip过后, 可能变成 3M , 还不影响功能。 install: cp $(EXEC) $(T_USBIN) #自己写install , 不要用原来的, 可以copy到自己的ramdisk中去。 clean: -rm -f $(EXEC) *.elf *.gdb *.[do] $(OBJS): defs.h ext.h pathnames.h telnetd.h logwtmp.h logout.h 交叉编译成功后, 就万事大吉了, 这才万里长征的第一步。 剩下的也许更麻烦呢。 首先拿到一个opensource , 我们首先要让它在pc上run起来才行 至少我们要稍微了解了一下它, 才可以开始我们的cross compile的工作。 至少, 我们要了解要run这个程式, 哪些东西是需要的, 哪些是不需要的。 一开始, 谁也不会了解的那么多 , 只能一步步的拿到板子上跑跑看了。 准备工作: 1> 如果是应用程序的可执行文件, 我们可以用ldd 命令来查看 它需要哪些必要的库。 具体的命令:
refer ,http://infomax/bbs/viewthread.php?tid=52&extra=page%3D1

2>看看需要哪些配置文件, 也就是conf文件。

其实如果想知道上面的这些, 还有个办法 , 就是先在pc上编译, 安装, ./configure --prefix=/work/bob (改成你自己的目录即可) , make && make install ,
看看/work/bob/下面到底生成了哪些file , 你不就心里有数了吗。


----------------------------------------

先把你知道的应用程序可执行文件copy到板子上去, 执行一下, 如果缺少哪些库 , 屏幕上会打出来一些出错信息的。
缺什么 ,就copy什么到板子上好了, 多半缺的都是 库(.so 文件) .

如果还是莫名其妙的出什么问题(ps 结果就是没有该进程),有可能是缺少什么配置文件, 可以用strace 来查查看:
具体strace的用法可以 refer :http://infomax/bbs/viewthread.php?tid=56&extra=page%3D1

-------------------------------------------

如果程序运行的结果和pc上不太一样 。 就要注意几个根本的问题了。

1> 板子的endian是什么类型的呢? x86 是little endian , arm的板子可能是little endian ,也可能是big-endian 的, 如果是big-endian , 就要注意了。
要在程序里面改,添加什么 le32_to_cpu() 这样的函数来转换的。
2> 对齐问题 , x86和arm的对齐处理方式是不一样的。

3> 中文的问题, 有些程序需要支持中文,繁体,什么的, pc上可以, 拿到板子上就不可以了。 你要考虑一下 glibc库上面是否支持 locale , libiconv一类的库。





生成动态链接库的一个例子,也是标准的Makefile

#Start of Makefile
#-----------------------------------------------------
TOPDIR := $(shell /bin/pwd)
TOPDIR := $(TOPDIR)/../../

include $(TOPDIR)/prerules.mk
#-----------------------------------------------------
SRCS = download.c curl_err.c DownloadStatusQuery.c
OBJS = download.o curl_err.o DownloadStatusQuery.o

CFLAGS += -I../../include -Wall # -g -ggdb

all: libdownload.so.1.0.0

#test_main:
# $(CC) $(CFLAGS) -I../../../include/ -o main main.c $(LIBS) -ldownload -L. -L../../../lib

%.o:%.c 或者 .c.o: 均可
$(CC) -c -o $@ $(CFLAGS) $<>

Read More...

转载:udev详解

原文出处 http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev-FAQ
中文翻译 王旭 http://gnawux.blogchina.com
本文档遵循 GPL 2 及以后版本发布,修改、发布请保持许可证不变

问: udev是什么? 它的目的何在?
答: 看看那篇 OLS 2003 上的有关 udev 的文章吧,可以在 docs 目录里找到,也能在
这里找到:
OLS 2003 上还有一个关于 udev 的幻灯片,可以在这里找到:



问: udev 和 devfs 是什么关系
答: udev 完全在用户态 (userspace) 工作,利用设备加入或移除时内核所发送的
hotplug 事件 (event) 来工作。关于设备的详细信息是由内核输出 (export) 到位
于 /sys 的 sysfs 文件系统的。所有的设备命名策略、权限控制和事件处理都是在
用户态下完成的。与此相反,devfs 是作为内核的一部分工作的。

问: 如果 udev 不能完成所有 devfs 的工作的话,为什么把 devfs 标记为
OBSOLETE/removed?
答: 引用 Al Viro (Linux VFS 内核维护者):
- devfs 所做的工作被确信可以在用户态来完成。
- devfs 被加入内核之时,大家寄望它的质量可以迎头赶上。
- devfs 被发现了一些可修复和无法修复的 bug。
- 对于可修复的 bug,几个月前就已经被修复了,其维护者认为一切良好。
- 对于后者,同样是相当常一段时间以来没有改观了。
- devfs 的维护者和作者对它感到失望并且已经停止了对代码的维护工作。

问: 但是当一个并不存在的 /dev 节点被打开的时候,udev 并不能如 devfs 一样自动加
载驱动程序。
答: 的确如此,但 Linux 的设计是在设备被发现的时候加载模块,而不是当它被访问的时
候。

问: 不过等等,我确实希望 udev 可以在不存在的节点被打开的时候自动加载驱动。这是
我使用 devfs 的唯一原因了。给 udev 增加这个功能吧。
答: 不,udev 是用来管理 /dev 的,不是用来加载内核驱动的。

问: 嗨,求你们了。这不难做到的。
答: 这么个功能对于一个配置正确的计算机是多余的。系统中所有的设备都应该产生
hotplug 事件、加载恰当的驱动,而 udev 将会注意到这点并且为它创建对应的
设备节点。如果你不想让所有的设备驱动停留在内存之中,应该使用其它东西来
管理你的模块 (如脚本, modules.conf, 等等) 这不是 udev 的工作。

问: 但是我真的喜欢那个功能,还是加上吧
答: devfs 用的方法导致了大量无用的 modprobe 尝试,以此程序探测设备是否存在。
每个试探性探测都新建一个运行 modprobe 的进程,而几乎所有这些都是无用的。

问: 我喜欢 devfs 的设备文件命名方式,udev 可以这样命名么?
答: 可以,udev 可以使用 /dev 的命名策略来创建节点。通过一个配置文件,可以把内
核缺省的名字映射到 devfs 的名字。可以看看 udev 中带的 udev.rules.devfs 文
件。
注意: devfs 的命名方式是不被建议并且不被官方支持的,因为它所用的简单枚举设
备的方式在设备可能被随时加入或删除的情况下确实是一个比较笨的方法。这些编号
代给你的将只有麻烦,而并不能用来确定设备。看看那个永久性磁盘 (persistent
disk) 的规则就知道如何在用户态下正确的做这件事,而不是傻傻地列出设备。

问: udev 可以为哪些设备创建节点?
答: 所有在 sysfs 中显示的设备都可以由 udev 来创建节点。如果内核中增加了其它设
备的支持,udev 也就自动地可以为它们工作了。现在所有的块设备都在被支持之列,
大部分的主字符设备也是被支持的。内核开发者们正致力于让所有的字符设备都被支
持。可以到 linux-kernel 邮件列表上寻找补丁或是查看补丁的状态。

问: udev 是否会去掉匿名设备数量的限制?
答: udev 完全工作于用户态。如果内核支持了更多的匿名设备,udev 就会支持。

问: udev 是否会支持符号链接?
答: udev 现在就支持符号链接,每个设备节点拥有多个符号链接也是被支持的。

问: udev 如何处理 /dev 文件系统?
答: 建议使用一个每次启动系统的时候重新创建的 tmpfs 作为 /dev 的文件系统。不过
实际上 udev 并不关心那种文件系统在被使用。

问: 在 init 运行之前,udev 如何处理设备?
答: udev 可以被放入 initramfs 之中,并在每个设备被发现的时候运行。也可以让
udev 工作在一个真的根分区被加载之后根据 /sys 的内容创建的初始 /dev 目录
之中。

问: 我是否可以利用 udev 在一个 USB 设备被加载的时候自动加载上这个设备?
答: 技术上讲是可以的,但是 udev 不是用于这个工作的。所有的主流发布版 (distro)
都包含了 HAL (http://freedesktop.org/wiki/Software_2fhal) 用于这个工作,它
也是专门用于监视设备变更的,并且集成进入了桌面软件。

换个角度说,这可以简单的通过 fstab 来实现:
/dev/disk/by-label/PENDRIVE /media/PENDRIVE vfat user,noauto 0 0

这样,用户可以用如下命令来访问设备:
$mount /media/PENDRIVE
同样不需要管理员权限,但却拥有了设备的全部访问权限。使用永久性磁盘链接
(label, uuid) 将可以指定同一设备,无论其实际上的内核名字是什么。

问: 有什么我需要注意的安全问题么?
答: 当使用动态设备编号的时候,一个给定的主/从设备号可能在不同时间对应不同的设
备,如果一个用户拥有对这个节点的访问权限,并且可以创建一个到这个节点的硬链
接,他就可以如此得到一个这个设备节点的拷贝。当设备被移除之后,udev 删除了
设备节点,但硬链接依然存在。如果这个设备节点之后被重新使用不同的访问权限被
创建的时候,其硬链接仍然可以使用先前的访问权限来访问。
(同样的问题也存在在使用 PAM 改变访问权限的 login 上。)

简单的解决方案就是通过把 /dev 放在 tmpfs 这样的单独的文件系统之上来防止建
立硬链接。

问: 我有其他的关于 udev 的问题,我应该问谁?
答: linux-hotplug-devel 正是问这些的地方。邮件列表的地址是
linux-hotplug-devel@lists.sourceforge.net
加入邮件列表的相关信息可以在如下地址找到

邮件列表的上的既往讨论记录可以在下面地址找到

udev轻松上路


第一、什么是udev?

这篇文章UDEV Primer给我们娓娓道来,花点时间预习一下是值得的。当然,不知道udev是什么也没关系,
把它当个助记符好了,有了下面的上路指南,可以节省很多时间。我们只需要树立一个信念:udev很简单!
嵌入式的udev应用尤其简单。

第二、为什么udev要取代devfs?

这是生产关系适应生产力的需要,udev好,devfs坏,用好的不用坏的。

udev是硬件平台无关的,属于user space的进程,它脱离驱动层的关联而建立在操作系统之上,基于这种设
计实现,我们可以随时修改及删除/dev下的设备文件名称和指向,随心所欲地按照我们的愿望安排和管理设
备文件系统,而完成如此灵活的功能只需要简单地修改udev的配置文件即可,无需重新启动操作系统。udev
已经使得我们对设备的管理如探囊取物般轻松自如。

第三、如何得到udev?

udev的主页在这里:http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html
我们按照下面的步骤来生成udev的工具程序,以arm-linux为例:
1、wget http://www.us.kernel.org/pub/linux/utils/kernel/hotplug/udev-100.tar.bz2
2、tar xjf udev-100.tar.bz2
3、cd udev-100 编辑Makefile,查找CROSS_COMPILE,修改CROSS_COMPILE ?= arm-linux-
4、make

没有什么意外的话当前目录下生成udev,udevcontrol,udevd,udevinfo,udevmonitor,udevsettle,udevstart,
udevtest,udevtrigger九个工具程序,在嵌入式系统里,我们只需要udevd和udevstart就能使udev工作得很好,
其他工具则帮助我们完成udev的信息察看、事件捕捉或者更高级的操作。

另外一个方法是直接使用debian提供的已编译好的二进制包,美中不足的是版本老了一些。
1、wget http://ftp.us.debian.org/debian/pool/main/u/udev/udev_0.056-3_arm.deb
2、ar -xf udev_0.056-3_arm.deb
3、tar xzf data.tar.gz

在sbin目录里就有我们需要的udevd和udevstart工具程序。

建议大家采用第一种方式生成的udevd和udevstart。为什么要用最新udev呢?新的强,旧的弱,用强的不用弱的。

第四、如何配置udev?

首先,udev需要内核sysfs和tmpfs的支持,sysfs为udev提供设备入口和uevent通道,tmpfs为udev设备文件提
供存放空间,也就是说,在上电之前系统上是没有足够的设备文件可用的,我们需要一些技巧让kernel先引导
起来。

由于在kernel启动未完成以前我们的设备文件不可用,如果使用mtd设备作为rootfs的挂载点,这个时候/dev/mtdblock
是不存在的,我们无法让kernel找到rootfs,kernel只好停在那里惊慌。
这个问题我们可以通过给kernel传递设备号的方式来解决,在linux系统中,mtdblock的主设备号是31,part号
从0开始,那么以前的/dev/mtdblock/3就等同于31:03,以次类推,所以我们只需要修改bootloader传给kernel
的cmd line参数,使root=31:03,就可以让kernel在udevd未起来之前成功的找到rootfs。
O.K.下一个问题。

其次,需要做的工作就是重新生成rootfs,把udevd和udevstart复制到/sbin目录。然后我们需要在/etc/下为udev
建立设备规则,这可以说是udev最为复杂的一步。这篇文章提供了最完整的指导:Writing udev rules
文中描述的复杂规则我们可以暂时不用去理会,上路指南将带领我们轻松穿过这片迷雾。这里提供一个由简入
繁的方法,对于嵌入式系统,这样做可以一劳永逸。

1、在前面用到的udev-100目录里,有一个etc目录,里面放着的udev目录包含了udev设备规则的详细样例文
本。为了简单而又简洁,我们只需要用到etc/udev/udev.conf这个文件,在我们的rootfs/etc下建立一个udev目
录,把它复制过去,这个文件很简单,除了注释只有一行,是用来配置日志信息的,嵌入式系统也许用不上
日志,但是udevd需要检查这个文件。

2、在rootfs/etc/udev下建立一个rules.d目录,生成一个空的配置文件touch etc/udev/rules.d/udev.conf。然后
我们来编辑这个文件并向它写入以下配置项:

###############################################
# vc devices
KERNEL=="tty[0-9]*", NAME="vc/%n"

# block devices
KERNEL=="loop[0-9]*", NAME="loop/%n"

# mtd devices
KERNEL=="mtd[0-9]*", NAME="mtd/%n"
KERNEL=="mtdblock*", NAME="mtdblock/%n"

# input devices
KERNEL=="mice" NAME="input/%k"
KERNEL=="mouse[0-9]*", NAME="input/%k"
KERNEL=="ts[0-9]*", NAME="input/%k"
KERNEL=="event[0-9]*", NAME="input/%k"

# misc devices
KERNEL=="apm_bios", NAME="misc/%k"
KERNEL=="rtc", NAME="misc/%k"
################################################

保存它,我们的设备文件系统基本上就可以了,udevd和udevstart会自动分析这个文件。

3、为了使udevd在kernel起来后能够自动运行,我们在rootfs/etc/init.d/rcS中增加以下几行:

##################################
/bin/mount -t tmpfs tmpfs /dev

echo "Starting udevd..."
/sbin/udevd --daemon
/sbin/udevstart
##################################

4、重新生成rootfs,烧写到flash指定的rootfs part中。

5、如果需要动态改变设备规则,可以把etc/udev放到jffs或yaffs part,以备修改,根据需求而定,可以随时扩
充udev.conf中的配置项。

http://hi.baidu.com/pansafe/blog/item/226e905213e1e00f0df3e33a.html
可以参考一下这篇文章理解一下!

Read More...

转贴:成功移植最新的2.6.22.3的linux kernel到S3C2410上

硬件平台:勤研2410开发板
开发平台:FC6+kernel 2.6.22.3+arm-linux-gcc-3.4.1
参考资料:panjet大侠的帖子《Linux 2.6.10 以后版本对 S3C2410 的支持》(在此特别感谢panjet大侠和所有参与过那个帖子的朋友)

由于kernel 2.6.22.3对s3c2410中文件的组织风格有了一些变化且删除了对devfs的支持,所以移植过程中遇到了一些《Linux 2.6.10 以后版本对 S3C2410 的支持》中没有提到的问题,但基本思路是一致的。

第一步:根据自己nand flash的分区情况,修改kernel中的相关参数:
由于kernel 2.6.22.3对s3c2410中文件的组织风格有了变化,所以要修改的文件不再是 arch/arm/mach-s3c2410/devs.c,而是arch/arm/plat_s3c24xx/common-smdk.c。在其中找到分区的定义
smdk_default_nand_part[] = {
...
}
根据自己的分区情况修改其中的内容(分区情况可以通过bootloader查看)

第二步:修改nand flash的参数:
在同一个文件中找到
smdk_nand_info = {
.tacls=20,
.twrph0=60,
.twrph1=20,
...
}
改成
smdk_nand_info = {
.tacls=0,
.twrph0=30,
.twrph1=0,
...
}

第三步:修改ECC校验:
根据kernel官方网站上的说明,从2.6.22.3已经修改了ECC校验的问题(这也是我移植2.6.22.3的一个重要原因)。但实验下来发现,不管是用软件ECC还是硬件ECC都不行。只好改成NAND_ECC_NONE:
在driver/mtd/nand/s3c2410.c中找到s3c2410_nand_init_chip()函数,将其中的
chip->ecc.mode=NAND_ECC_SOFT;
改成
chip->ecc.mode=NAND_ECC_NONE;

第四步:修改Makefile文件:
修改其中的目标平台和交叉编译器为:
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-

第五步:配置内核:
make menuconfig
注意,要将tmpfs选上,否则kernel找不到root分区。

第六步:编译内核:
make

到此内核的移植已经完成,但由于2.6.22.3中已经不包含devfs,所以还需要在root filesystem中配置console设备,否则将不能进入交互界面(不会出现提示符#)

第七步:配置console设备:
在root filesystem的/dev中,生成console设备:
mknod -m 600 console c 5 1

最后将kernel和root filesystem烧到nand flash中,kernel的移植即大功告成!^_^

由于2.6.22.3中用udev代替了devfs,下一步将进行udev的移植和配置。

成功移植busybox-1.7.0并加载mdev(udev的嵌入式版本)

上次成功移植完2.6.22.3后,由于没有启动udev,造成/dev下没有设备文件。也就是说所有的设备都没有挂接进来。
用google在网上搜了一把。发现最新的busybox已经包含了udev的简化版本即mdev,且使用非常简单。
于是下载移植:

第一步:修改Makefile
将Makefile中的ARCH和CROSS_COMPILE修改为arm系列:
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-

第二步:meke menuconfig
运行make menuconfig,选择你需要的选项。
在此选择

mdev

第三步:编译、安装
#make
#make install
这时会在你的编译目录下生成一个_install的目录,里面包含了生成的所有文件和目录结构。

第四步:查找所依赖的共享库
#cd _install/bin
#arm-linux-readelf -a ./busybox | grep "Shared library"
用上面的命令可以查到当前的busybox依赖哪些共享库(这些共享库一般可以在你的交叉编译器所在目录的lib下找到)

第五步:将生成的文件和共享库拷贝到你的root filesystem中
将_install中的目录结构和文件完全拷贝到你的root filesystem中。
然后将共享库拷贝到root filesystem的lib目录中,并建立相关的链接文件

第六步:为mdev的运行准备环境
mdev需要改写/dev和/sys两个目录。所以必须保证这两个目录是可写的(一般会用到sysfs,tmpfs。所以要重新编译内核)。
然后在你的启动脚本文件中加入
/bin/mdev -s

最后:将新的内核、新的root filesystem烧到nand flash中就行了。

呵呵,下面要开始调试usb host了。进度一步一步的推进,好开心啊......

记得以前这里的哪位大侠提到2.6.21上已经解决了cramfs做rootfs必须禁用ECC的问题,不过我暂时还不用cramfs,所以没去研究。
另外,我在2.6.14和2.6.18上使用yaffs/ramfs+yaffs可是保留着这个NAND_ECC_SOFT的,也没发现有什么问题。

Read More...

星期二, 九月 11, 2007

转贴:少走弯路的10个忠告--给大家更给自己

1.买个闹钟,以便按时叫醒你。贪睡和不守时,都将成为你工作和事业上的绊脚石,任何时候都一样。不仅要学会准时,更要学会提前。就如你坐车去某地,沿途 的风景很美,你忍不住下车看一看,后来虽然你还是赶到了某地,却不是准时到达。"闹钟"只是一种简单的标志和提示,真正灵活、实用的时间,掌握在每个人的 心中。

  2.如果你不喜欢现在的工作,要么辞职不干,要么就闭嘴不言。初出茅庐,往往眼高手低,心高气傲,大事做不了,小事不愿做。不要养成挑三拣四的习惯。不要雨天烦打伞,不带伞又怕淋雨,处处表现出不满的情绪。记住,不做则已,要做就要做好。

  3.每个人都有孤独的时候。要学会忍受孤独,这样才会成熟起来。年轻人嘻嘻哈哈、打打闹闹惯了,到了一个陌生的环境,面对形形色色的人和事,一下子不 知所措起来,有时连一个可以倾心说话的地方也没有。这时,千万别浮躁,学会静心,学会忍受孤独。在孤独中思考,在思考中成熟,在成熟中升华。不要因为寂寞 而乱了方寸,而去做无聊无益的事情,白白浪费了宝贵的时间。

  4.走运时要做好倒霉的准备。有一天,一只狐狸走到一个葡萄园外,看见里面水灵灵的葡萄垂涎欲滴。可是外面有栅栏挡着,无法进去。于是它一狠心绝食三 日,减肥之后,终于钻进葡萄园内饱餐一顿。当它心满意足地想离开葡萄园时,发觉自己吃得太饱,怎么也钻不出栅栏了。相信任何人都不愿做这样的狐狸。退路同 样重要。饱带干粮,晴带雨伞,点滴积累,水到渠成。有的东西今天似乎一文不值,但有朝一日也许就会身价百倍。

  5.不要像玻璃那样脆弱。有的人眼睛总盯着自己,所以长不高看不远;总是喜欢怨天尤人,也使别人无比厌烦。没有苦中苦,哪来甜中甜?不要像玻璃那样脆弱,而应像水晶一样透明,太阳一样辉煌,腊梅一样坚强。既然睁开眼睛享受风的清凉,就不要埋怨风中细小的沙粒。


  6.管住自己的嘴巴。不要谈论自己,更不要议论别人。谈论自己往往会自大虚伪,在名不副实中失去自己。议论别人往往陷入鸡毛蒜皮的是非口舌中纠缠不 清。每天下班后和你的那些同事朋友喝酒聊天可不是件好事,因为,这中间往往会把议论同事、朋友当做话题。背后议论人总是不好的,尤其是议论别人的短处,这 些会降低你的人格。

  7.机会从不会"失掉",你失掉了,自有别人会得到。不要凡事在天,守株待兔,更不要寄希望于"机会"。机会只不过是相对于充分准备而又善于创造机会 的人而言的。也许,你正为失去一个机会而懊悔、埋怨的时候,机会正被你对面那个同样的"倒霉鬼"给抓住了。没有机会,就要创造机会,有了机会,就要巧妙地 抓住。

  8.若电话老是不响,你该打出去。很多时候,电话会给你带来意想不到的收获,它不是花瓶,仅仅成为一种摆设。交了新朋友,别忘了老朋友,朋友多了路好走。交际的一大诀窍就是主动。好的人缘好的口碑,往往助你的事业更上一个台阶。

  9.千万不要因为自己已经到了结婚年龄而草率结婚。想结婚,就要找一个能和你心心相英相辅相携的伴侣。不要因为放纵和游戏而恋爱,不要因为恋爱而影响工作和事业,更不要因一桩草率而失败的婚姻而使人生受阻。感情用事往往会因小失大。

  10.写出你一生要做的事情,把单子放在皮夹里,经常拿出来看。人生要有目标,要有计划,要有提醒,要有紧迫感。一个又一个小目标串起来,就成了你一生的大目标。生活富足了,环境改善了,不要忘了皮夹里那张看似薄薄的单子。

Read More...

星期一, 九月 03, 2007

可以看LINUX内核源码的网站

http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/kernel/
http://lxr.linux.no/source

Read More...