Tristan

head.s 分析[原创]

2005-04-28 BY:LinuxRenhead.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个不用,第一个系统代 码段,第二个系统数据段,值分别是 0x00c09a0000000fff 0x00c09020000000fff,可以对照着张表来看看具体的意思: 这里将系统代码段和系统数据段的段长都设置成为了16M. 后面的252项都填充0,用于以后用户程序使用。 接下来就是检查数学协处理器,还有什么287/387,没看,跳过。 然后就是开启分页管理 这里的分页机制是专门为内核使用的,也就是说以后的应用程序并不适用这里的页表,而是在程序执行的时候自己自动加载自己的页表。 这里的分页比较简单,经过分页之后的物理地址是和分页前的线性地址相同的,这一点是非常重要的。因为在分页启动之前有一句话: pushl $_main这里是将main函数的地址压栈,当分页启动之后要讲这个地址pop出来,并且跳到main去执行,系统就会跳到以前压入栈的main的地址经过分页映射后的地址去运行,如果物理地址和线性地址不一样的话,那么就会跳到错误的地方,但是这里不会。

[原创]setup.s分析

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 0x07FF !第1个,第0个用了4个word,所以这里偏移量是0×08 .word [...]

[原创]内核引导启动程序分析

主要参考用书:《linux内核完全分析》由于比较简单,所以先把bootsect.s看了一下,其实整个内核引导程序有三个,分别是bootsect.s,setup.s,head.s ,前两个都不属于严格意义上的kernel,只不过是对kernel的启动做一些准备,真正的内核是从head.s启动的,现在先分析 bootsect.s: 当你按机箱上的power on的时候,cup会自动去到bios中地址0xFFFF0处开始执行bios中的代码,除了会进行一些初始化工作,这段代码最主要的是将可启动设备的第 一个扇区(bootsect.s)(引导扇区,512字节)读到内存0x07c00处。 当bootsect.s执行时,它已经被读到了0x07c00处,首先它会将自己读到0×90000处,为什么要先读到0x7c00,再读到 0×90000,是由于bios被设置成了先读到0x7c00的地方,再度到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程序的开始处执行。

今天新买了个域名

LinuxRen.Org,58块钱,现在就有两个域名了,我对.net的注册商彻底失望了,打算快到期的时候转注册商,LinuxRen.Org的解析到首页上,LinuxRen.Net直接解析到论坛上面,这样也方便一些,与空间在一个地方买的,兄弟给推荐的人,哈哈,没有这个贱人我都不知道该怎么弄了,网站就打算先这样办下去,慢慢人估计会多起来的,关键要有自己的特点,由于自己水平不高,所以还是在网上招聘版主,嗯,大家一起努力~~~~~~~~~

BIOS和DOS建立的中断向量表

绝对地址 16进制 10进制 有关内容 00H 0H 0 0做除数时处理器发出的中断 溢出条件是: 除法类型 结果———————————有符号字 +127有符号双字 +32767无符号字 | >255无符号双字 | >65535———————————DOS设有INT 00H处理程序,系统将显示”Divide Overflo”,结束当前程序的执行。 04H 1H 1 单步调试时处理器发出的中断 08H 2H 2 非屏蔽中断 0CH 3H 3 调试程序设置断点时处理器发出的中断 10H 4H 4 发生算术溢出时处理器发出的中断 14H 5H 5 调用BIOS的屏幕拷贝操作 18-1FH [...]

有一种爱叫痛 有一种爱叫放手

有一种爱很凄迷,有一种爱只能远望,有一种爱注定成传奇……. 有一种爱叫做痛,痛得心脏起了褶子,痛得头脑空洞无物,痛得意志麻木萧瑟…… 有一种爱叫放弃,明知道许多事情是没有答案的,却想寻找一个答案,真的好累…… 有一种爱叫忍让,忍让也是一种爱,以爱的方式善待对方的缺陷,用包容的胸怀宽恕自己的爱人,给他一个悔悟的机会留一个自省的空间于平平淡淡中演绎经典,在无声无语中融洽恩爱.这样即使是不传奇的爱情也将变得永恒,再平淡的婚姻,依然一如既往令人留连.有一种爱,叫放手.曾经天真的以为不管时间和空间的距离有多长多远,感情一定会恒久不变,因为爱是没有理由的…… 爱不能成为牵绊,所以要选择放手,从容的让彼此走彼此的世界,凡事到极至,伤也会痛.其实爱过就会懂,彼此个性的太过坚强终究会是一起生活的阴影。 昨日的幸福以成为一种痕迹,两人能携手走完整人生固然很好,可陪上了一段也应心存感激了. 爱一个人不是要成为所爱人的牵绊,只要心中有爱,生活总是那么美好! 相距是一种缘,相识,相恋更是一种缘分,缘起而聚,缘尽而散,放手才是真爱.有一种爱叫放手! 有一种爱,叫离开,曾经以为自己的爱情能够长久,曾经以为真心的付出就能换来幸福,其实错了…… 爱情给的唯一的东西就是背叛,无情的背叛!曾经是那么相爱的两个人,转眼陌路,留下的是残缺不全的记忆和心痛. 没有想到结局会是这样,曾经的山盟海誓,曾经的天长地久,转眼都成了飞灰。 经常惊醒于午夜梦回的黑暗中,我的心都好痛,我思念一个人的疼痛,看着空中的星星,想着远方属于你的夜,你还好吗?一直都快乐吗?没有我在你身边是不是有另外一个人去关心你,爱你呢? 我现在唯一的愿望只是希望再见你一面,但我又怕见你,怕见到你,我的心又会再一次的被捏碎.我只有对自己说不要再去想他,不要再想了,虽然他的影子从未离开过。 生活还是要过的,其实有种爱叫离开,再见了,我的爱人…… 有一种爱,我们不能称之为爱情,虽然有同样的心动,同样的怀想,同样乍然相见的喜悦,依依不舍的眷恋,但世间总有一种约束,让心思沉静,让感情不再漂泊,依然可以在午夜梦回事心生柔情,依然可以相信自己的完美与可爱,在这些温柔的情愫里。  有一种爱,可以默默的爱,默默的理解,默默的在心里装满祝福,挥一挥手,让春草缠绵,落江成阵,就是有这样的感情啊!飘荡成缠绵而温暖的空气,就是在这样 无心的眷恋里,我们认识自己也认识世间,就是有这样无缘而有情的瞬间,让我们轻轻的叹息,深深的爱,虽然我们相爱,但不能称之为爱情,多想让爱发出声响 啊!可那是一种毁灭,善良绝对不允许这样,多想让爱明白啊!可怎么人心看着爱有为难,感情也不能饶恕爱的胡来。 就这样默默的去爱,永远放在心头来爱;当风吹来的时候,就让湖水激动地涌出堤岸,一点点就已经足够了,就象喝第一口茶水,才能品出味道.只要轻盈的湖水永远不下沉,只要坚固的堤岸永远拦得住湖水,相信湖水总是会泛出激情,堤岸也总是能感到坚强。 有一种爱,永远难以启齿,可这种爱情来得持久,来得绝美……

第一次见老头

昨晚第一次见公司的CEO,给我们这些新进来的人开了个会,美籍华人,好像生于湖南,挺牛气的,自我介绍就说SQL框架是由他带队设计开发的,厉害!当年的IBM全球副总裁,普林斯顿大学博士毕业, 是美国电脑界声望最高、职务最高的华人 。想当初公司刚刚成立的时候就是靠的他的个人魅力吸引来了一大帮的牛人,短短1年半已经很有名气了,真得不容易。然后就是一些慷慨激昂的话,归根结底就是让我们这些人工作再苦一些,再累一些…听到最后都不耐烦了,和小学时候听校长报告一样,没啥区别,一个字:累! 在网上找的一些资料: *刘英武1941年出生于湖南长沙1965年获台湾大学电机学士学位。1969年获美国普林斯顿大学电机学和计算机学博士学位。职业:1955年至今:威科公司(Walket Interactive Systems)董事长、总裁和首席执行官1993——1995年:凯登斯(Cadence Design Systems)首席执行官1989——1992年:宏基关系企业决经理与宏基北美洲和欧洲总公司董事长和首席执行官1969——1989年:IBM公司(以下摘要)应用软件事业部总经理办公室系统副总裁公司管理委员会秘书长通讯软件部主任电脑研究部经理兼任:加州影片委员会委员cadence、Triden、ASE三家公司董事

空间开通了

今天网站正式开通,放了个discuz的论坛,还不错,速度比较块,不过 刚才死活访问不到,估计又是域名解析速度慢,没办法,当时贪图小便宜找了一家小的网站注册,没想到速度 chaooooooooooooooooooooooooooooooooooooooooooooooo级慢,有时候还会报说找不到域名, kao~~~~~~~~~~~~~~~

想看的一些书

没有时间看,不过还是列出来,现在最希望的就是有那么一大段时间,用来看看书。按优先级列出来,不过是并行处理: 《LINUX内核完全注释》这个赵郡是在太牛了,给我们这些浮躁的小青年们树立的一个极好的榜样,想学知识,首先心态要端正,http://www.oldlinux.org/ 作者的网站,很不错,有什么问题可以亲自询问赵老师,保证教到你完全明白为止。这本书也是我毕业设计要啃的书。目前这本书正在翻译成英文的,估计今年中旬出版。看这本书最好伴着《Unix操作系统设计》或者《操作系统概念》(英文的第七版已经出来了,国内还没得卖) 《 深入理解Linux内核(第二版)》不多说了(因为还没看-_-#),圣经级的。翻译的还可以(据说) 《Linux内核源代码情景分析 上下》又是中国人的书,并且是难得的好书!看了内存管理一章,爽!不过还不够底层,所以转而看完全分析了,呵呵 《UNIX环境高级编程》如果你用过linux,并且在linux上写过C程序,这本书你就一定听说过,大牛!尤其是作者W.Richard Stevens[已故],他的每一本书我都打算好好读一下。 《UNIX网络编程卷2:进程间通信(第2版)(英文影印版)》Stevens系列 《UNIX 网络编程(第2版)第1卷:套接口API和X/Open 传输接口API》Stevens系列 《 TCP/IP详解三卷》Stevens系列 《深入理解计算机系统(修订版)》 底层的一些东西,“所有想写出更快、更可靠程序的开发人员必读之书!” 《Linkers & Loaders》好像没有纸版本的,我把地址贴到了LinuxRen上,看看吧,对理解程序的执行很有帮助的。 中断没有被屏蔽,J2EE类的书籍可能要”陷入”进来

VI 常用命令(不断添加中)

首先记住基础的三条: 一、VI有三种模式:『一般模式』、『编辑模式』与『指令列命令模式』 二、经常使用的按键: 命令 移动 h 左一个字符 j 下一行 k 上一行 l 右一个字符 w, W 前一个单词 (W 忽略标点) b, B 后一个单词 (B 忽略标点) $ 到行尾 ^ 到行首第一个非空字符 0 行首 G 到缓冲首 nG 到第 n 行 三、常用命令: x–删除一个字符 删除文字的最简单的方式是用 x。这个命令的结果是光标所处 的字符的消失,后面的文字左移动。如果你删除的字符是一行最后的一个字符, [...]

Get Adobe Flash player