最想听却又不敢听的一首歌曲
时间:May.16, 2005 | 分类: 未分类
http://www.flash77.com/flashplay/flash77_4897.htm
张学友的《心如刀割》
张学友:心如刀割
我的天是灰色
我的心是蓝色
触摸着你的心
竟是透明的
你的悠然自得
我却束手无策
我的心痛竟是你的快乐
其实我不想对你恋恋不舍
但什么让我辗转反侧
不觉我说着说着天就亮了
我的唇角尝到一种苦涩
我是真的为你哭了
你是真的随他走了
就在这一刻
全世界伤心角色又多了我一个
我是真的为你爱了
你是真的跟他走了
能给的我全都给了我都舍得
除了让你知道我心如刀割
这句名言出自谁口中?
时间:May.07, 2005 | 分类: 未分类
看了,还不错,转过来
在一所著名大学里的历史课上,教授正在向来自各国的同学提问:“要生存还是要灭亡。这句名言出自谁的口中?”
沉寂了半天之后,古田站起来说:“威廉·莎士比亚。”
“很好,被誉为‘欧洲的良心’是指谁?”
“罗曼·罗兰。”
“完全正确,同学们,刚才回答问题的是位日本学生,可是作为欧洲国家的学生却答不出来,太遗憾了!”教授不无感慨的说道。
“干死小日本!”突然有人发出一声喊叫。
“谁!谁说的!”教授气得语音都颤抖了。
?br> “杜鲁门说的。”约翰站了起来。
“你以为自己在干什么?”教授生气的说道。
“麦当娜说的。”杰克也站了起来。
“这真叫人恶心,简直无法无天了。”教授浑身气得发抖。
“乔治·布什说的。”斯蒂芬也坐不住了。
课堂立刻陷入了混乱之中,所有的学生都开始议论纷纷,一些学生开始起哄:“耶!真***够劲。”
“克林顿对莱温斯基说的。”玛丽毫无表情的接话道。
教授愤怒得说不出话来,隔了一会,他大踏步的向门外走去,到门口时,他冷冷的看了所有人一眼:“我会回来的。”
“阿诺德·施瓦辛格说的。”鲍勃终于插上话了。
古田委屈的一摊手:“我没做什么坏事,为什么会这样?”
“张国荣说的。”李小丽一脸崇拜的神情回答
所有的学生都围成一个圈,汤姆有些垂头丧气:“该死,我们完了。”
“希特勒说的。”伊汉诺娃立刻回答。
赖特叹了口气:“今天将是一个很有意义的日子。”
“本·拉登说的。”克瑞斯终于为自己能说出一个名字而得意。
“这决非是我最得意的一天。”古田惭愧的说着。
“托尼·布莱尔说的。”已经不知道谁在回答。
这时校长和教授一起进来了,他脸色铁青,几乎是一字一顿的说道:“你们要为此付出代价!”
“斯大林说的。”全班同学异口同声的回答
魅力城市视频
时间:May.07, 2005 | 分类: 未分类
我的家乡,山西省长治市,被评为了全国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
head.s 分析[原创]
时间:Apr.28, 2005 | 分类: 未分类
2005-04-28 BY:LinuxRen
head.s就运行在32位保护模式下面了,这里是名副其实的内核了
GNU 的汇编直接数,比如 0×10,如果前面有$,即$0×10,则表示立即数,在16位实模式下,内存地址由段基地址左移四位加上段内偏移量组成,而在保护模式下,由段选择子 (逻辑地址的高16位 )(由段选择子选择的描述符所决定的段基地址不需要左移,直接加偏移地址就可以形成线性地址)和段内偏移量(逻辑地址的低16位)组成,这里是内存管理中 的段式管理,还有页式管理(以后再说),这里有张图片可以很好地说明段式管理:
如果仅仅是0×10,则表示内存的地址。
这张图片好像有个小问题,右上角的偏移量应该是32位的,这里很容易给人错觉好像偏移量就是逻辑地址的低16位,段选择子时逻辑地址的高16位,可以从intel的手册得到证实 其中的图5-2,呵呵,intel应该不会犯错吧
为什么既有段式内存管理,也有页式内存管理,我想大概是cpu设计的原因,如果cpu加电直接就可以进入32位,那么段式管理就应该报废了。也不知道现在的64位的cpu是怎么处理的,现在64微处理器的资料实在太少了。
head.s 第18行,movl $0×10, %eax 之后eax就相当于段选择子,与gdt表的地址进行运算,就可以定为一个全局描述符,在全局表述符中会给出对应段的段基址,再加上已知的段内 偏移量,就可以将一个逻辑地址转为一个线性地址,这里的0×10仅仅是段选择子。
然后call setup_idt, setup_idt代码在79行,就是将idt中的每一项都设置为指向同一个中断门ignore_int,即打印一段信息“Unknown interrupt”
在这里说一下idt,idt就是中断描述符表,和全剧描述符表是一个等级的,相应的中断描述符表项和全局描述符表项是对应的,中断门ignore_int是和全局描述符表项所表述的段一个等级的,只不过这里的不是一个段,而可以是一段代码,这样就应该容易理解了吧。
接 着call setup_gdt,gdt在前面已经临时设置过了,在这里要重新设置.这里将gdt还是设置成为含有256个全局描述符表项,第0个不用,第一个系统代 码段,第二个系统数据段,值分别是 0×00c09a0000000fff 0×00c09020000000fff,可以对照着张表来看看具体的意思:
这里将系统代码段和系统数据段的段长都设置成为了16M.
后面的252项都填充0,用于以后用户程序使用。
接下来就是检查数学协处理器,还有什么287/387,没看,跳过。
然后就是开启分页管理
这里的分页机制是专门为内核使用的,也就是说以后的应用程序并不适用这里的页表,而是在程序执行的时候自己自动加载自己的页表。
这里的分页比较简单,经过分页之后的物理地址是和分页前的线性地址相同的,这一点是非常重要的。因为在分页启动之前有一句话: pushl $_main
这里是将main函数的地址压栈,当分页启动之后要讲这个地址pop出来,并且跳到main去执行,系统就会跳到以前压入栈的main的地址经过分页映射后的地址去运行,如果物理地址和线性地址不一样的话,那么就会跳到错误的地方,但是这里不会。
[原创]setup.s分析
时间:Apr.28, 2005 | 分类: 未分类
setup.s会将被bootsect.s读取到0×10000处的system模块移动到0×00000处,这样好象会把中断表给覆盖掉,文件执行到后来会加载中断描述符表,但是idt表却是这个样子的:
idt_48:
.word 0
.word 0,0
idt表的基地址居然还是0×00000,这里就搞不懂了,因为这个时候0×00000的地方已经是system模块了,所以在真正的重新设置idt表以前,如果出现异常,我不知道系统将会进行什么样的处理,这里是问题一
setup.s会读取大量的参数然后存到0×90000处,也就是说会覆盖bootsect.s,具体的参数分布书上44页有,这里有个问题是,系统会将 第一个硬盘的参数表读到0×90080处,然后再读取第二个硬盘的参数表到0×90090处,然后再去检测到底有没有第二个硬盘,如果没有再将 0×90090处的参数表清0,怪了,为什么不先检测有没有第二个硬盘,在去决定是否读取参数表到0×90090呢?非要反着来不成?
下面是我对保护模式的一点理解,不知是否正确,有错误欢迎提出:
在16位的实模式下的程序在内存中的布局和操作系统的是混在一起的,也就是说,cpu没有提供对操作系统的保护,这会出很多问题,32为保护模式下, cpu提供的很强大的功能来保护操作系统的代码不被侵犯,我们所要做的就是提供相应的数据,将相应的寄存器初始化,打开A20地址线,然后执行一个跳转指 令,cpu就会进入保护模式,对我们的程序进行保护,具体的各位可以在网上找到资料,其中一个方法就是设置gdt以及ldt来保护操作系统以及应用程序, gdt(大小限制在64k以内)也即全局描述符表里包含有全局描述符,每个全局描述符得大小为8字节,所以理论上,一个gdt一共可以有64K/8=8K 个全局描述符.其中三个是描述全局性的操作系统的代码段,数据段,其他的一个程序占用一个全局描述符.
系统怎么来确定要使用哪一个全局描述符呢?使用段选择子!这里是他的结构:
其中3-15字节是用来索引gdt来去定某一个全局描述符得,共13位,所以gdt最大长度限制在2^13=64K.但是不知道为什么在这里Linus只将gdt的长度设置为了2K,也就是为什么在
gdt_48:
.word 0×800 !这里为什么是0×800,而不是0xFFFF,难道就是因为现在的gdt是临时的,以后还有设置,所以只要够现在用就可以了??
.word 512+gdt,0×9 ! 这里由于setup.s是在0×90200处,所以要加上0×200(512)的偏移量。
然后就是为系统进入32为保护模式作准备了,这里就要先初始化gdt,由于现在还没有程序运行,所以只是用了三项(其实是两项),其中,第零项没有使用,第一项描述系统的代码段,第二项描述系统的数据段(堆栈段)。
全局表述符表:
gdt:
.word 0×0000 !第0个弃用
.word 0×0000
.word 0×0000
.word 0×0000
.word 0×07FF !第1个,第0个用了4个word,所以这里偏移量是0×08
.word 0×0000 !用来描述系统代码段
.word 0×9A00
.word 0×00C0
.word 0×07FF !第2个,偏移量是0×10,也就是16
.word 0×0000 !用来描述系统数据段
.word 0×9200
.word 0×00C0
这里是gdt的结构

这是,进入保护模式所要准备的数据已经够了,接下来就是加载gdt的基地址以及大小限制到专用寄存器gdtr,idt基地址以及大小限制到idtr,然后打开A20数据线,关于A20数据线,哈工大纯c板块上有很好的文章介绍,然后重新对8259进行编程(看见头大,没怎么看),设置状态字,然后执行
jmpi 0,8 !这里的8就是上面的段选择子的值,化为二进制为 0000,0000,0000,1000 这里的1就是第1个全局描述符,即系统代码段,就会去执行head.s
最好对这个时候内核内存布局有个印象,便于以后的理解
——————-
数据段表述符
——————-
代码段描述符
——————-
——————-0X90200
硬件参数
——————-0X90000
head.s程序
——————–0X00000
[原创]内核引导启动程序分析
时间:Apr.28, 2005 | 分类: 未分类
主要参考用书:《linux内核完全分析》
由于比较简单,所以先把bootsect.s看了一下,其实整个内核引导程序有三个,分别是bootsect.s,setup.s,head.s ,前两个都不属于严格意义上的kernel,只不过是对kernel的启动做一些准备,真正的内核是从head.s启动的,现在先分析 bootsect.s:
当你按机箱上的power on的时候,cup会自动去到bios中地址0xFFFF0处开始执行bios中的代码,除了会进行一些初始化工作,这段代码最主要的是将可启动设备的第 一个扇区(bootsect.s)(引导扇区,512字节)读到内存0×07c00处。
当bootsect.s执行时,它已经被读到了0×07c00处,首先它会将自己读到0×90000处,为什么要先读到0×7c00,再读到 0×90000,是由于bios被设置成了先读到0×7c00的地方,再度到0×90000是为了防止后来读入到0×10000处的system模块覆盖 掉bootsect.s。将自己读到0×90000处后先会设置一下堆栈(0×9000:0xff00),然后将setup.s读入到紧接着 bootsect的地方(0×90200),默认的是从软盘读取的(硬盘在当时估计是奢侈品),然后就是取相应磁盘(被当作软盘,写成了hard code)的参数,然后就是利用bios的0×10中断,ah=0×03,将一段话”Loading system…”打印到屏幕上。然后检测要使用哪个根文件系统设备(软盘或者硬盘),具体的方法是判断508,509字节处的根设备号是否被置为1.
问题一.508,509是什么时候设置的?
如果有硬盘的话,就将其保存,否则读取每磁道的扇区数来判断是什么类型的软盘(1.2M还是1.4M),也保存。
问题二.这里硬盘参数ROOT_DEV=0×306,意思是第二个硬盘的第一个分区,为什么是第二个硬盘?
问题三.在这之前的代码都是软盘启动的,是不是就是说,不管你有没有硬盘,都必须从软盘启动,如果不修改bootsect的代码的话
最后执行 jmpi 0,SETUPSEG,跳转到setup.s程序的开始处执行。

今天新买了个域名
时间:Apr.20, 2005 | 分类: 未分类
LinuxRen.Org,58块钱,现在就有两个域名了,我对.net的注册商彻底失望了,打算快到期的时候转注册商,LinuxRen.Org的解析到首页上,LinuxRen.Net直接解析到论坛上面,这样也方便一些,与空间在一个地方买的,兄弟给推荐的人,哈哈,没有这个贱人我都不知道该怎么弄了,网站就打算先这样办下去,慢慢人估计会多起来的,关键要有自己的特点,由于自己水平不高,所以还是在网上招聘版主,嗯,大家一起努力~~~~~~~~~
BIOS和DOS建立的中断向量表
时间:Apr.19, 2005 | 分类: 未分类
| 绝对地址 | 16进制 | 10进制 | 有关内容 |
| 00H | 0H | 0 | 0做除数时处理器发出的中断 溢出条件是:
除法类型 结果 |
| 04H | 1H | 1 | 单步调试时处理器发出的中断 |
| 08H | 2H | 2 | 非屏蔽中断 |
| 0CH | 3H | 3 | 调试程序设置断点时处理器发出的中断 |
| 10H | 4H | 4 | 发生算术溢出时处理器发出的中断 |
| 14H | 5H | 5 | 调用BIOS的屏幕拷贝操作 |
| 18-1FH | 6-7H | 6-7 | 保留单元 |
| 20H | 8H | 8 | 每1/18.2秒定时器发出的中断 |
| 24H | 9H | 9 | 按压或释放键时产生的中断 |
| 28H | 0AH | 10 | 保留单元 |
| 2CH | 0BH | 11 | 通讯设备使用的硬件中断 |
| 30H | 0CH | 12 | 通讯设备使用的硬件中断 |
| 34H | 0DH | 13 | 交替打印时硬件产生的中断 |
| 38H | 0EH | 14 | 软驱操作结束时产生的硬件中断 |
| 3CH | 0FH | 15 | 打印机发出警告信号时产生的硬件中断 |
| 40H | 10H | 16 | BIOS的显示I/O功能调用 |
| 44H | 11H | 17 | BIOS设备确认调用 |
| 48H | 12H | 18 | BIOS确认内存空间大小的功能调用 |
| 4CH | 13H | 19 | BOIS的磁盘I/O功能调用 |
| 50H | 14H | 20 | BIOS的RS-232串行I/O功能调用 |
| 54H | 15H | 21 | 在PC和XT机上是BIOS磁带I/O功能调用。在AT机上是AT扩充服务功能调用。 |
| 58H | 16H | 22 | BIOS的键盘I/O功能调用 |
| 5CH | 17H | 23 | BIOS的打印机I/O功能调用 |
| 60H | 18H | 24 | ROM的BASIC解释和程序功能调用 |
| 64H | 19H | 25 | BIOS的装载引导服务调用 |
| 68H | 1AH | 26 | BIOS的日期时钟功能调用 |
| 6CH | 1BH | 27 | Ctrl+Break处理程序功能调用。当键入Ctrl+Break键时指向可执行的程序入口初 始化BIOS使该向量指向一条TRET指令。用户可修改该向量,使它指向自己的程序。 |
| 70H | 1CH | 28 | 指向每1/18.2秒时可执行的服务程序的入口。初始化时该向量指向一条IRET指令。用户可修 改该向量,使它指向自己的Ctrl+Break 处理程序。 |
| 74H | 1DH | 29 | 指向显示控制器初始化参数。BIOS使这个向量指向ROM驻留表。 |
| 78H | 1EH | 30 | 指向软盘参数表。BIOS使这个向量指向ROM 驻留表,但是DOS把它改为指向DOS的RAM 驻留表。 |
| 7CH | 1FH | 31 | 指向一点阵表。在这个表中,BIOS可以找到字符集后128个字符的点阵 |
| 80H | 20H | 32 | 终止程序的DOS功能调用 |
| 84H | 21H | 33 | 任何种DOS功能调用 |
| 88H | 22H | 34 | 指向DOS的结束地址 |
| 8CH | 23H | 35 | 指向D OS的Ctrl+Break处理程序 |
| 90H | 24H | 36 | 指向DOS的严重错误处理程序 |
| 94H | 25H | 37 | DOS绝对磁盘读调用 |
| 98H | 26H | 38 | DOS绝对磁盘写调用 |
| 9CH | 27H | 39 | 程序终止,但仍驻留内存的DOS功能调用 |
| 9DH | 28H | 40 | DOS空闲 |
| 9EH | 29H | 41 | 支持驱动器程序输出 |
| 9FH-A1H | 2AH-2CH | 42-44 | 保留单元 |
| A2H | 2DH | 45 | DOS构件接口 |
| A3H | 2EH | 46 | COMMAND.COM退回入口 |
| A4H | 2FH | 47 | 多路中断(空闲信号) |
| A5-FFH | 30-3FH | 48-63 | 为DOS保留的单元 |
| 100H | 40H | 64 | 保留单元 |
| 104H | 41H | 65 | 指向硬盘0的参数表,BOIS使这个向量指向ROM驻留的表。 |
| 108-10FH | 42-43H | 66-67 | 保留单元 |
| 110H | 44H | 68 | PC机使用,用于指向低分辩率图形字符参数表 |
| 114H | 45H | 69 | 保留单元 |
| 118H | 46H | 70 | 指向硬盘1的参数表,BIOS使这个向量指向 ROM驻留的表。 |
| 11CH | 47H | 71 | 保留单元 |
| 120H | 48H | 72 | PC机使用,用于把PC机的键盘代码变换为标准的键盘代码。 |
| 124H | 49H | 73 | 指向键盘增强服务变换表 |
| 128-17FH | 4A-5FH | 74-95 | 保留单元 |
| 180-19FH | 60-67H | 96-103 | 为用户程序保留的单元 |
| 1A0-1BFH | 68-6FH | 104-111 | 未使用 |
| 1C0H | 70H | 112 | 硬件中断(IRQ–interrupt request) 8–实时时钟中断 |
| 1C4H | 71H | 113 | 硬件中断9 |
| 1C8H | 72H | 114 | 硬件中断10 |
| 1CCH | 73H | 115 | 硬件中断11 |
| 1D0H | 74H | 116 | 硬件中断12 |
| 1D4H | 75H | 117 | 硬件中断13–BIOS把这个中断向量重定向为非屏蔽中断(NMI) |
| 1D8H | 76H | 118 | 硬件中断14 |
| 1DCH | 77H | 119 | 硬件中断15 |
| 1E0-1FFH | 78-7FH | 120-127 | 未使用 |
| 200-217H | 80-85H | 128-133 | 为BASIC保留 |
| 218-3C3H | 86-F0H | 134-240 | BASIC程序运行时提供给BASIC解释程序作用 |
| 3C4-#FFH | F1-FFH | 241-255 | 未作用 |
有一种爱叫痛 有一种爱叫放手
时间:Apr.15, 2005 | 分类: 未分类
有一种爱很凄迷,有一种爱只能远望,有一种爱注定成传奇…….
有一种爱叫做痛,痛得心脏起了褶子,痛得头脑空洞无物,痛得意志麻木萧瑟……
有一种爱叫放弃,明知道许多事情是没有答案的,却想寻找一个答案,真的好累……
有一种爱叫忍让,忍让也是一种爱,以爱的方式善待对方的缺陷,用包容的胸怀宽恕自己的爱人,给他一个悔悟的机会留一个自省的空间于平平淡淡中演绎经典,在无声无语中融洽恩爱.这样即使是不传奇的爱情也将变得永恒,再平淡的婚姻,依然一如既往令人留连.
有一种爱,叫放手.曾经天真的以为不管时间和空间的距离有多长多远,感情一定会恒久不变,因为爱是没有理由的……
爱不能成为牵绊,所以要选择放手,从容的让彼此走彼此的世界,凡事到极至,伤也会痛.其实爱过就会懂,彼此个性的太过坚强终究会是一起生活的阴影。
昨日的幸福以成为一种痕迹,两人能携手走完整人生固然很好,可陪上了一段也应心存感激了.
爱一个人不是要成为所爱人的牵绊,只要心中有爱,生活总是那么美好!
相距是一种缘,相识,相恋更是一种缘分,缘起而聚,缘尽而散,放手才是真爱.有一种爱叫放手!
有一种爱,叫离开,曾经以为自己的爱情能够长久,曾经以为真心的付出就能换来幸福,其实错了……
爱情给的唯一的东西就是背叛,无情的背叛!曾经是那么相爱的两个人,转眼陌路,留下的是残缺不全的记忆和心痛.
没有想到结局会是这样,曾经的山盟海誓,曾经的天长地久,转眼都成了飞灰。
经常惊醒于午夜梦回的黑暗中,我的心都好痛,我思念一个人的疼痛,看着空中的星星,想着远方属于你的夜,你还好吗?一直都快乐吗?没有我在你身边是不是有另外一个人去关心你,爱你呢?
我现在唯一的愿望只是希望再见你一面,但我又怕见你,怕见到你,我的心又会再一次的被捏碎.我只有对自己说不要再去想他,不要再想了,虽然他的影子从未离开过。
生活还是要过的,其实有种爱叫离开,再见了,我的爱人……
有一种爱,我们不能称之为爱情,虽然有同样的心动,同样的怀想,同样乍然相见的喜悦,依依不舍的眷恋,但世间总有一种约束,让心思沉静,让感情不再漂泊,依然可以在午夜梦回事心生柔情,依然可以相信自己的完美与可爱,在这些温柔的情愫里。
有一种爱,可以默默的爱,默默的理解,默默的在心里装满祝福,挥一挥手,让春草缠绵,落江成阵,就是有这样的感情啊!飘荡成缠绵而温暖的空气,就是在这样 无心的眷恋里,我们认识自己也认识世间,就是有这样无缘而有情的瞬间,让我们轻轻的叹息,深深的爱,虽然我们相爱,但不能称之为爱情,多想让爱发出声响 啊!可那是一种毁灭,善良绝对不允许这样,多想让爱明白啊!可怎么人心看着爱有为难,感情也不能饶恕爱的胡来。
就这样默默的去爱,永远放在心头来爱;当风吹来的时候,就让湖水激动地涌出堤岸,一点点就已经足够了,就象喝第一口茶水,才能品出味道.只要轻盈的湖水永远不下沉,只要坚固的堤岸永远拦得住湖水,相信湖水总是会泛出激情,堤岸也总是能感到坚强。
有一种爱,永远难以启齿,可这种爱情来得持久,来得绝美……