2005年5月31日星期二

神州为什么不好?

1。神舟为什么不好?因为其它品牌的厂家都说不好,不信,你去问他们。

2。神舟为什么不好?因为其它品牌的经销商都说不好,不信,你去问他们。

3。神舟为什么不好?因为其它用其它品牌的人都说不好,买同样配置的一万多的IBM的人,能承认同样配置的神舟好吗?不信,你去问他们。

4。神舟为什么不好?因为那么多人跳出来骂神舟不好,IT媒体也不敢说好。毕竟本本就便宜,广告费当然更少。不信,你去看看他们的文章。

5。神舟为什么不好?因为想买神舟笔记本的人一打听,听说神舟笔记本不好。其它他们除了觉得LOGO难看做工一般之外,也不知道还有什么不好。不信,你去问他们。

6。神舟为什么不好?因为神舟用户说不好!为什么?因为大家都说神舟不好,神舟的用户觉得特没面子!不信,你去问他们!

7。总之,神舟为什么不好?虽然价格便宜、性能强劲、保修期长,但仍然不好,就是不好,不好的还能好?大家都说不好,它就是不好!不好,就不好!!! ----奇怪的国民心态

2005年5月28日星期六

哈哈,考试完了

nnd第一次靠用英语写的技术类的试卷,题目比较简单,但是要求抬高了,居然要对90%才可以及格,估计没戏,下次再靠把,重修!!!!!!!!!!!!!

2005年5月27日星期五

新搬家

今天把blog放到了自己的地盘上面,嗬嗬,还不错,速度快了很多,不过发布速度狂慢,离我得那个免费的空间查多了,不过那个空间是国外的,访问速度在国内慢了一些,谁知道,兄弟说是比以前的免费空间访问还慢,一个地方一个样,不管了,我访问快就可以了,忙着毕业设计,烦死了~~~

2005年5月26日星期四

历史上最恐怖的12个英文单词 (老外也受不了!)

历史上最恐怖的12个英文单词 (老外也受不了!)

1,honorificabilitudinitatibus
这个字是由27个字母组成的。出现在大文豪莎士比亚的剧本「空爱一场」love's labou
's lost里,意思是「不胜光荣」。


2. antidisestablishmentarianism
这个字是由28个字母组成的。根据范克和华格若尔斯编的「英语新标准辞」里面的解释
,这个字的意思是「反对教会与国家分开学说」。它曾被英国首相格来斯顿william ew
art gladstone,1809-1898引述过一次。

3. floccinaucinihilipipification
这个字是由29个字母组成的。「牛津英文辞典」里就有这个字,意思是「把某事的价值
加以抹杀的行为或习惯」。

4. supercalifragilisticexpiadocious
这个字是由34个字母组成的。出现在一部名叫mary poppins的电影里,意思是「好」。

5. hepaticocholecystostcholecystntenterostomy
这个字是由40个字母组成的。出现在高德编的「医学辞典」里,为一个外科术语,亦即
在胆囊与胆管之间或肠子与胆囊之间接人工管子的手术。

6. pneumonoultramicyoscpicailicovolcanoconiosis
这个字是由45个字母组成的。出现在韦氏辞典第八版的版本中意思是「吸入硅酸盐细末
或石英岩灰而形成的肺尘埃沉着病」。矿工特别容易得这种病。

7. antipericatametaanaparcircumvolutiorectumgustpoops of the coprofied
这个字是由50个字母组成的。有个图书馆的书架上,陈列着法国作家拉伯雷着的「葛甘
塔和潘特古」故事系列。其中有一本,书名就是这个长长的英文字。

8. osseocaynisanguineoviscericartilagininervomedullary
这个字是由51个字母组成的。它是人体构造一术语,曾出现在英国作家皮考克thomas l
ovepeacock,1785-1866那本名叫headlong hall的小说中。

9. aequeosalinocalcalinoceraceoaluminosocupreovitriolie
这个字是由52个字母组成的。它是英国医学作者爱德华.史特罗哲dr edward strother,

1675-1737创造的字,专用来形容英格兰格洛斯特夏布瑞斯陀这个地方的矿泉水成分。

10.bababadalgharaghtakamminarronnkonnbronntonnerronntuonnthunntrovarrhounawnsk
awntoohoohoordenenthurnuk
这个字是由100个字母组成的。就出现在爱尔兰作家乔埃斯james joyce,1882-1942作品
finneganswake的扉页,象征,代表亚当和夏娃的堕落。

11.lopadotemachoselachogaleokranioleipsanodrimhypotrimmatosilphioparaomelitoka
takechymenokichlepikossyphophattoperisteralektryonoptekephalliokigklopeleiolag
oiosiraiosiraiobaphetraganopterygon
这个字是由182个字母组成的。它是从希腊字英译过来的英文字,源出自希腊喜剧作家亚

里斯多芬尼斯aristophanes,448-385的剧本the ecclesiazusae中。它是指由剩余的菜和

牛肉函煮而成的辣味食物。

12.
1913个字母,“色氨酸合成酶a蛋白质”(一种含有267种氨基酸酶)的化学名:
methionylglutaminylarginyltyrosylglutamylserylleucylphenylalanylalanylglutamin
ylleucyllysylglutamylarginyllysylglutamylglycylalanylphenylalanylvalylprolyphe
nylalanylvalythreonylleucylglycylaspartylprolylglycylisoleucylglutamylglutamin
ylserylleucyllysylisoleucylaspartylthreonylleucylisoleucylglutamylalanylglycyl
alanylasparthlalanylleucylglutamylleucylglycylisoleucylprolylphenylalanylseryl
aspartylprolylleucylalanylaspartylglycylprolylthreonylisoleucylglutaminylaspfr
aginylalanylthreonylleucylarfinylalanylphenylalanylalanylalanylglycylvalythreo
nylprolylalanylglutaminylcysteinylphenylalanylglutamylmethionylleucylalanylleu
oylisoleucylarginylglutaminyllysyhistidylprolylthreonylisoleucylprolylisoleucy
lglycylleucylmethionyltyrosylalanylasparaginylleucylvalylphenylalanylasparagin
yllysyglycylisoleucylaspartylglutamylphenylalanylthrosylalanylglutaminylcystei
nylglutamyllysylvalylglycylvalylaspartylserylvalylleucylvalylalnylaspartylvaly
lprolylvalylglutaminylglutamylserylalanylprolylphenylalanylarginylglutaminylal
anylalanylleucylarginylhistidylasparaginyvalylalanylprolylisoleucylprolylisoleucylpheny
lalanylisoleucylphenylalanylisoleucylcysteinylprolylprolylaspartylalanylaspart
ylaspartylaspartylleucylleucylarginylglutaminylisoleucylalanylseryltyrosylglyc
ylarginylglycyltyrosylthreonyltyrosylleucylleucylserylarginylalanylglycylvalyl
threonylglycylalanylglutamylasparainylarginylalanylalanylleucylprolylleucylasp
araginylhistidylleucylvalylalanyllysylleucyllysylglutamyltyrosylasparaginylala
nylalanylprolylprolylleucylglutaminylglgycylphenylalanylglycylisoleucylserylal
anylprolylaspartylglutaminylvalyllysylalanylalanylisoleucylaspartylalanylglycy
lalanylalanylglycylalanylisoleucylserylglycylserylalanylisoleucylvalyllysyliso
ieucylisoleucylglutamylglutaminylhistidylasparaginylisoleucylglutamylprolylglu
tamyllysylmethionylleucylalanylalanylleucyllysylvalylphenylalanylcalylglutamin
ylprolylmethionlysylalanylalanylthreonylarginylserine

2005年5月25日星期三

星球大战编年史

星球大战编年史

  帝国历前250000-52000年

  旧共和国形成,杰迪武士首次出现,一些沉迷原力黑暗面的杰迪武士,被共和国驱逐,在流浪过程中,他们奴役了一个酷似人类的种族——西斯(Sith),并成了西斯族的首领,统治者称自己为西斯大君(Lordsof the Sith),自此数千年间,西斯帝国茁壮成长,这些黑暗杰迪武士把西斯族训练成了致命的战士。

  帝国历前52000-5000年

  玛卡·瑞格诺斯(Marka Ragnos)打败塞蒙斯(Simus)成为西斯帝国的统治者。

  帝国历前5000年

  藉由杰迪武士之助,黛塔女皇(Empress Teta)统一了康诺斯星系(Koros System)的七个世界,日后康诺斯星系更名为黛塔星系,而此一事件后称为统一战争(Vnification Wars)。

  帝国历前5000-4990年

  玛卡·瑞格斯死亡,那嘉·沙度(Naga Sadow)继位成为西斯大君。超空间探险家盖夫(Gav)及丘丽·达拉冈(Jori Daragon)兄妹失陷在强大的西斯帝国。这件事导致旧共和国与西斯帝国间的大战。旧共和国与黛塔女皇联手,凭借着杰迪武士与星际舰队,击败了那嘉·沙度,这个西斯大君败退到宇宙的远端,最后落脚于雅汶四号卫星(Yavin 4),而此一事件后称为超空间大战(Great Hyperspace Wars)。

  帝国历前4400年

  精通黑暗原力的博里顿·纳德(Freedon Nadd),控制了昂德朗星球(Onderon)的易希斯城(Iziz),并将反对者逐出野外被野兽吞噬,这些反对者后来驯服了这些野兽。组织起来对易希斯城展开长达四百年的反击,此事件后称为野兽战争(Beast Wars)。

  帝国历前4398年

  博里顿·纳德死亡,但野兽战争持续中。

  帝国历前4002年

  旧共和国发现了昂德朗星,并指派杰迪大师阿卡(Jedi Master Arca)监控。

  帝国历前4002-4000年

  阿卡指派他的杰迪学徒们,以乌立克·奎卓马(Ulic Qel-Droma)为首去平定野兽战争,但受到博里顿·纳德信徒—阿玛诺拉皇后(Queen Amanoa)的反抗,杰迪大师阿卡亲自出马,阿玛诺拉皇后败亡,继位的葛利亚公主(Prince Galia)与野兽之王欧朗·奇拉(Beast Lord Oron Kira)结为连理,野兽战争终告落幕。

  帝国历前4000-3998年

  博里顿·纳德的信徒偷走了纳德的尸体,并由受纳德阴魂控的欧敏国王(King Ommin)领军,他是葛利亚公主之父,绑架阿卡师傅,并进攻希斯城。奎卓马和诺米·阳骑者(Nomi Sunrider),率领一些杰迪武士,杀死了欧敏国王,并确保博里顿·纳德、阿玛诺拉皇后与欧敏的尸体不再受到利用。但一对黑暗原力的信仰者—阿力玛(Aleema)与萨多·凯多(Sstal Keto)已从欧敏国王那里得到了西斯的护身符,并从纳德的阴魂那里得到了西斯之剑(Sith Swords),后来藉此创立了凯瑞斯教派(Sect Krath)。

  帝国历前3997-3996年

  阿力玛与萨朵·凯多藉着西斯遗物这力控制了黛塔星系,一个堕落的杰迪武士艾克萨·亢(Exar Kun)受了西斯阴魂那嘉·沙度的引诱,向黑暗面靠拢,并诱使包括乌立克·奎卓马在内的许多杰迪武士加入了黑暗面。凯瑞斯教派企图恢复古西斯帝国,因此和几百名杰迪武士爆发了大战,后成为西斯战争(Sith War),许多著名杰迪,包含阿卡大师都死于此役。战争结束后,阿力玛与萨朵·凯多反而被其同盟所杀。诺米·阳骑者将乌立克·奎卓马拉回了光明面,并再组成杰迪大军,亢在杰迪大军攻击他在雅汶四号卫星的基地时被消灭了,但是他的灵魂仍困在雅汶四号上几千年。

  帝国历前896年

  绝地大师尤达(Yoda)出生。

  帝国历前200年

  武技族乔巴卡(Chewbacca)在卡须克行星(Kashyyyk)上诞生。

  帝国历前92年

  绝地大师魁刚·金(Qui-Gon Jinn)出生。

  帝国历前60年

  欧比旺·克诺比(Obi-Wan Kenobi)出生。

  帝国历前48年

  蒙·茉斯玛(Mon Mothma)在千瑞拉星球(Chandrila)出生,后来成为参议员与反抗军之领袖。

  帝国历前46年

  阿米达拉女王(Queen Amidala)出生。

  帝国历前41年

  阿纳金·斯凯沃克(Anakin Skywalker)出生。

  EPISODE I

  帝国历前32年

  纳布星(Naboo)发生达斯·西底亚斯(Darth Sidious)幕后主谋的贸易联盟(Trade Federation)暴力封锁事件,年轻阿米达拉女王与冈根族(Gungans)合力抵抗。纳布星帕尔普廷(Palpatine)议员当选最高议长。绝地大师魁刚·金丧生于达斯·摩尔(Darth Maul)双刃光剑之下,欧比旺为其师复仇,将达斯·摩尔拦腰斩断。阿纳金·斯凯沃克师从欧比旺,开始其绝地学徒之路。

  帝国历前29年

  韩·索罗(Han Solo)出生于科瑞利安星系(Corellian)。

  EPISODE II

  帝国历前22年

  贸易联盟和旧共和之间矛盾日益激化,共和国一改往日和平主张,使用克隆军队开始建立新次序。史称克隆人战争。同年,年轻的阿纳金·斯凯沃克与原纳布星女王阿米达拉结合。

  EPISODE III

  帝国历前22-20年

  阿纳金·斯凯沃克被引诱入原力的黑暗面,成为达斯·维德(Darth Vader)。

  帝国历前18-4年

  反抗军与帝国的对抗(Rebellion Against the Empire)。

  帝国历前18年

  帝国暴虐,一些参议员开始同盟对抗帝国,即为后来之反抗军同盟(Rebel Alliance)。而绝地武士在达斯·维德的追杀下,逐渐雕零,欧比旺隐居塔图因星球(Tatooine),尤达避居达格巴星(Dagobah)。

  卢克·斯凯沃克(Luke Skywalker)和他的双胞胎姐妹莱阿(Leia)出生。

  帝国历前10年

  年轻的韩·索罗成为一个顶尖的飞行员和走私者,并从兰多·卡雷西亚(Lando Calrissian)手中赢得千年猎鹰号(Millennium Falcon)。

  帝国历前10-5年

  机械人伙伴C-3PO和R2-D2在不同的主人手下牵扯入一连串惊险的冒险。

  帝国历前5-2年

  韩·索罗和他的大副乔巴卡经历企业星区(Corporate Sector)中的一连串探险。

  帝国历前1-元年

  反抗军人员凯·卡特龙(Kyle Katarn)偷取帝国的死星计划。

  EPISODE IV

  帝国元年

  皇帝帕尔普廷(Emperor Palpatine)解散议会,并宣布『新秩序』(New Order)。卢克·斯凯沃克、本·克诺比、韩·索罗及乔巴卡救出莱阿公主,面对达斯·维德,并在雅汶战役中协助摧毁死星。但在这之前死星已经摧毁莉亚的家乡行星奥德兰。克诺比让维德将他击倒,并成为原力的一部分。

  帝国元年后期

  卢克和莱阿出发寻找内藏有强烈原力的凯伯水晶(Kaiburr crystal),并遭遇达斯·维德。反抗军撤离雅汶四号上的基地,并开始寻找适合的地点,最后将新基地设在行星霍斯(Hoth)上。反抗军英雄在欧德曼特尔(Ord Mantell)遭遇奖金猎人(Bounty Hunter)。

  EPISODE V

  帝国3年

  帝国大反击,在霍斯战役中击溃反抗军。卢克·斯凯沃克到达格巴行星接受尤达大师的训练。莱阿、韩、乔巴卡和C-3PO在贝斯平(Bespin)的贝斯平云城(Cloud City)被达斯·维德捉
住当饵,引诱年轻的斯凯沃克来救他们。韩被碳化冷冻,并交由奖金猎人波巴·菲特(Boba Fett)运送给犯罪头子甲巴(Jabba the Hutt)。卢克面对维德,维德宣称自己是卢克的父亲。卢克损失一只手和他的光剑,但被莱阿和兰多救了出来。

  帝国3年 中期

  年轻的辛黛儿·托瓦尼(Cindel Towani)和她的家人在恩朵卫星(Endor)上坠机。他们得到一个部落的土生艾沃克族(Ewok)的帮助。

  帝国3年 后期

  黑阳犯罪组织(Black Sun)的领袖西瑟王子(Prince Xizor)计划要消灭达斯·维德,并成为皇帝的副手。他计划藉由暗杀卢克·斯凯沃克达成他的目标,但最后却是他自己被杀。卢克建造了他自己的光剑。

  EPISODE VI

  帝国4年

  卢克·斯凯沃克摧毁甲巴并救出韩·索罗。回到达格巴星,他后发现尤达的生命力量渐渐衰竭。在那里卢克得知维德真的是他的父亲,而莱阿则是他的姐妹。在恩多战役中,韩及莱阿在恩朵卫星上藉由艾沃克族的协助,摧毁用以保护死星 II的护盾产生器。而兰多和驾驶X翼战斗机的魏吉·安地列斯(Wedge Antilles)则合力摧毁这颗更新更强的死星 II。维德从皇帝的手中救出他的儿子卢克,但却死于摧毁帕尔普廷皇帝的过程。

  黑暗帝国历4年

  在摧毁死星 II杀死黑暗皇帝后几天,反抗军必须在巴库拉(Bakula)的停战协议中和帝国武力联手击退虚鲁克族(Ssi-Ruuk)。波巴·菲特从沙虫口中逃生,与丹卡(Dengar)合伙继续赏金猎人生涯,并对韩之家族,持续展开报复。

  新人物凯·卡特龙成为一位杰迪武士。

  兰多·卡雷西亚重新掌管贝斯平云城。

  黑暗帝国历4年5月

  反叛军浪子中队(Rogue Squadron)的X翼战斗机飞行员开始有计划的以行星为单位夺回整个银河。

  黑暗帝国历5年

  包括自称是皇帝之子的区勒斯(Trioculus)在内,许多人尝试夺取受创的帝国领导地位。年少的杰迪王子肯(Jedi Prince Ken)从与世隔绝的地下杰迪失落之城(Lost City of the Jedi)现身与黑暗皇帝真正的儿子—采可洛帕斯(Triclops)阻挠了区勒斯的阴谋。

  甲巴的父亲—赫特族·洛霸(Zorba the Hutt),从兰多手上窃得贝斯平云城,并多次计划要消灭杀子仇人—莱阿公主。

  黑暗帝国历6年5月-7年5月

  在魏吉·安德列斯的率领下,浪子中队解放帝都行星克鲁斯根(Coruscant),并为了夺取能够为全银河人治病的巴克他(Bacta)星球和前帝国情报局长作战,后称为巴克他战争。

  黑暗帝国历8年

  韩·索罗和莱阿·奥嘎纳公主结婚,但这是在韩“绑架”莱阿到行星戴斯摩(Dathomir)之后的事情。

  黑暗帝国历9年

  帝国元帅史隆(Imperial Grand Admiral Thrawn )从银河的边疆回来,并籍由一个疯狂的黑暗杰迪武士复制人杰洛司(Joruus C'Baoth)的帮助,重整帝国武力,并成为新共和国的主要威胁。新共和国最后击退了史隆元帅,史隆元帅最后被自己的保镖鲁克(Rukh)杀害。

  莱阿·奥嘎纳·索罗产下一对双胞胎,婕娜(Jaina)和杰森(Jacen)。

  黑暗帝国历10年

  皇帝的复制人(Emperor's Clone)使用银河之枪(Galaxy Gun )和灭世者战舰(World Devastators)等超级武器将混乱带给新共和国,而且卢克·斯凯沃克差点堕入黑暗面。帝国短暂的夺回首都。后来韩·索罗杀掉了皇帝的复制人,但其阴魂附入一个杰迪武士恩帕多佳由斯·布蓝德(Empatojayos Brand)的身上,直到布蓝德死后,这一代暴君才真正的消失于这个世界。

  莱阿生下第三个孩子,以他外公的名字命名为阿纳金·索罗(Anakin Solo)。

  黑暗帝国历11年

  卢克在雅汶四号卫星上建立杰迪训练学校(Jedi Training Academy ),但差点被苏醒的黑暗大君艾克萨·亢的灵魂杀死。魏吉·安地列斯升任大将军。

  黑暗帝国历12-13年

  在卢克被困在老旧的帝国战斗要塞、对抗一个赫特族的犯罪头子、以及处理一种致命传染病神秘蔓延之时,他和一度是杰迪武士的卡莉丝塔(Callista)有一段史诗般但没有结果的恋情。

  黑暗帝国历14年

  莱阿和韩的三个孩子被一个曾是帝国官员,创设“帝国重生”运动(Empire Reborn)的海瑟(Hethrir)绑架。

  黑暗帝国历15年

  卢克·斯凯沃克学得隐形物体(cloak objects)的能力。

  黑暗帝国历16-17年

  新共和国受到残忍恐怖的种族夜维森族(Yevethan)的威胁。韩·索罗也落入夜维森族之手,幸好乔巴卡组成一支武技族救援队,救回了韩。

  卢克寻找有关他母亲的线索。

  黑暗帝国历17年

  曾是杰迪学院学生的库勒(Kueller)受到黑暗面的诱惑,放置炸弹威胁新共和国政府。

  黑暗帝国历18年

  韩的堂兄,和他长的很像的施瑞肯·撒苏洛(Thracken Sal-Solo),领导一支残酷的革命军意图夺取科瑞利安星系的领导权。索罗的孩子们在千钧一发之时停止了撒苏洛炸毁星球的武器,阻止了他的阴谋。

  黑暗帝国历19年

  新共和国赫然发现史隆元帅竟然还活着,虽然后来再度击败了史隆,但史隆的存在仍是整个宇宙和平的最大威胁。

  黑暗帝国历22-23年

  阿纳金·索罗开始在杰迪学院学习。

  黑暗帝国历23-24年

  玛拉·婕黛(Mara Jade)原本是效忠于黑暗皇帝的杀手——人称皇帝之手(Hand of the Emperor)。在皇帝死后,顿失生活目标,因此以卢克为敌,认为卢克是破坏她生活的凶手,经过一番流浪,她栖身于塔龙·卡帝的走私组织(Talon Karrde's smuggling organization),在史隆元帅与共和国的对抗期间,玛拉再次与卢克相遇,而在逃离米克星(Myrkr)的事件中,两人冰释前嫌,后来玛拉加入了 反抗军,并曾短期的加入杰迪学院,并随着向光明原力的方向靠拢,她与卢克产生爱情,在第二帝国完全灭亡之后,两人终于结为连理。

  婕黛和杰森·索罗姐弟在杰迪学院接受训练,这群杰迪学院的年轻学徒,帮助平定了邪恶的第二帝国(Second Emperium),并与纠缠不清的波巴·菲特一再周旋,他们的杰迪之路充满着艰辛,但他们也是新杰迪武士传说的开始。

本文参考资料:
《Tale of the Jedi Comics》
《Star Wars Encyclopedia》
《The Essential Chronology》
《BTM CDROM》

昨天是我的生日

长这么大第一次记得自己的生日,呵呵,老早就惦记了,可是和平常一样,累倒半死才回去,然后洗澡睡觉,就这么过了~~~~~~~~












(^oo^)

我心目中最适合演唱北京奥运主题歌的明星

本次大型网上调查将以公众推荐的形式推选出100名候选人,再由公众投票共同评出20名“我心目中最适合演唱北京奥运主题歌的明星”。
您可以通过北青网、千龙网、新浪网 、搜狐网、网易、TOM、腾讯网参与公开投票。

一、评选标准
要求被推选的歌手须具备时代特征,有良好的公众形象,符合奥运精神。
他们共同的特质是:具备震撼心灵的演艺才华。

二、评选规则
1、请从100名海选产生的推荐歌手中选择1至2名(演唱组合将按1个单位计票)你认为适合演唱2008奥运主题歌的明星;
2、请点击明星头像旁边的“投票”按钮投票;
3、查看投票结果请点击“查看”按钮;
4. 投票截止日期:2005年6月20日24:00。

http://event.ynet.com/2005aoyun-vote/index.jsp

2005年5月24日星期二

测试一下你的真实的心理年龄

早发过了,今天在贴出来,看看,偶是35岁,咋jie老呢

2005年5月22日星期日

分析ELF的加载过程

ELF的可执行文件与共享库在结构上非常类似,它们具有一张程序段表,用来描述这些段如何映射到�
炭占�.
对于可执行文件来说,段的加载位置是固定的,程序段表中如实反映了段的加载地址.对于共享库来�
�,段的加载位置是浮动的,位置无关的,程序段表反映的是以0作为基准地址的相对加载地址.尽管共
享库的连接是不充分的,为了便于测试动态链接器,Linux允许直接加载共享库运行.如果应用程序具
有动态链接器的描述段,内核在完成程序段加载后,紧接着加载动态链接器,并且启动动态链接器的�
肟�.

typedef struct elf32_hdr{
unsigned char e_ident[EI_NIDENT];
Elf32_Half e_type; /* ET_EXEC ET_DYN 等 */
Elf32_Half e_machine;
Elf32_Word e_version;
Elf32_Addr e_entry; /* Entry point */
Elf32_Off e_phoff; 程序段描述表的位置
Elf32_Off e_shoff; 一般段描述表的位置
Elf32_Word e_flags;
Elf32_Half e_ehsize; ELF头的大小
Elf32_Half e_phentsize; 程序段描述表单元的大小
Elf32_Half e_phnum; 程序段描述表单元的个数
Elf32_Half e_shentsize; 一般段描述表的单元大小
Elf32_Half e_shnum; 一般段描述表单元的个数
Elf32_Half e_shstrndx;
} Elf32_Ehdr;

typedef struct elf32_phdr{
Elf32_Word p_type; PT_INTERP,PT_LOAD,PT_DYNAMIC等
Elf32_Off p_offset; 该程序段在ELF文件中的位置
Elf32_Addr p_vaddr; 该程序段被映射到进程的虚拟地址
Elf32_Addr p_paddr;
Elf32_Word p_filesz; 该程序段的文件尺寸
Elf32_Word p_memsz; 该程序段的内存尺寸
Elf32_Word p_flags; 该程序段的映射属性
Elf32_Word p_align;
} Elf32_Phdr;

struct linux_binprm{
char buf[BINPRM_BUF_SIZE]; 预先读入的ELF文件头
struct page *page[MAX_ARG_PAGES];
unsigned long p; /* current top of mem */
int sh_bang;
struct file * file;
int e_uid, e_gid;
kernel_cap_t cap_inheritable, cap_permitted, cap_effective;
int argc, envc;
char * filename; /* Name of binary */
unsigned long loader, exec;
};
static int load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs)
{
struct file *interpreter = NULL; /* to shut gcc up */
unsigned long load_addr = 0, load_bias;
int load_addr_set = 0;
char * elf_interpreter = NULL;
unsigned int interpreter_type = INTERPRETER_NONE;
unsigned char ibcs2_interpreter = 0;
mm_segment_t old_fs;
unsigned long error;
struct elf_phdr * elf_ppnt, *elf_phdata;
unsigned long elf_bss, k, elf_brk;
int elf_exec_fileno;
int retval, size, i;
unsigned long elf_entry, interp_load_addr = 0;
unsigned long start_code, end_code, start_data, end_data;
struct elfhdr elf_ex;
struct elfhdr interp_elf_ex;
struct exec interp_ex;
char passed_fileno[6];

/* Get the exec-header */
elf_ex = *((struct elfhdr *) bprm->buf);

retval = -ENOEXEC;
/* First of all, some simple consistency checks */
if (memcmp(elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
goto out; 文件头标记是否匹配

if (elf_ex.e_type != ET_EXEC && elf_ex.e_type != ET_DYN)
goto out; 文件类型是否为可执行文件或共享库
if (!elf_check_arch(&elf_ex))
goto out;
if (!bprm->file->f_op||!bprm->file->f_op->mmap)
goto out; 所在的文件系统是否具有文件映射功能

/* Now read in all of the header information */

retval = -ENOMEM;
size = elf_ex.e_phentsize * elf_ex.e_phnum; 求程序段表总长度
if (size > 65536)
goto out;
elf_phdata = (struct elf_phdr *) kmalloc(size, GFP_KERNEL); 分配程序段表空间
if (!elf_phdata)
goto out;

; 读入程序段表
retval = kernel_read(bprm->file, elf_ex.e_phoff, (char *) elf_phdata, size);
if (retval < 0)
goto out_free_ph;

retval = get_unused_fd(); 取可用进程文件表的自由槽位
if (retval < 0)
goto out_free_ph;
get_file(bprm->file);
fd_install(elf_exec_fileno = retval, bprm->file); 将打开的文件安装到进程文件表

elf_ppnt = elf_phdata; 指向程序段表
elf_bss = 0; bss段的起始地址
elf_brk = 0; bss段的终止地址

start_code = ~0UL; 代码段的开始
end_code = 0; 代码段的终止
start_data = 0; 数据段的开始
end_data = 0; 数据段的终止
; 扫描ELF程序段表,搜寻动态链接器定义
for (i = 0; i < elf_ex.e_phnum; i++) {
if (elf_ppnt->p_type == PT_INTERP) {
retval = -EINVAL;
if (elf_interpreter)
goto out_free_dentry; 如果包含多个动态链接器描述项

/* This is the program interpreter used for
* shared libraries - for now assume that this
* is an a.out format binary
*/

retval = -ENOMEM; 为动态链接器名称字符串分配空间
elf_interpreter = (char *) kmalloc(elf_ppnt->p_filesz,
GFP_KERNEL);
if (!elf_interpreter)
goto out_free_file;
; 将动态链接器的文件名读入内存
retval = kernel_read(bprm->file, elf_ppnt->p_offset,
elf_interpreter,
elf_ppnt->p_filesz);
if (retval < 0)
goto out_free_interp;
/* If the program interpreter is one of these two,
* then assume an iBCS2 image. Otherwise assume
* a native linux image.
*/
if (strcmp(elf_interpreter,"/usr/lib/libc.so.1") == 0 ||
strcmp(elf_interpreter,"/usr/lib/ld.so.1") == 0)
ibcs2_interpreter = 1; 说明应用程序是IBCS2仿真代码

interpreter = open_exec(elf_interpreter); 打开动态链接器文件
retval = PTR_ERR(interpreter);
if (IS_ERR(interpreter))
goto out_free_interp;
retval = kernel_read(interpreter, 0, bprm->buf, BINPRM_BUF_SIZE);
; 读入动态链接器文件头
if (retval < 0)
goto out_free_dentry;

/* Get the exec headers */
interp_ex = *((struct exec *) bprm->buf); 假定为aout格式的文件头结构
interp_elf_ex = *((struct elfhdr *) bprm->buf); 假定为ELF文件头结构
}
elf_ppnt++; 下一片段目录项
}

/* Some simple consistency checks for the interpreter */
if (elf_interpreter) {
; 如果定义了动态链接器,分析其格式类型
interpreter_type = INTERPRETER_ELF | INTERPRETER_AOUT;


/* Now figure out which format our binary is */
if ((N_MAGIC(interp_ex) != OMAGIC) &&
(N_MAGIC(interp_ex) != ZMAGIC) &&
(N_MAGIC(interp_ex) != QMAGIC))
interpreter_type = INTERPRETER_ELF; 如果不是AOUT标识

if (memcmp(interp_elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
interpreter_type &= ~INTERPRETER_ELF; 如果没有ELF标识

retval = -ELIBBAD;
if (!interpreter_type) 不能识别动态链接器类型
goto out_free_dentry;

/* Make sure only one type was selected */
if ((interpreter_type & INTERPRETER_ELF) &&
interpreter_type != INTERPRETER_ELF) {
printk(KERN_WARNING "ELF: Ambiguous type, using ELF\n");
interpreter_type = INTERPRETER_ELF;
}
}

/* OK, we are done with that, now set up the arg stuff,
and then start this sucker up */

if (!bprm->sh_bang) {
char * passed_p;

if (interpreter_type == INTERPRETER_AOUT) {
sprintf(passed_fileno, "%d", elf_exec_fileno);
passed_p = passed_fileno;

if (elf_interpreter) {
retval = copy_strings_kernel(1
,&passed_p,bprm);
; 将程序的文件描述符压入参数堆栈,准备传递给aout格式的动态链接器
if (retval)
goto out_free_dentry;
bprm->argc++; bprm->page[]中参数的数目
}
}
}

/* Flush all traces of the currently running executable */
retval = flush_old_exec(bprm);
if (retval)
goto out_free_dentry;

/* OK, This is the point of no return */
current->mm->start_data = 0;
current->mm->end_data = 0;
current->mm->end_code = 0;
current->mm->mmap = NULL;
current->flags &= ~PF_FORKNOEXEC;
elf_entry = (unsigned long) elf_ex.e_entry; 应用程序的入口地址

/* Do this immediately, since STACK_TOP as used in setup_arg_pages
may depend on the personality. */
SET_PERSONALITY(elf_ex, ibcs2_interpreter);
; 如果是ibcs2_interpreter非0,置PER_SVR4代码个性,否则置PER_LINUX代码个性

/* Do this so that we can load the interpreter, if need be. We will
change some of these later */
current->mm->rss = 0;
setup_arg_pages(bprm); /* XXX: check error */
; 建立描述堆栈参数页的初始虚存范围结构
current->mm->start_stack = bprm->p;

/* Try and get dynamic programs out of the way of the default mmap
base, as well as whatever program they might try to exec. This
is because the brk will follow the loader, and is not movable. */

load_bias = ELF_PAGESTART(elf_ex.e_type==ET_DYN ? ELF_ET_DYN_BASE : 0);
; 如果需要加载的是共享库,则设置共享库的加载偏置为ELF_ET_DYN_BASE
/* Now we do a little grungy work by mmaping the ELF image into
the correct location in memory. At this point, we assume that
the image should be loaded at fixed address, not at a variable
address. */

old_fs = get_fs();
set_fs(get_ds());
; 再次扫描程序段描述表,映射其中的程序段到进程空间
for(i = 0, elf_ppnt = elf_phdata; i < elf_ex.e_phnum; i++, elf_ppnt++) {
int elf_prot = 0, elf_flags;
unsigned long vaddr;

if (elf_ppnt->p_type != PT_LOAD)
continue; 如果程序段不可加载

if (elf_ppnt->p_flags & PF_R) elf_prot |= PROT_READ;
if (elf_ppnt->p_flags & PF_W) elf_prot |= PROT_WRITE;
if (elf_ppnt->p_flags & PF_X) elf_prot |= PROT_EXEC;

elf_flags = MAP_PRIVATE|MAP_DENYWRITE|MAP_EXECUTABLE;
; 根据程序段描述设置相应的mmap参数

vaddr = elf_ppnt->p_vaddr; 段起始地址
if (elf_ex.e_type == ET_EXEC || load_addr_set) {
; 对于可执行程序,使用固定映射
elf_flags |= MAP_FIXED;
}

error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt, elf_prot, elf_flags);
; 将该程序段[eppnt->p_offset,eppnt->p_filesz]映射到虚存(load_bias+vaddr)开始的区域

if (!load_addr_set) {
load_addr_set = 1;
load_addr = (elf_ppnt->p_vaddr - elf_ppnt->p_offset);
; 求出该ELF文件在用户虚存中的起始地址
if (elf_ex.e_type == ET_DYN) {
load_bias += error -
ELF_PAGESTART(load_bias + vaddr);
load_addr += error;
}
}

k = elf_ppnt->p_vaddr;
if (k < start_code) start_code = k; 取最小的段地址作为代码段起始
if (start_data < k) start_data = k; 取最大的段地址作为数据段起始

k = elf_ppnt->p_vaddr + elf_ppnt->p_filesz; 这时k指向文件段尾

if (k > elf_bss)
elf_bss = k; 取最大文件段尾作为BSS段起始
if ((elf_ppnt->p_flags & PF_X) && end_code < k)
end_code = k; 取最大可执行的文件段尾作为可执行段的终止
if (end_data < k)
end_data = k; 取最大的文件段尾作为数据段的终止
k = elf_ppnt->p_vaddr + elf_ppnt->p_memsz; 这时k指向内存段尾
if (k > elf_brk)
elf_brk = k; 取最大的内存段尾作为BSS段的终止
}
set_fs(old_fs);
elf_entry += load_bias;
elf_bss += load_bias;
elf_brk += load_bias;
start_code += load_bias;
end_code += load_bias;
start_data += load_bias;
end_data += load_bias;

if (elf_interpreter) {
if (interpreter_type == INTERPRETER_AOUT)
elf_entry = load_aout_interp(&interp_ex,
interpreter);
else
elf_entry = load_elf_interp(&interp_elf_ex, 动态链接器的文件头
interpreter, 动态链接器打开的文件结构
&interp_load_addr); 输出链接器的加载地址
; 可执行程序的入口变为动态链接器的入口
allow_write_access(interpreter);
fput(interpreter);
kfree(elf_interpreter);

if (elf_entry == ~0UL) {
printk(KERN_ERR "Unable to load interpreter\n");
kfree(elf_phdata);
send_sig(SIGSEGV, current, 0);
return 0;
}
}

kfree(elf_phdata); 释放程序段表

if (interpreter_type != INTERPRETER_AOUT)
sys_close(elf_exec_fileno);

set_binfmt(&elf_format); 增加ELF内核模块的引用计数

compute_creds(bprm);
current->flags &= ~PF_FORKNOEXEC;
bprm->p = (unsigned long) 建立入口函数参数表
create_elf_tables((char *)bprm->p,
bprm->argc,
bprm->envc,
(interpreter_type == INTERPRETER_ELF ? &elf_ex : NULL),
load_addr, load_bias,
interp_load_addr,
(interpreter_type == INTERPRETER_AOUT ? 0 : 1));
/* N.B. passed_fileno might not be initialized? */
if (interpreter_type == INTERPRETER_AOUT)
current->mm->arg_start += strlen(passed_fileno) + 1;
current->mm->start_brk = current->mm->brk = elf_brk;
current->mm->end_code = end_code;
current->mm->start_code = start_code;
current->mm->start_data = start_data;
current->mm->end_data = end_data;
current->mm->start_stack = bprm->p;

/* Calling set_brk effectively mmaps the pages that we need
* for the bss and break sections
*/
set_brk(elf_bss, elf_brk); 建立bss的虚存映射,elf_bss是bss的开始,elf_brk是bss的结束

padzero(elf_bss); 如果bss不起始于页连界上,说明与data段有重叠,则将该页bss区域清0

#if 0
printk("(start_brk) %lx\n" , (long) current->mm->start_brk);
printk("(end_code) %lx\n" , (long) current->mm->end_code);
printk("(start_code) %lx\n" , (long) current->mm->start_code);
printk("(start_data) %lx\n" , (long) current->mm->start_data);
printk("(end_data) %lx\n" , (long) current->mm->end_data);
printk("(start_stack) %lx\n" , (long) current->mm->start_stack);
printk("(brk) %lx\n" , (long) current->mm->brk);
#endif

if ( current->personality == PER_SVR4 )
{
/* Why this, you ask??? Well SVr4 maps page 0 as read-only,
and some applications "depend" upon this behavior.
Since we do not have the power to recompile these, we
emulate the SVr4 behavior. Sigh. */
/* N.B. Shouldn't the size here be PAGE_SIZE?? */
down(&current->mm->mmap_sem);
error = do_mmap(NULL, 0, 4096, PROT_READ | PROT_EXEC,
MAP_FIXED | MAP_PRIVATE, 0);
up(&current->mm->mmap_sem);
}

#ifdef ELF_PLAT_INIT
/*
* The ABI may specify that certain registers be set up in special
* ways (on i386 %edx is the address of a T_FINI function, for
* example. This macro performs whatever initialization to
* the regs structure is required.
*/
ELF_PLAT_INIT(regs);
#endif
r /> start_thread(regs, elf_entry, bprm->p); 将返回的eip设为elf_entry,esp设为bprm->p
if (current->ptrace & PT_PTRACED)
send_sig(SIGTRAP, current, 0); 如果进程处于跟踪状态,则生成SIGTRAP信号
retval = 0;
out:
return retval;

/* error cleanup */
out_free_dentry:
allow_write_access(interpreter);
fput(interpreter);
out_free_interp:
if (elf_interpreter)
kfree(elf_interpreter);
out_free_file:
sys_close(elf_exec_fileno);
out_free_ph:
kfree(elf_phdata);
goto out;
}
static unsigned long load_elf_interp(struct elfhdr * interp_elf_ex,
struct file * interpreter,
unsigned long *interp_load_addr)
{
struct elf_phdr *elf_phdata;
struct elf_phdr *eppnt;
unsigned long load_addr = 0;
int load_addr_set = 0;
unsigned long last_bss = 0, elf_bss = 0;
unsigned long error = ~0UL;
int retval, i, size;

/* First of all, some simple consistency checks */
if (interp_elf_ex->e_type != ET_EXEC &&
interp_elf_ex->e_type != ET_DYN)
goto out;
if (!elf_check_arch(interp_elf_ex))
goto out;
if (!interpreter->f_op || !interpreter->f_op->mmap)
goto out;

/*
* If the size of this structure has changed, then punt, since
* we will be doing the wrong thing.
*/
if (interp_elf_ex->e_phentsize != sizeof(struct elf_phdr))
goto out;

/* Now read in all of the header information */

size = sizeof(struct elf_phdr) * interp_elf_ex->e_phnum;
if (size > ELF_MIN_ALIGN)
goto out; 如果动态链接器的程序段表的尺寸大于1个页面
elf_phdata = (struct elf_phdr *) kmalloc(size, GFP_KERNEL);
if (!elf_phdata)
goto out;

retval = kernel_read(interpreter,interp_elf_ex->e_phoff,(char *)elf_phdata,size);
error = retval;
if (retval < 0)
goto out_close;

eppnt = elf_phdata;
for (i=0; ie_phnum; i++, eppnt++) {
if (eppnt->p_type == PT_LOAD) {
int elf_type = MAP_PRIVATE | MAP_DENYWRITE;
int elf_prot = 0;
unsigned long vaddr = 0;
unsigned long k, map_addr;

if (eppnt->p_flags & PF_R) elf_prot = PROT_READ;
if (eppnt->p_flags & PF_W) elf_prot |= PROT_WRITE;
if (eppnt->p_flags & PF_X) elf_prot |= PROT_EXEC;
vaddr = eppnt->p_vaddr;
if (interp_elf_ex->e_type == ET_EXEC || load_addr_set)
elf_type |= MAP_FIXED;

map_addr = elf_map(interpreter, load_addr + vaddr, eppnt, elf_prot, elf_type);

if (!load_addr_set && interp_elf_ex->e_type == ET_DYN) {
load_addr = map_addr - ELF_PAGESTART(vaddr);
load_addr_set = 1;
}

/*
* Find the end of the file mapping for this phdr, and keep
* track of the largest address we see for this.
*/
k = load_addr + eppnt->p_vaddr + eppnt->p_filesz;
if (k > elf_bss)
elf_bss = k;

/*
* Do the same thing for the memory mapping - between
* elf_bss and last_bss is the bss section.
*/
k = load_addr + eppnt->p_memsz + eppnt->p_vaddr;
if (k > last_bss)
last_bss = k;
}
}

/* Now use mmap to map the library into memory. */

/*
* Now fill out the bss section. First pad the last page up
* to the page boundary, and then perform a mmap to make sure
* that there are zero-mapped pages up to and including the
* last bss page.
*/
padzero(elf_bss);
elf_bss = ELF_PAGESTART(elf_bss + ELF_MIN_ALIGN - 1); /* What we have mapped so far
*/

/* Map the last of the bss segment */
if (last_bss > elf_bss)
do_brk(elf_bss, last_bss - elf_bss);

*interp_load_addr = load_addr;
error = ((unsigned long) interp_elf_ex->e_entry) + load_addr;

out_close:
kfree(elf_phdata);
out:
return error;
}
static inline unsigned long
elf_map (struct file *filep, unsigned long addr, struct elf_phdr *eppnt, int prot, int
type)
{
unsigned long map_addr;

down(&current->mm->mmap_sem);
map_addr = do_mmap(filep, ELF_PAGESTART(addr),
eppnt->p_filesz + ELF_PAGEOFFSET(eppnt->p_vaddr), prot, type,
eppnt->p_offset - ELF_PAGEOFFSET(eppnt->p_vaddr));

up(&current->mm->mmap_sem);
return(map_addr);
}
void set_binfmt(struct linux_binfmt *new)
{
struct linux_binfmt *old = current->binfmt;
if (new && new->module)
__MOD_INC_USE_COUNT(new->module);
current->binfmt = new;
if (old && old->module)
__MOD_DEC_USE_COUNT(old->module);
}
static void set_brk(unsigned long start, unsigned long end)
{
start = ELF_PAGEALIGN(start);
end = ELF_PAGEALIGN(end);
if (end <= start)
return;
do_brk(start, end - start);
}
static void padzero(unsigned long elf_bss)
{
unsigned long nbyte;

nbyte = ELF_PAGEOFFSET(elf_bss);
if (nbyte) {
nbyte = ELF_MIN_ALIGN - nbyte;
clear_user((void *) elf_bss, nbyte);
}
}

2005年5月17日星期二

我的工作,共勉之


水木回来了

偶尔在山西大学bbs看到了,结果到www.newsmth.org, 果然水木又重新建立起来了,不过估计是地下自己搞得,要不然不知道为什么不用以前的那个域名了,还好,以前的账户还可以登陆,不过需要重新激活,哎,又能上水木就应该很庆幸了,不管喽,灌水去!

今天新建立了一个blog

嘿嘿,今天弄了个英文版本的,其实一开始就想把这个现在这个blog弄成英文的,还是慢慢的变成母语了,去年弄了个wallop邀请,今天突然想起来了,所以把以前的垃圾删除,开张!练练我那该死的英语

2005年5月16日星期一

最想听却又不敢听的一首歌曲

http://www.flash77.com/flashplay/flash77_4897.htm

张学友的《心如刀割

张学友:心如刀割

我的天是灰色
我的心是蓝色
触摸着你的心
竟是透明的

你的悠然自得
我却束手无策
我的心痛竟是你的快乐

其实我不想对你恋恋不舍
但什么让我辗转反侧
不觉我说着说着天就亮了
我的唇角尝到一种苦涩

我是真的为你哭了
你是真的随他走了
就在这一刻
全世界伤心角色又多了我一个
我是真的为你爱了
你是真的跟他走了
能给的我全都给了我都舍得
除了让你知道我心如刀割

2005年5月7日星期六

这句名言出自谁口中?

看了,还不错,转过来


在一所著名大学里的历史课上,教授正在向来自各国的同学提问:“要生存还是要灭亡。这句名言出自谁的口中?”
  
     沉寂了半天之后,古田站起来说:“威廉·莎士比亚。”
  
    “很好,被誉为‘欧洲的良心’是指谁?”
  
    “罗曼·罗兰。”
  
    “完全正确,同学们,刚才回答问题的是位日本学生,可是作为欧洲国家的学生却答不出来,太遗憾了!”教授不无感慨的说道。
  
    “干死小日本!”突然有人发出一声喊叫。
  
    “谁!谁说的!”教授气得语音都颤抖了。
 ?br>    “杜鲁门说的。”约翰站了起来。
  
    “你以为自己在干什么?”教授生气的说道。
  
    “麦当娜说的。”杰克也站了起来。
  
    “这真叫人恶心,简直无法无天了。”教授浑身气得发抖。
  
    “乔治·布什说的。”斯蒂芬也坐不住了。
  
    课堂立刻陷入了混乱之中,所有的学生都开始议论纷纷,一些学生开始起哄:“耶!真***够劲。”
  
    “克林顿对莱温斯基说的。”玛丽毫无表情的接话道。
  
    教授愤怒得说不出话来,隔了一会,他大踏步的向门外走去,到门口时,他冷冷的看了所有人一眼:“我会回来的。”
  
    “阿诺德·施瓦辛格说的。”鲍勃终于插上话了。
  
    古田委屈的一摊手:“我没做什么坏事,为什么会这样?”
  
    “张国荣说的。”李小丽一脸崇拜的神情回答
  
    所有的学生都围成一个圈,汤姆有些垂头丧气:“该死,我们完了。”
  
    “希特勒说的。”伊汉诺娃立刻回答。
  
    赖特叹了口气:“今天将是一个很有意义的日子。”
  
    “本·拉登说的。”克瑞斯终于为自己能说出一个名字而得意。
  
    “这决非是我最得意的一天。”古田惭愧的说着。
  
    “托尼·布莱尔说的。”已经不知道谁在回答。
  
    这时校长和教授一起进来了,他脸色铁青,几乎是一字一顿的说道:“你们要为此付出代价!”
  
    “斯大林说的。”全班同学异口同声的回答

魅力城市视频

我的家乡,山西省长治市,被评为了全国10大魅力城市之一,这里有几个视频,请大家欣赏

My hometown, Chang Zhi ,Shan Xi province ,was appraised tobe one of the 10 most attractive cities in China ,here are some videos about my hometown:

中文版本 In Chinese
http://218.26.240.48/spdb/ZT/zgczhy.rm

中国魅力城市-长治(德语版) In German
http://218.26.240.48/spdb/ZT/sx_041130115528_sxpd.rm

中国魅力城市-长治(英语版) In English
http://218.26.240.48/spdb/ZT/sx_041130115342_sxpd.rm