- 10
- 12月
今天,F哥给我做了一下计算。
最近上班在写一个程序,从上周三开始的。然后到今天,数了一下,大概有1K多行程序。
于是,我们就得出一个结论,目前上班,一天平均100 - 200行程序。
嗯,做一下记录,以便做项目耗时的评估。
今天,F哥给我做了一下计算。
最近上班在写一个程序,从上周三开始的。然后到今天,数了一下,大概有1K多行程序。
于是,我们就得出一个结论,目前上班,一天平均100 - 200行程序。
嗯,做一下记录,以便做项目耗时的评估。
这个世界,牛人太多!
突然发现,自己真是太渺小了,太微不足道了。出来工作了快两年了,可能真的连一个中学生也比不上。有时候甚至都在想:走这条路是不是正确的?若干年后,自己在这个职位上是否还有立足之处?
整理一下目前发现的一些牛人吧。当然,太远的就不说了,就说说就在自己身边的吧:
Figos
就是F哥了,我的老大、老师、好朋友。我就是他带出来的,可惜,还是有一大段差距。
Hoofei
很喜欢他做的美工风格。现在用的Blog皮肤就是他设计的。
Xiaoxia
在我写这篇日志时,他才刚上大一,也是华南理工大学的。高中时代,就已经写下了自己的操作系统:SGOS2008,还破解了QQ的通信协议,写了自己的QQ软件吧。而已经出华工出来的我,又能写些什么?
混蛋70
Typecho,也就是这个博客的程序的作者。PHP我也玩挺久了,可是,真的还是没能写出一些什么呢?
TualatriX
Ubuntu Tweak的作者。嗯,很强大!相比之下,我连Linux的基本操作还不会?
Longbill
也是一个学PHP的,在高中时代就已经开发出了PHPCMS
Shuang
这个空间很久没更新了。玩过作者之前开发的《画笔大战》。
Victor_Dinho
大学时的一个师弟。他,还有他的一个同学都是大牛!
Jumping
很早以前认识的网友了,很久没有联系上了。开发过《超快俄罗斯方块》,对一些算法设计,也有自己的见解。
这几天一直被一个叫Global Offset Table的东西困扰着。
在uboot的程序上看到一个叫_GLOBAL_OFFSET_TABLE_的东东,却到处找不到。经过一番Google,才明白这东东叫全局变量偏移表,用来做与位置无关的程序编译时使用的。并且编译选项要加上-mabicalls。另:与程序位置无关的编译选项是:-fpic和-fPIC。
Global Offset Table里,存得是一些函数地址,放在.got段。一般是使用gp来访问。
不过在资料中还看到,这个主要用于一些动态库。如果没用到动态库的话,应该也不是十分太需要吧,毕竟使用GOT会影响small data的使用,同时会增加每个函数调用所需的指令。
费了好大的劲,终于知道gp寄存器的用法了。
首先说说gp寄存器出现的原因吧,由于RISC体系的CPU,每条指令都是32Bit,而地址总线也是32Bit,这样,就不可能通过一条指令来实现Memory的访问。
MIPS中,访问Memory的指令格式为:
lw r1, offset(r2)
其中,offset为16Bit,也就是说,最多能访问以r2为基地址,前后32K的空间。
于是这个时候,gp就闪亮登场了。
我们知道,GCC在编译过程,会将变量分别放在data,bss,common等段。而编译mips程序时,会将小变量放入sdata,sbss,scommon等段。这个大小由编译选项-G来决定。-G0则表示不使用小数据段。默认是-G8,表示小于或等于8 byte的数据将放入小变量区。
这样的话,在上电时给gp初始化一个值,那么,所有小变量区的变量就可以通过
lw r1, offset(gp)
来访问了。
那么,GCC怎么知道gp初始化的值呢?只要在link文件中添加_gp符号,连接器就会认为这是gp的值。我们在上电时,将_gp的值赋给gp寄存器就行了。