| mumu's profile觉醒的加菲猫PhotosBlogLists | Help |
|
May 31 谈一个“古老”的技术问题arm-linux-gcc installation problem:Cannot exec ‘cpp0’以下介绍收集的一些解决方案: 今天用个已经是二进制文件的交叉编译器一直报大概如下边所示的错误。折腾了一个多小时,还是没法正常使用。 后来经高人指点,原来是文件的目录问题。说这个二进制文件默认只能在/usr/local下使用。我将此文件移动后,果然就能正常使用,这个问题真的够BT的。 ——来自Yamir's Blog2006-02-10 15:26:45
我碰過喔... 恩,原來gcc的目錄不能隨便亂搬動~~ ——匿名2005-10-31 08:54 PM
On Jul 28, 2001, s.kwiatkowski@t-online.de (Sebastian Kwiatkowski) wrote:
> Could this problem have something to do with the conten of the
嗯哼,一路看下来会发现解释得一个比一个深刻,再瞧瞧时间。 嚯,是倒序的。。。我理解完第三种,采用第一种方法把它搞定了
May 30 串行设备驱动翻译:地灵 作者:Alessandro Rubini 对于串口的一般观点 在Linux下当讨论到串口的软件应用时,我们头一个想到的是就是/dev/ttyS0。这是个相当典型的字符串行设备,至少在PC机上是这样的。因为/dev/ttyS0是一个专门的“字符”型的文件。一个串行的驱动程序常常被当作是一个常规的字符设备。通常所说的“ 串口是字符设备的范例”便来源于这种想法。不幸的是,这个范例是完全错误的。 如果你看源码,你会发现字符设备仅仅涉及串口驱动最初级部分。这就是为什么一个串口驱动避免使他自己成为字符设备的范例。 实际上使用字符设备驱动不能准确地抽象出串行设备驱动的概念。因为没有专门的主设备号分配给他们。事实上,你可以通过加载Linux内核模块,把一个串口程序添加到你的计算机上而不需要分配新的主设备号。 查看/proc/devices你会发现主设备号4是关联到ttyS驱动的,但这是个善意的谎言,因为文本模式的控制台设备也属于主设备号4。实际上,Linux-2.0更多时候使用“ttyp”的名字来描述主设备号4。 是什么使串行设备驱动不同于一个传统字符设备驱动(诸如打印端口驱动或是磁带设备驱动),主要是它被抽象为tty设备。因为一个串行通道可以被用做字符或是数字的终端。一个串行设备必须集成到终端设备的仿真层,所以被叫做“tty”设备,这个名字来源于旧的电报交换机的称谓(tele-tape device当编写Unix时,这种设备正被广泛的应用着)。 TTY设备处理概论 既灵活而又功能强大的tty设备处理,由几个部分组成。你必须考虑到存在很多tty设备,从依赖于字符控制台的VGA以及祯缓存到串行通讯通道和虚拟终端,都作为符合这些条件的典型应用(当然还不仅仅局限于这些)。 图一,展示了涉及串行设备驱动的各种不同的模块。大部分文件位于driver/char中,要不是这样,这个目录通常位于根目录下的内核源码树中。这张图展示了每个新建的模块怎样注册上去。(注册是为了允许每个程序块能想内核模块一样被调用)。
fs/device.c所输出的接口被大多数系统资源用来注册设备驱动被每一个主设备号所标识。这就是tty_register_driver怎样分配一个主设备号的,如果需要支持新的tty驱动的话。(一个目标设备将在下面介绍到)。这个功能被tty_io.c定义,tty_io.c同样也定义作用在tty设备上的文件操作。文件操作就是一些驱动特有的读,写操作和其他系统调用相关的文件接口。 像serial.c或是其他串口驱动程序要运行它们的代码,是通过注册tty_driver结构来完成的。这个“驱动”声明了主设备号和一系列需要用到的次设备号,以及一连串它支持的操作。这些操作包括数据的输入和输出,数据流控制以及与高层间的通讯。执行这些操作以及中断处理和实际的数据输入输出都是串口硬件驱动的范围。 数据传输在用户空间和串行设备的驱动之间,被tty层来协调,它所执行的功能被所有tty类型的设备所共有。因此并非所有的tty处理都定义在tty_io.c中,大多数策略被定义在线路处理中,一个软件模块会告知怎样使用一个物理上的tty I/O线。这个Linux默认的管线设置叫做N_TTY,这个名字将呆会解释。如果n_tty被激活,输入的数据会通过/dev/interface以及标准的I/O终端操作到达用户空间。(也就是说,所有的特性都定义在<termios.h>中,它使得终端处理变得如此强大和同时也变得困难) 图1中的红线展示了合理的数据流向,通过硬件通道到用户可以访问的设备专用文件再返回。是什么把这些联系起来呢,答案时tty数据项。在它里面包含有一个指向三个相应模块的指针:文件操作结构——用于和用户空间通讯;tty_driver结构——主要功能是控制真实的硬件;以及tty_ldisc结构——它列出了所有的当前线路设置的入口。
为什么这么复杂? 当然这种安排看起来超级复杂,然而像往常一样,这些特有的复杂性意味着将会使驱动变得更富有弹性和功能更强大。增加对新的串行设备的支持或许有点不同与写一个传统的字符设备。但是这样的设置确保了完全的tty在所有串行端口上的效法,而避免了任何代码的拷贝或是在底层驱动上添加不需要的复杂性。 另一个这种安排的优点是,很可能比其他通用的tty设备支持更重要的是,它有能力改变联系到每个tty设备的线路设置。不像典型的设备驱动程序,它们的任务仅仅是连接硬件设备和用户空间,一个串行驱动程序与用户空间毫无关联,数据从硬件接收后通过设置的线路传递。从软件接收的数据也是通过线路设置的方法。 因此,一个串行设备驱动并不以任何方式关联到从用户空间传入或是传出到用户空间的数据。这个任务由线路设置同粗略的termios操作共同承担。这使得串行数据有可能直接被引向的通过不同设备的用户空间,而非关联到ttyS设备专用的文件。
PPP协议以及SLIP(串行线路接口协议) 无论何时你用你的调制解调器通过ppp协议连接到因特网,或是用更简单的slip通讯协议把你的Linux掌上电脑和PC连接起来,你正使用着正在展示的复杂的事物。Ppp和slip都执行它们自己的线路;当它们其中的一个在运行时,tty设备会切换到不同的设置线路,目的是把/dev/ttyS0从串口中区分出来并保证所有的串行通讯在内核中运行。 图2 展示了在使用slip情况下时概念上的规划。没有选择ppp作为例子是为了避免额外的复杂性和不正确的简化。在2.4版本的Linux内核中,ppp软件程序执行被分割为几个文件(再一次的,更多的结构意味着更强大的功能,避免了在类似设备中代码的重复)。这两种协议以同样的构架执行着不同行为。
Slip驱动所扮演的角色,如图所示,同样也被注册为一个网络设备(表述为slip0和在tty设备上的线路设置(称为N_SLIP))。当tty设备被切换到新设置的线路上时,TCP/IP通信开始了。新设置的线路建立串行设备硬件和网络层之间的数据传输。当线路设置被激活时,就不能再从/dev/ttyS设备上读取或写入任何数据了。一旦这个设备被关闭(/dev/ttyS0或类似设备),默认的线路设置被重新载入。实际上,这就是为什么slattach或是pppd在设置了网络通道之后还能退出的主要原因。
数据结构 有三种主要的数据结构涉及到tty设备的处理(也即,串行设备的通信): Struct tty_struct:这个数据结构体涉及tty处理的核心。它包括如下构造。一个tty_struct
struct tty_driver {
/* the driver states which range of devices it supports */ short major; /* major device number */ short minor_start; /* start of minor device number*/ short num; /* number of devices */
/* and has its own operations */ int (*open)(); void (*close)(); int (*write)(); int (*ioctl)(); /* device-specific control */
/* return information on buffer state */ int (*write_room)(); /* how much can be written */ int (*chars_in_buffer)(); /* how much is there to read */
/* flow control, input and output */ void (*throttle)(); void (*unthrottle)(); void (*stop)(); void (*start)();
/* and callbacks for /proc/tty/driver/ */ int (*read_proc)(); int (*write_proc)(); };
Struct tty_ldisc:这个结构体参考于tty_struct的ldisc领域。打开设备的时候,这个结构体参照n_tty被初始化;应用程序能通过ioctl来改变线路设置,一会将解释。 struct tty_ldisc { /* routines called from above */ int (*open)(); void (*close)(); ssize_t (*read)(); ssize_t (*write)(); int (*ioctl)(); /* routines called from below */ void (*receive_buf)(); int (*receive_room)(); void (*write_wakeup)(); };
这些结构体被声明在三个不同的文件中:tty_struct是一个定义在include/linux/tty.h中的复杂结构,这是一个专门定义tty项的头文件。事实上,我们没兴趣关注另外两个,因为用户模块及少直接接触到它们。 Include/linux/tty_driver.h和include/linux/tty_ldisc.h中主要是其它相关数据结构的定义。这些文件中有很精彩的注释解释它们在这个领域中所扮演的角色。不像tty_struct,tty_driver和tty_ldisc被设备驱动模块的程序所激活。 典型的,一个内核模块支持一种新的应用tty_driver结构体的硬件,当一个模块使用通用的串口硬件来重新设置线路时。比如,如果你有一个键盘通过标准的RS-232串口传输数据,你需要重新设置线路来获取数据包并且通过输入机制来发送它们(参见drivers/input/input.c和include/linux/input.h),或是通过通用键盘驱动(使用 handle_scancode(),输出通过drivers/char/keyboard.c)。 列表一展示了结构体tty_driver中最重要的操作声明,列表二详述了通过线路设置的输出。注意这些列表并非完整的,如果要查阅权威可靠的信息,你应该阅读相关的头文件。 数据流在读操作和写操作中
图3 模拟数据流怎样从用户空间到硬件接口再返回的。它把具体的标准PC串口和默认的线路设置联系起来。逻辑上的线路设置栈(用户空间附近)和tty驱动(在硬件附近)应该是明显可区分的。 当直接写入数据时,读进程需要一些说明。读操作比写操作更复杂是因为没有直接的联系在硬件接口(在数据到达时发送它)与用户空间(在需要时请求获得数据)。解决方法是,正如你所见,使用缓存:数据接收通过硬件接口保持在内核中的缓存里,直到用户空间的程序提出数据请求。无论何时,只要用户程序请求数据,这个缓存就被清空,用户程序开始睡眠,直到缓存有新的数据填入时才被唤醒。注意,写操作的缓存依然存在,然而写操作的执行更直接,因为面向硬件的每一步都直接被图3中的驱动所描述出来了。存在可变的延时在数据传输的过程中,这个缓存仅仅是用来减弱从用户数据流到硬件接口的传输速度。在图上,没有展示这一过程是为了简化。 当tty设备驱动被关注时,读缓存取决于已有的tty数据结构;然而这使得tty_struct结构体更庞大,数据则在结构体中等待被线路设置传输出去。(也就是说,在默认的状态下,被传输到用户空间),一个“flip”缓存被硬件程序用来尽可能快的储存收到的数据,却并不需要同步的并发访问:flip缓存是硬件设备独有的,它最终调用tty_flip_buffer_push来传递数据到tty缓存,然后线路设置再把它从这里发送出去。 很有趣的是flip缓存被看作两个物理缓存然后选择其中的一个写入数据。它允许更多被信赖的操作,向中断处理程序中总是有一个可写入的缓存。函数flush_to_ldisc,被底层驱动和部分tty层所调用(tty_io.c),用作被flip缓存所弹出,在中断程序返回前。顺便说一下,这种设计方案就是为什么flip缓存叫弹出缓存的原因。
怎样使用自定义的线路设置 内核代码,正如所陈述的,可以注册一个新的线路设置通过tty子系统,这也可通过模块化源码来注册。因此,你可以编写你自己的线路设置并注册它。每个线路设置被一个设备号所区分,也可以其一个名字在C语言编程中。通过include/asm/termios.h来给它分配设备号以及命名。 默认的tty线路设置被许多的N_TTY结构所区分,PPP使用N_PPP等等。不幸的是,并没有线路设置标号被保留为当前已经使用过,所以你只能自己尝试出那些没有被系统使用的标号。实际上,没有官方的驱动现在使用过N_MOUSE,所以它是一个很好的自定义线路设置的标号。 为了激活N_MOUSE线路设置,用户空间的程序应该使用如下的源码: #include
int i = N_MOUSE; ioctl(fd, TIOCSETD, &i);
register_serial所扮演的角色 如果你注意到driver/char/serial.c输出一个函数叫做register_serial,你或许会想要知道它会在这个tty体系结构中的要点。事实上,他只起一个孵化标准的串行tty设备驱动,为了方便标准串口的添加。串行设备并不是做为一个完整的软件模块被注册,相反,只是定义一些新串口用到的参数,这些参数被serial_struct结构体所描述,它依次被定义在include/linux/serial.h中;它们像传统的串口驱动一样被使用,衍生出标准的PC串口。你不能使用这个函数来注册16450或与之类似的串口以外的任何串行设备硬件。支持PC平台的列表可以从uart_config中找到排列,在serial.c中。其他系统上的平台为register_serial提供不同的执行。
串行设备控制台 串口也能像控制台设备一样使用,这种功能区别开了其他的tty处理。 实际上,控制台设备在Linux系统得最底层,因为他必须尽可能快的输出操作系统的调试信息。它不能涉及所有复杂的tty处理。但是在2.4版本的控制台处理中,它已经自成一个体系,有自己的数据结构和函数,这是它非常的灵活也更值得信赖。我将会在下期专栏中提到这个体系。 谢谢观赏!
任何段落拷贝或是整篇文章在媒体上发布都是获许的,但是这个须知必须保留
阿拉赛得隆(Alessandro)是一个意大利的自由顾问。尽管他声称自己是一个程序员,他的工作去主要集中在自由软件以及为真正的程序员编写文档。他在自己的计算机上使用GNU操作系统,因此你可以通过rubini@gnu.org联系他。 May 23 爱与不爱 说不清爱是什么 也说不清爱什么
只记得快乐时第一个想到要与她分享 分享喜悦 没有分享 也就失去了绝大多数的快乐 欢欣源于默默的支持 只记得失意时最想能够与她一块
能从她的慰藉中获得无限力量 哪怕只是静静的呆着 源力源于对方无言的信任 总是一贯无偿支持你的异性 不管承不承认
别犹豫那一定是爱 当迷途时,失意时,落寞时守候在你身边的异性 不管承不承认 别犹豫那一定是爱 得知你受伤第一个赶来的异性 不管承不承认 别犹豫那一定是爱 看着你飞黄腾达 想要道贺却踌躇不前偷偷为你高兴的异性 不管承不承认 别犹豫那一定是爱 有事无事总爱烦你的异性 不管承不承认 别犹豫那一定是爱 除此之外 都是不爱 我不停地学 终于开始明白爱的表象及本质 也了解如何去爱该爱的人 May 12 前言五一期间一个偶然的机会,我恰巧看到了谢耘博客上连载的<我的职场十年>一文.感觉很有启示,历史就像螺旋状的染色体,有意无意的在不同人身上以相近的方式演绎着.司马迁说过"以史为鉴,可以明志".先驱者总是举着火把引领在时代的最前方.我们只需追随着足迹,用尽可能少的时间全力赶上即可.毕竟上天分配给每个人的生存时间都是极其有限的,没有太多的时间去绕弯路. 感谢二十一世纪迅猛发展的信息化产业,使我们有机会通过互联网无隔阂的交流,和整个社会分享个人的经验和收获.我的一位同事曾对我说过:"你应该相信你现阶段遇到的问题,这个世界也一定同样有人遇到过,并且会给出一个解."我们做的是一定意义上的开源项目,我推崇开放式的交流和讨论,这也是GNU的核心精神.幸运的是,到现在为止,我还没遇到过这句话的反例.如果遇上了,我相信只会是两种情况:1.我走进了死胡同2.我走在了解决这个问题的最前沿.第二种情况反而是期待发生的.
如果说<联想风云>是从创始人的角度来映射整个联想集团的发展的话;那么谢耘的<我的职场十年>将是一个的中层管理人员对联想发展的映射.更值得关注是作者思想在职场中一步一步的纵向变化.毫无疑问作者非常善于思考和总结,他的经验对象我们这样和联想体制类似企业的发展有很大的借鉴意义.作者本身也是理工科出身,他的文风是严肃的并且运用了很多理论化的语言,逻辑严密.由于很多经验都抽象到理论的高度,读起来难免有些枯燥.如果再辅加一些详尽的事例,会使整个文章显得更生动,供参考的价值也更大.因为人的经验会随时间和环境的改变而改变,不同的人对同一件事也会有不同的看法,所谓"横看成岭侧成峰,远近高低各不同".也就是常提到的案例分析.我把我自认为重要的作者的几个重要思想总结了一下,做为各章的简介,仅供参考.(若感兴趣请参看原文)
1.不在其位,不谋其政 中国人说“天下兴亡,匹夫有责”,人人都应该关心.许克明的话和南怀瑾的文字以及柳志雄的管理方式,使得我开始学习从职业化的角度来理解自己在一个组织中的职责和作用。不再不知天高地厚地去做“主人”;学会经常提醒自己不要自以为是地认为真理总是在自己一边;也明白了一个道理,只有在其位的人,才是承担相应责任的角色。你即使出于好心,即使你的看法确实比对方更正确,你也没有权力去代替别人行使职责。你拥有建议权,而在其位的人,有权不接受你的建议。你不应该因此而感到郁闷,因为这是职业化体系的基本运行规则。这种行为准则,与我们从小受到的“以天下为己任”,甚至是要“解放世界上三分之二的受苦人”的教育,确实有很大的不同。但是,对于个人而言,国家、民族也确实与公司是有本质不同的。 2.平等与尊重 其实,当你向别人宣泄自己负面的情绪的时候,尽管当时你可能得到一种轻松甚至是满足。可是,你的负面的情绪一定会在别人那里引起一定的反应,而且通常会是同样的负面的反应。如果你是一个组织的一员,这种负面的反应将会在你所处的组织中扩散,最终通常还会以某种形式反馈给你自己。更为糟糕的是,反馈回来的,可能比你当初释放的,要强烈许多倍。这种循环,对于工作是没有任何好处的。如何用一种积极的正面的态度去对待你周围发生的事情,确实是一个人走向成熟的重要标志之一。这不只是心理的成熟,更需要自己对这个包括你自己在内的世界,有一个客观公正的评价和认识。 3.放权与培养新人 这其中我感受最深的是,当你面对一个不可能完成,并且你自己也并不是很熟悉的任务的时候,其实你最根本的出路,只能是想办法让你的团队每一个成员能把自己的潜力充分地发挥出来。而要做到这一点,你就必须学会放权和信任别人,而不是自以为是地去“指导”或“管理”别人。 May 09 我是一个爱情木瓜我是一个爱情木瓜
我对你一点一点的想念 不愿惊醒你的美丽
我是一个爱情木瓜
我对你一点一点的思念 相信你一定开始感觉
我是一个爱情木瓜
我对你一点一点的爱念 请相信你的直觉
我是一个爱情木瓜
附记:
木瓜是一种很适合现代人的水果,它富含维生素和矿
物质,热量少,那些上班坐办公室、出门坐车、经常坐在
家中看电视上网的朋友,多吃些木瓜可以防治便秘,或者
减轻便秘症状。木瓜中含有非常独特的木瓜酵素,可以分
解淀粉及蛋白质,帮助消化。 May 08 请拿起电话轻松的说声“喂” 五一前夕发生一件令我触动的事,使我意识到我还是一个情绪化倾向比较严重的人. 大概这也是每个倾注于技术或是"单纯"的人通病吧,自觉不自觉把对某件事的情感迁住到另一件毫不相干的事当中去.事情的原委是这样的,当时我的情绪有些低落,并且正专注于处理程序中的某些问题.手机不合时宜的震动起来,显示着一个不符合常规的号码.人在烦闷的时候,总会觉得只要围绕他发生的事统统是在带有恶意的针对他.对于这个陌生的电话,我"果断"的采取了一种最不友好的方式--拒接.不是因为要顾及的现实中的某些特殊场合,而是出于发泄自己的情绪.这样的事,我对同一个号码做了三次.在第三次后,我怒不可遏的致电中国移动的客服人员,我把它看作是某个运营商端口的号码.当我报出电话号码时,客服小姐温柔地提醒我这极有可能是个国际长途.刹那间我明白是我误会了. 这对我来说或许意味着一次机会,又或者什么也不是,天知道.
寻找适合的能够释放自己的渠道,如果经常性的需要这样泄洪.恐怕是工作或生活中的某一个方面出现了严重失衡,应该静下心来好好地想想,予以解决.未雨绸缪,建立起预防机制的方法是培养一种兴趣,纯兴趣的.当你浸淫其中的时候,能够忘掉工作和生活中的不快.总之,对负面的情绪学会引导和控制.谢耘在<我的职场十年>中也详细论述了这个问题: "其实,当你向别人宣泄自己负面的情绪的时候,尽管当时你可能得到一种轻松甚至是满足。可是,你的负面的情绪一定会在别人那里引起一定的反应,而且通常会是同样的负面的反应。" 更糟的是,这种负面效应用不了多久最终又会反弹回你的身上,而且是以更强烈的形式.这种效应在团队中或是贴近你的人身上会表现得尤为明显.所以背负在身上的压力愈重,愈不要擅自做主直接分担在团队其他成员身上,也不要直接分担在朋友爱人身上.可以商议,可以倾述,可以暗示希望获得援助和支持;不能发泄,不能抛弃已经承担的责任. 学会独力承担压力,是走向成熟的一个显著标志. 无论何时,无论处于何状态,当拿起电话听筒请轻松地说声"喂,您好",用电波传达出于一个友好自信的讯息. |
|
|