??xml version="1.0" encoding="utf-8" standalone="yes"?>久久99精品国产麻豆蜜芽,人妻无码中文久久久久专区,亚洲中文精品久久久久久不卡http://www.shnenglu.com/mydriverc/archive/2008/01/08/40739.html旅?/dc:creator>旅?/author>Tue, 08 Jan 2008 08:52:00 GMThttp://www.shnenglu.com/mydriverc/archive/2008/01/08/40739.htmlhttp://www.shnenglu.com/mydriverc/comments/40739.htmlhttp://www.shnenglu.com/mydriverc/archive/2008/01/08/40739.html#Feedback1http://www.shnenglu.com/mydriverc/comments/commentRss/40739.htmlhttp://www.shnenglu.com/mydriverc/services/trackbacks/40739.html按照于渊的书q有|上的文?br />
1 使用VM建立一个虚拟机Q一路other,32M内存卛_
2 在edit virtual mathine setting中删除所有的讑֤Q除?jin)内存?j)
3 选择addd讑֤ floppy driver->create a blank floppy
4 使用nasm~译下面的代码(于渊书上的)(j)

org 07c00h ; 告诉~译器程序加载到7c00?/p>

 mov ax, cs

 mov ds, ax

 mov es, ax

 call DispStr ; 调用昄字符串例E?/p>

 jmp $ ; 无限循环

DispStr:

 mov ax, BootMessage

 mov bp, ax ; es:bp = 串地址

 mov cx, 16 ; cx = 串长?/p>

 mov ax, 01301h ; ah = 13, al = 01h

 mov bx, 000ch ; 号?(bh = 0) 黑底U字(bl = 0Ch,高亮)

 mov dl, 0

 int 10h ; 10h 号中?/p>

 ret

BootMessage: db "Hello, OS world!"

times 510-($-$$) db 0 ; 填充剩下的空_(d)使生成的二进制代码恰?/p>

?/p>

; 512字节

dw 0xaa55 ; l束标志
5 使用Floppy Writer编译过的文件写入前面徏立的floppy上?br />6启动虚拟机?br />可以看到效果?jin)?br />
下一步该研究引导E序?/strong>



]]>
csdn上的 自己动手写操作系l?/title><link>http://www.shnenglu.com/mydriverc/archive/2008/01/07/40636.html</link><dc:creator>旅?/dc:creator><author>旅?/author><pubDate>Mon, 07 Jan 2008 09:39:00 GMT</pubDate><guid>http://www.shnenglu.com/mydriverc/archive/2008/01/07/40636.html</guid><wfw:comment>http://www.shnenglu.com/mydriverc/comments/40636.html</wfw:comment><comments>http://www.shnenglu.com/mydriverc/archive/2008/01/07/40636.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/mydriverc/comments/commentRss/40636.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mydriverc/services/trackbacks/40636.html</trackback:ping><description><![CDATA[ <a >http://book.csdn.net/bookfiles/88/index.html</a> <img src ="http://www.shnenglu.com/mydriverc/aggbug/40636.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mydriverc/" target="_blank">旅?/a> 2008-01-07 17:39 <a href="http://www.shnenglu.com/mydriverc/archive/2008/01/07/40636.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux操作pȝ下的汇编E序设计?/title><link>http://www.shnenglu.com/mydriverc/archive/2008/01/07/40635.html</link><dc:creator>旅?/dc:creator><author>旅?/author><pubDate>Mon, 07 Jan 2008 09:38:00 GMT</pubDate><guid>http://www.shnenglu.com/mydriverc/archive/2008/01/07/40635.html</guid><wfw:comment>http://www.shnenglu.com/mydriverc/comments/40635.html</wfw:comment><comments>http://www.shnenglu.com/mydriverc/archive/2008/01/07/40635.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/mydriverc/comments/commentRss/40635.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mydriverc/services/trackbacks/40635.html</trackback:ping><description><![CDATA[ <div class="m4keegi" id="BlogArticleDetail" style="FONT-SIZE: 14px"> <p style="TEXT-INDENT: 2em"> <b>摘要Q?/b>本文主要讲述?jin)Linux下用汇~的利弊Q以?qing)常用汇~工L(fng)使用和语法特炏V重点讲qC(jin)NASM?</p> <p style="TEXT-INDENT: 2em"> <b>引言Q?/b>汇编语言是低U语aQ与g和操作系l紧密联pR个人电(sh)脑以前都是用DOSQ现在发展成?jin)WINDOWS 98Q而另一个操作系lLinux也正在崛赗下面比较一下这三个操作pȝQ?</p> <p style="TEXT-INDENT: 2em">DOS较稳定,速度快无法充分发挥计机性能Q没有图形界面较低?</p> <p style="TEXT-INDENT: 2em">WINDOWS 98操作便,应用软g?g兼容性好Q不E_Q经常死机,速度慢高?</p> <p style="TEXT-INDENT: 2em">Linux性能优秀Q非常稳定,界面观Q操作简便;~Z软g厂商支持Q应用Y件少免费?</p> <p style="TEXT-INDENT: 2em">׃上的比较可知QLinux操作pȝ本nh较大优势Q它的普?qing)应该只是时间问题,所以如何在Linux下开发Y件是我们计算机系学生必须学习(fn)与研I的一个课题?</p> <p style="TEXT-INDENT: 2em">Linux 下的主要~程语言是CQ同时Linuxq支持其他许多编E语aQ汇~语a作ؓ(f)最重要的编E语a之一Q当然也包括在内。它能够完成许多其他语言所不能完成的功能。要学习(fn)Linux~程Q就必须要学?fn)Linux下的汇编E序设计。下面我来介绍一下Linux下的汇编E序设计?</p> <p style="TEXT-INDENT: 2em"> <b>Linux汇编?/b> </p> <p style="TEXT-INDENT: 2em"> <b>一、汇~语a的优~点</b> </p> <p style="TEXT-INDENT: 2em">׃Linux是用C写的Q所以C自然而然的就成ؓ(f)?jin)Linux的标准编E语a。大部分人都把汇~给忽略?jin),甚至在因特网上找资料都是非常的困难,很多问题都需要靠自己来尝试。我认ؓ(f)q样对待汇编语言是不公^的,不能只看到它的缺点,当然也不能只看到它的优点Q下面把它的优缺点作一个比较:(x) </p> <p style="TEXT-INDENT: 2em">优点Q汇~语a可以表达非常底层的东?</p> <p style="TEXT-INDENT: 2em">可以直接存取寄存器和I/OQ?</p> <p style="TEXT-INDENT: 2em">~写的代码可以非常精的被执行; </p> <p style="TEXT-INDENT: 2em">可以~写出比一般编译系l高效的代码Q?</p> <p style="TEXT-INDENT: 2em">可以作ؓ(f)不同语言或不同标准的接口?</p> <p style="TEXT-INDENT: 2em">~点Q汇~语a是一个非怽U的语言 </p> <p style="TEXT-INDENT: 2em">非常冗长单调Q在DOS下编E时可以体?x)到Q?</p> <p style="TEXT-INDENT: 2em">易出BUGQ且调试困难Q?</p> <p style="TEXT-INDENT: 2em">代码不易l护Q?</p> <p style="TEXT-INDENT: 2em">兼容性不好,与硬件关p非常紧密?</p> <p style="TEXT-INDENT: 2em">ȝ来说Q汇~语a要用在必ȝ地方Q尽量少用汇~编写大型程序,多采用inline模式?</p> <p style="TEXT-INDENT: 2em"> <b>二、汇~语a工具</b> </p> <p style="TEXT-INDENT: 2em">DOS 下常用的工具MASM和TASM到Linux下就用不h?jin),Linux有自q汇编工具Q而且U类非常的多。其中Gas可以是标准配置Q每一U?Linux中都包括有GasQ但是GAS采用的不是我们通常在DOS下采用的汇编语法Q它采用的是ATQT的语法格式,与intel语法格式有很大的不同?</p> <p style="TEXT-INDENT: 2em">如果要采用与DOS接近的语法格式,必ȝ另一U汇~工具NASMQNASM基本与MASM相同Q但也有不少地方有较大区别,特别涉及(qing)到操作系l原理时Q与DOS可以说是截然不同?</p> <p style="TEXT-INDENT: 2em"> <b>Linux汇编E序设计</b> </p> <p style="TEXT-INDENT: 2em">一、Hello,world! </p> <p style="TEXT-INDENT: 2em">几乎所有的语言入门都是以“Hello,world!”ؓ(f)例,那么我也以Hello,world!Z开始?</p> <p style="TEXT-INDENT: 2em"> </p> <center> <ccid_nobr> <table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"> <tbody> <tr> <td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6"> <pre> <ccid_code>NASM's standalone Hello-World.asm for Linux section .text extern puts global main main: push dword msg ;stash the *** of msg on the stack. call puts ;call the 'puts' routine (libc?) add esp, byte 4 ;clean the stack? ret ;exit. msg: db "Hello World!",0 ~译Q? nasm –f elf hello.asm gcc –o hello hello.o</ccid_code> </pre> </td> </tr> </tbody> </table> </ccid_nobr> </center> <p style="TEXT-INDENT: 2em">说明Q这个程序实际上是调用了(jin)QLinuxpȝ的puts函数Q原理与调用DOS下C语言的函数相同,先用Extern声明puts是外部函敎ͼ再把参数Q即msg的地址Q压入堆栈,最后Call函数实现输出?</p> <p style="TEXT-INDENT: 2em">我们再来看一个程序:(x) </p> <p style="TEXT-INDENT: 2em"> </p> <center> <ccid_nobr> <table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"> <tbody> <tr> <td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6"> <pre> <ccid_code>section .text global main main: mov eax,4 ;4可? mov ebx,1 ;ebx?表示stdout mov ecx,msg ;字符串的首地址送入ecx mov edx,14 ;字符串的长度送入edx int 80h ;输出字串 mov eax,1 ;1可? int 80h ;l束 msg: db "Hello World!",0ah,0dh Q编译同上一个程序)(j)</ccid_code> </pre> </td> </tr> </tbody> </table> </ccid_nobr> </center> <p style="TEXT-INDENT: 2em">q个E序与DOSE序十分怼Q它用的是linux中的80h中断Q相当于DOS下的21h中断Q只是因为Linux?2位操作系l,所以采用了(jin) EAX、EBX{寄存器。但是Linux作ؓ(f)一个多用户的操作系l与DOS又是有着非常大的区别的。要写出有特色的E序Q不?jin)解操作pȝ和硬件是不行的。下面我介绍一下Linux操作pȝ?</p> <p style="TEXT-INDENT: 2em"> <b>二、Linux操作pȝ?/b> </p> <p style="TEXT-INDENT: 2em">操作pȝ实际是抽象资源操作到具体g操作l节之间的接口。对Linuxq样的多用户操作pȝ来说Q它需要避免用户对g的直接访问,q止用户之间的互相q扰。所以Linux接管?BIOS调用和端口输入输出,关于端口输入输出斚w请参阅Linux IO-Port-Programming HOWTO。而要通过Linux对硬件硬件进行访问就需要用到System CallQ实际上是许多C的函敎ͼ可以在汇~程序中调用Q调用方法与DOS下的汇编完全相同Q而且用ASM汇编时不用链接额外的库函数?</p> <p style="TEXT-INDENT: 2em">Linux与DOS的主要区别在于内存管理、进E(DOS下无q程概念Q、文件系l,其中内存理和进E与汇编~程的关pL较密切:(x) </p> <p style="TEXT-INDENT: 2em"> <b>1、内存管?/b> </p> <p style="TEXT-INDENT: 2em">对Q一台计机而言Q其内存以及(qing)其他资源都是有限的。ؓ(f)?jin)让有限的物理内存满_用程序对内存的大需求量QLinux采用?jin)称为“虚拟内存”的内存理方式。Linux内存划分ؓ(f)Ҏ(gu)处理的“内存页”,在系l运行过E中Q应用程序对内存的需求大于物理内存时QLinux可将暂时不用的内存页交换到硬盘上Q这PI闲的内存页可以满应用E序的内存需求,而应用程序却不会(x)注意到内存交换的发生?</p> <p style="TEXT-INDENT: 2em"> <b>q程</b> </p> <p style="TEXT-INDENT: 2em">q程实际是某特定应用E序的一个运行实体。在Linuxpȝ中,能够同时q行多个q程QLinux通过在短的时间间隔内轮流q行q些q程而实现“多d”。这一短的旉间隔UCؓ(f)“时间片”,让进E轮运行的Ҏ(gu)UCؓ(f)“调度”,完成调度的程序称度程序。通过多Q务机Ӟ每个q程可认为只有自q占计机Q从而简化程序的~写Q每个进E有自己单独的地址I间Qƈ且只能由q一q程讉KQ这P操作pȝ避免?jin)进E之间的互相q扰以及(qing)“坏”程序对pȝ可能造成的危実?</p> <p style="TEXT-INDENT: 2em">Z(jin)完成某特定Q务,有时需要综合两个程序的功能Q例如一个程序输出文本,而另一个程序对文本q行排序。ؓ(f)此,操作pȝq提供进E间的通讯机制来帮助完成这L(fng)d。Linux中常见的q程间通讯机制有信受管道、共享内存、信号量和套接字{?</p> <p style="TEXT-INDENT: 2em"> <b>三、Linux下的汇编工具</b> </p> <p style="TEXT-INDENT: 2em">Linux下的汇编工具可谓癑֮争鸣Q不像DOS下都要给MASM和TASMl控制了(jin)。但是Linux下每一U汇~工具都有很大的区别Q要惛_部掌握几乎是不可能的Q下面我介绍几种常用的汇~工P重点介绍NASM?qing)其使用和语法?</p> <p style="TEXT-INDENT: 2em">1、GCC </p> <p style="TEXT-INDENT: 2em">GCC其实是GNU的C语言产品Q但它支持Inline AssembleQ在GCC中inline assemble使用像宏一P但它比宏能更清楚更准的表达机器的工作状态?</p> <p style="TEXT-INDENT: 2em">C是汇~编E的一个高度概括,它可以减许多汇~中的麻?ch),特别是在GCCq个C~译器中Qassembleg起不?jin)多大的作用?</p> <p style="TEXT-INDENT: 2em">2、GAS </p> <p style="TEXT-INDENT: 2em">GAS 是Linux各版本中基本的汇~工P但它采用的是AT&T的语法标准与Intel的语法标准有很大的不同,对于DOS~程的我们来_(d)学习(fn)h是非常困隄。当然如果要_NLinux下的汇编~程Q学?fn)GAS也是非常必要的,具体的语法标准可以参看Using GNU Assembler?</p> <p style="TEXT-INDENT: 2em">3、GASP </p> <p style="TEXT-INDENT: 2em">GASP是GAS的扩展,它增Z(jin)GAS对宏的支持?</p> <p style="TEXT-INDENT: 2em">4、NASM </p> <p style="TEXT-INDENT: 2em">NASM是linux中语法与DOS最为相像的一U汇~工兗虽说如此,它与MASM也是有着很大区别的?</p> <p style="TEXT-INDENT: 2em">l NASM的用格式如下:(x) </p> <p style="TEXT-INDENT: 2em">Nasm –f -o </p> <p style="TEXT-INDENT: 2em">例如Q?</p> <p style="TEXT-INDENT: 2em">Nasm -f elf hello.asm </p> <p style="TEXT-INDENT: 2em">把hello.asm汇编成ELF object文gQ而Nasm -f bin hello.asm -o hello.com?x)把hello.asm汇编成二q制可执行文件hello.com.Nasm –h会(x)列出NASM命o(h)行的完整说明。NASM不会(x)有Q何输出,除非有错误发生?f 在Linux下主要有aout和ELF两种Q如果你不确定你的Linuxpȝ应该用AOUTq是ELFQ可以在NASM目录中输?File nasm Q如果输出nasm: ELF 32-bit LSB executable i386 (386 and up) Version 1表示是ELFQ如果输出nasm: Linux/i386 demand-paged executable (QMAGIC)表示是aout?</p> <p style="TEXT-INDENT: 2em">NASM与MASM的主要不同:(x) </p> <p style="TEXT-INDENT: 2em">首先与linuxpȝ一Pnasm是区分大写的,Hello与hello是不同的标识符Q如果要汇编到DOS或OS/2Q需要加入UPPERCASE参数?</p> <p style="TEXT-INDENT: 2em">其次Qnasm中内存操作数都是以[ ]表示?</p> <p style="TEXT-INDENT: 2em">在MASM?</p> <p style="TEXT-INDENT: 2em"> </p> <center> <ccid_nobr> <table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"> <tbody> <tr> <td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6"> <pre> <ccid_code>foo equ 1 bar dw 2 mov ax,foo mov ax,bar</ccid_code> </pre> </td> </tr> </tbody> </table> </ccid_nobr> </center> <p> </p> <p style="TEXT-INDENT: 2em">被汇编成完全不同的指o(h)Q虽然它们在MASM中的表达方式完全一栗而NASM完全避免?jin)这U؜乱,它用的是这L(fng)规则Q所有对内存的操作都必须通过 [ ]来实现。例如上例中对bar的操作就要写成如下Ş?mov ax,[bar]。由此可见,nasm中对offset的用也是没有必要的Qnasm中无offsetQ。Nasm对[ ]的用与masm也有所不同Q所有的表达式都必须写在[ ]中,下面举两个例子来说明Q?</p> <p style="TEXT-INDENT: 2em"> </p> <center> <ccid_nobr> <table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"> <tbody> <tr> <td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6"> <pre> <ccid_code>Masm Nasm Mov ax,table[di] Mov ax,[table+di] Mov ax,es:[di] Mov ax,[es:di] Mov ax,[di]+1 Mov ax,[di+1]</ccid_code> </pre> </td> </tr> </tbody> </table> </ccid_nobr> </center> <p style="TEXT-INDENT: 2em">Nasm 中不存储变量cdQ原因很单masm中通过[ ]d方式的变量也必须要指定类型。Nasm中不支持LODS, MOVS, STOS, SCAS, CMPS, INS, OUTSQ只支持lodsb、lodsw{已l指定类型的操作。Nasm中不再有assume操作Q段地址完全取决于存入段寄存器的倹{关于NASM的用方法及(qing)语法q可以参阅NASM使用手册?</p> <p style="TEXT-INDENT: 2em"> <b>l论</b> </p> <p style="TEXT-INDENT: 2em">我认Z论是在Windows/DOS下还是在Linux下完完全全用汇编~一个大型程序已l是不可能了(jin)Q也不会(x)有h愿意去这样做。在windows下我们可以用VCQ在Linux/Xwindows下我们可以用C甚至C++ BuilderQ但是像VC、C++ Builder之类的工具尽量隐藏了(jin)底层的调用,同时也阻隔了(jin)成ؓ(f)高手的机?x),因?f)~出来的E序无法?jin)解它的执行q程也就使编E中最重要的“可预测”性变得很低。正因ؓ(f)如此汇编才有它存在的必要性,同时q有一个更重要的原因,正如《超U解霸》的作者梁肇新所_(d)(x)“编E序的重点不是“编”,而是调试E序Q理Z的完在实现的时候会(x)遇到很多l节问题Q这些问题必调试才能解冟뀂我的编E习(fn)惯是一天写五天调试Q《超U解霸》是调试出来的,而不是写出来的。调试就涉及(qing)到汇~的问题Q不q行汇编U的调试是不d的,也不能让人放?j)?/p> </div> <img src ="http://www.shnenglu.com/mydriverc/aggbug/40635.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mydriverc/" target="_blank">旅?/a> 2008-01-07 17:38 <a href="http://www.shnenglu.com/mydriverc/archive/2008/01/07/40635.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Z么是NASMhttp://www.shnenglu.com/mydriverc/archive/2008/01/07/40634.html旅?/dc:creator>旅?/author>Mon, 07 Jan 2008 09:37:00 GMThttp://www.shnenglu.com/mydriverc/archive/2008/01/07/40634.htmlhttp://www.shnenglu.com/mydriverc/comments/40634.htmlhttp://www.shnenglu.com/mydriverc/archive/2008/01/07/40634.html#Feedback0http://www.shnenglu.com/mydriverc/comments/commentRss/40634.htmlhttp://www.shnenglu.com/mydriverc/services/trackbacks/40634.html 你的疑问是“ؓ(f)什么是 NASM 而不?/span> MASM ”,那么现在你的疑问可能变成?jin)“ؓ(f)什么是 NASM 而不?/span> GAS ”。因?/span> MASM ?/span> GAS 都太极端?jin),q是 NASM 比较中庸Q它既可以在 Windows q_下用,又可以在 Linux q_下用。而且Q如果没有接触过 AT&T 格式的汇~, GAS 看上d在太奇怪了(jin)Q入门时一定会(x)让你感到晕头转向?/span>

在这里,我们ȝ一下?/span> NASM 的几大理由:(x)

?/span>   NASM ?/span> MASM 接近Q入门比较容易?/span>

?/span> NASM 在不同^C均可使用Q可以在 Windows 下编写ƈ调试Q然后拿?/span> Linux 下用?/span>

?/span> 自带反汇~程序,方便取用?/span>

?/span> 文档丰富Q自带的文档?/span> Word ?/span> PDF ?/span> CHM 三种版本Q检索极为方ѝ?/span>

?/span> 它是免费的?/span>

NASM 安装h也很单,?/span> http://nasm.sourceforge.net/ 可以扑ֈ各个q_下的安装包和相关文档?/span>



]]>
nasm下蝲地址http://www.shnenglu.com/mydriverc/archive/2008/01/07/40633.html旅?/dc:creator>旅?/author>Mon, 07 Jan 2008 09:21:00 GMThttp://www.shnenglu.com/mydriverc/archive/2008/01/07/40633.htmlhttp://www.shnenglu.com/mydriverc/comments/40633.htmlhttp://www.shnenglu.com/mydriverc/archive/2008/01/07/40633.html#Feedback0http://www.shnenglu.com/mydriverc/comments/commentRss/40633.htmlhttp://www.shnenglu.com/mydriverc/services/trackbacks/40633.htmlhttp://nasm.sourceforge.net/

]]>
动手~写自己的操作系l——环境设|?/title><link>http://www.shnenglu.com/mydriverc/archive/2008/01/07/40628.html</link><dc:creator>旅?/dc:creator><author>旅?/author><pubDate>Mon, 07 Jan 2008 08:32:00 GMT</pubDate><guid>http://www.shnenglu.com/mydriverc/archive/2008/01/07/40628.html</guid><wfw:comment>http://www.shnenglu.com/mydriverc/comments/40628.html</wfw:comment><comments>http://www.shnenglu.com/mydriverc/archive/2008/01/07/40628.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/mydriverc/comments/commentRss/40628.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mydriverc/services/trackbacks/40628.html</trackback:ping><description><![CDATA[ <p>在现有的WindowXP2操作pȝ下,需要安装的软g列表Q?/p> <p>1、VMware4.5</p> <p>      host与guest操作pȝ的共享首先需要安装VMware ToolsQ步骤如下:(x)1Q在启动虚拟?strong>文本模式(否则安装?x)失?</strong>以后Q鼠标依ơ单击VMwareȝ面上的“设定”选单→“VMware工具安装”选单,然后在弹出的对话框里单击“Install”;[2Q在该对话框上选中“DVD/CD-ROMQIDE 1:0Q”列表项Q可以看到虚拟机光驱有两U连接方式,一U是直接使用物理驱动器,另一U是使用ISO映像。这里选中后者。然后单几Z浏览”按钮,指定Linux.iso映像文g的\径(位于VMware的安装目录\VMware\VMware Workstation\Programs\Linux.iso下)(j)卛_。]3Q此时在/mnt[/cdrom]目录下,?x)发现多了(jin)一个文Ӟ(x)vmware-linux-tools.tar.gzQ这是VMware Tools的Linux安装包;4Q然后再把该文g拯到tmp目录下,键入“cp ./vmware-linux-tools.tar.gz /tmp”命令即可?Q现在虚拟机光驱的命完成了(jin)Q应该把它卸载,用命令“umount /dev/cdrom”即可?Q接下来应该解压~vmware-linux-tools.tar.gz文g。首先进入tmp目录Q用“cd /tmp”命令,然后用“tar zxf vmware-linux-tools.tar.gz”命令将其解压羃Q把它释攑ֈ同名目录下(即vmware-linux-tools目录Q?Q然后用“cd vmware-linux-tools[或者别的名字]”进入解压后的目录,用“ls”命令显C其下的内容Q从中可以看到install.pl是VMware Tools的安装程序?Q最后用?/install.pl[可能是别的文件名]”命令来q行该安装程序,然后Ҏ(gu)屏幕提示一路回车。到此整个安装过E算是完成了(jin)?/p> <p>      讄文g׃n(必须先安装好VMware Tools)QVM——〉setting——〉Options——〉Shared FoldersQlinux中对应的目录为:(x)/mnt/hgfs</p> <p>      d启动虚拟软驱Q启动虚拟机之前——〉VM——〉setting——〉Hardware——〉如果device选项中没有Floppy的话Q“add”——〉create a blank floppy or use a  floppy: *.img——?/p> <p>2、Linux9.0 </p> <p>3、WinImage8.0Q创拟Y?.img文g</p> <p>4、FloppyWriterQ将*.bin文g写入*.img文g的工?/p> <p>5、asm汇编~译、调试工?/p> <p>nasmQ?a ><font color="#4a6668">http://webster.cs.ucr.edu/AsmTools/NASM/index.html</font></a></p> <p>nasm manualQ?a ><font color="#4a6668">http://nasm.sourceforge.net/doc/html/nasmdoc0.html</font></a></p> <p>ald(需要搜?Q?a ><font color="#4a6668">http://sourceforge.net/project/showfiles.php?group_id=102112</font></a>Q安装这个Y件运?/configure的时候,因ؓ(f)要修Ҏ(gu)件夹的读写属性,如果没有_的权限或者是q行在与host׃n的文件夹(该文件夹一般不允许修改d属性,但是可以d文g)下,则会(x)报告?strong>chmod</strong> …?"710" "700" permited”类似的错误?/p> <p>gdb的图形版本dddQ?a ><font color="#4a6668">www.gnu.com/ddd</font></a></p> <p>6、安装virtualpc和PC-DOS/MS-DOS——没有必要装微Y的这个破东西Q在VMware中也可以和硬盘共?/p> <p>到microsoft主页上下载virtual pc2004(热键为键盘右边的Alt)Q?a ><font color="#4a6668">http://www.microsoft.com/downloads/details.aspx?FamilyId=6D58729D-DFA8-40BF-AFAF-20BCB7F01CD1&displaylang=en</font></a></p> <p>dos启动盘下载地址Q?a ><font color="#4a6668">http://www.cn-dos.net/newdos/doswarea.htm#pcdos</font></a></p> <p>׃n讄Q网l上盛传的文件夹׃nҎ(gu)我L不能成功Q大概是没有权限写。这里有另外一U办法可以访问到所有的盘信息Q只是不能写Q但是矣。主Z写asmE序Qdos虚拟Zq行实模式下的comE序?/p> <p>新徏一个MS-DOS的虚拟机——〉新Z个虚拟的hard disk——〉完成之后,点击此虚拟机的setting——〉在hard Disk1中,q行Virtual Disk向导——〉创Z个新的Virtual Disk——〉在Virtual Hard Disk Option选项中选择“Linked to a hard disk”——〉返回到此虚拟机的setting中的Hard Disk 1Q将刚刚新徏的Virtual Disk加蝲到Hard Disk 1中去——〉运行此虚拟机,点击菜单栏的Floppy中的“Capture Floppy Disk Img”,加蝲下蝲的MS-DOS/PC-DOS img文g?/p> <p>7、Virtual PC中启动Turbo debugger(<font color="#ff0000">tasm5</font>中包含此软g)</p> <p>下蝲地址Q?a ><font color="#4a6668">http://www.begin.org.cn/</font></a></p> <p>正式?.0Q推荐)(j)Q?a ><font color="#4a6668">http://tt.stu.edu.cn/download/Application.htm</font></a></p> <p>虽然?中说C能在与主机共享的文g夹中q行写操作,但是是可以在虚拟软驱中写文g的,所以在VPC的dos中可以将E序安装在A盘中。安装鼠标驱动也是这么实现的Q先用WinImage鼠标驱动程序加载到dos驱动E序中去Q再在A盘中直接q行安装</p> <img src ="http://www.shnenglu.com/mydriverc/aggbug/40628.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mydriverc/" target="_blank">旅?/a> 2008-01-07 16:32 <a href="http://www.shnenglu.com/mydriverc/archive/2008/01/07/40628.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>~写自己的操作系l??/title><link>http://www.shnenglu.com/mydriverc/archive/2008/01/07/40627.html</link><dc:creator>旅?/dc:creator><author>旅?/author><pubDate>Mon, 07 Jan 2008 08:28:00 GMT</pubDate><guid>http://www.shnenglu.com/mydriverc/archive/2008/01/07/40627.html</guid><wfw:comment>http://www.shnenglu.com/mydriverc/comments/40627.html</wfw:comment><comments>http://www.shnenglu.com/mydriverc/archive/2008/01/07/40627.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/mydriverc/comments/commentRss/40627.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mydriverc/services/trackbacks/40627.html</trackback:ping><description><![CDATA[ <h2 class="diaryTitle">~写自己的操作系l? -</h2> <p>                                       </p> <p> </p> <p>看看?很不错的!</p> <p>自由软gC֌是一个充满自由和梦想的地方,?0余年的时间里它创造了(jin)一个又一个奇qV然而,q些奇迹的创造者不只是StallmanQ也不只是Linus TorvaldsQ而是z跃在世界各地的不计其数的开发h员?</p> <br /> <p>作者:(x)伊梅</p> <p>自由软gC֌是一个充满自由和梦想的地方,?0余年的时间里它创造了(jin)一个又一个奇qV然而,q些奇迹的创造者不只是StallmanQ也不只是Linus TorvaldsQ而是z跃在世界各地的不计其数的开发h员?<br /><br />在用各U功能强大的自由软gӞ我M(x)对其开?</p> <table cellspacing="0" cellpadding="0" align="left" border="0"> <tbody> <tr> <td> <span> </span> </td> </tr> </tbody> </table>者充满崇敬之情,期盼有朝一日自׃能成Z们中的一员。很多对自由C֌充满向往之情的hQ虽然也惛_力融w于其中Q但又不知该怎么做。那么,p与我们一起从~写一个简单的操作pȝ开始吧Q?<br /><br /><br />我们要做的事?<br /><br /><br />有h可能担心(j)自己既没有学q计机原理Q也没有学过操作pȝ原理Q更不懂汇编语言Q对C语言也一知半解,能写操作pȝ吗?{案是没问题。我带大家一步一步完成自q操作pȝ。当然如果学一学上q内容再好不q?<br /><br />首先要明处理器(也就是CPU)控制着计算机。对PC而言Q启动的时候,CPU都处在实模式状态,相当于只是一个Intel 8086处理器。也是_(d)即你现在拥有一个奔腑֤理器Q它的功能也只能?086U别。从q一点上来讲Q可以用一些Y件把处理器{换到著名的保护模式。只有这P我们才可以充分利用处理器的强大功能?<br /><br />~写操作pȝ开始是对BIOS控制Q取出存储在ROM里的E序。BIOS是用来执行POST(Power On Self TestQ自(g))的。自(g)是检查计机的完整?比如外设是否工作正常、键盘是否连接等)。这一切完成以后,你就?x)听到PC喇叭发出一声清脆的响声。如果一切正常,BIOS׃(x)选择一个启动设备,q且d该设备的W一扇区(卛_动扇?Q然后控制过E就?x){Ud指定位置。启动设备可能是一个Y盘、光盘、硬盘,或者其它所选择的设备。在此我们把软盘作ؓ(f)启动讑֤。如果我们已l在软盘的启动扇区里写了(jin)一些代码,q时它就被执行。因此,我们的目的很明确Q就是往软盘的启动扇区写一些程序?<br /><br />首先使用8086汇编来写一个小E序Q然后将其拷贝至软盘的启动扇区。ؓ(f)?jin)实现拷贝,要写一个CE序。最后,使用软盘启动计算机?<br /><br /><br />需要的工具 <br /><br /><br />?as86Q这是一个汇~程序,它负责把写的代码转换成目标文件?<br /><br />?ld86Q这是一个连接器Qas86产生的目标代码由它来转换成真正的机器语言。机器语a?086能够解读的Ş式?<br /><br />?GCCQ著名的C~程器。因为我们需要写一个CE序自qOS转移到Y盘中?<br /><br />?一张空软盘Q它用于存储~写的操作系l,也是启动讑֤?<br /><br />?一台装有Linux的计机Q这台机器可以很旧,386?86都可以?<br /><br />在大部分标准Linux发行版中都会(x)带有as86和ld86。在我用的Red Hat 7.3中就包含有这两个工具Qƈ且在默认的情况下Q它已经安装在机器里。如果用的Linux没有q两个工P可以从网上下?http: //www.cix.co.uk/~mayday/)Q这两个工具都包含在一个名为bin86的Y件包中。此外,有关的文档也可以在网上获?(www.linux.org/docs/ldp/howto/Assembly-HOWTO/as86.html)?<br /><br /><br />开始工?<br /><br /><br />使用一个你喜欢的编辑器输入以下内容Q?<br /><br />entry start <br />start: <br />mov ax,#0xb800 <br />mov es,ax <br />seg es <br />mov [0],#0x41 <br />seg es <br />mov [1],#0x1f <br />loop1: jmp loop1 <br /><br /><br />q是as86可以L的一D|~程序。第一个句子指明了(jin)E序的入口点Q声明整个过E从start处开始。第二行指明?jin)start的位|,说明整个E序要从start处开始执行?xb800是显存的开始地址?表明其后是一个立x。执行语句:(x) <br /><br />mov ax,#oxb800 <br /><br /><br />ax 寄存器的值就变ؓ(f)0xb800Q这是昑֭的地址。下面再这个值移至es寄存器,es是附加段寄存器。请C8086有一个分D늚体系l构。它的各D寄存器Z码段、数据段、堆栈段和附加段Q对应的寄存器名U分别ؓ(f)cs、ds、ss和es。事实上Q我们把昑֭地址送入?jin)附加段Q因此,M送入附加D늚东西都会(x)被送到昑֭中?<br /><br />要在屏幕上显C字W,需要向昑֭中写两个字节。前一个是所要显C字W的ASCⅡ|W二个字节表C字符的属性。属性包括字W的前景艌Ӏ背景色?qing)是否闪烁等{。seg es指明下一个将要执行的指o(h)是指向esD늚。所以,我们把?x41(在ASCⅡ中表示的字W是A)送到昑֭的第一个字节中。接下来要把字符的属性送到下一个字节当中。在此输入的?x1fQ该属性指的是在蓝色背景下昄白色的字W。因此,如果执行q个E序Q就可以在屏q上得到昄在蓝底上的一个白色的 A。接着是一个@环。因为在执行完显C字W的d后,要么让程序结束,要么使用一个@环其永q运行下厅R把该文件命名ؓ(f)boot.sQ然后存盘?<br /><br />此处昑֭的概念说得不是很清楚Q有必要q一步解释一下。假讑ֱq由80列?5行组成,那么W一行就需?60字节Q其中一个字节用于表C字W,另外一个字节用于表C字W的属性。如果要在第三行昄某一字符的话Q就要蟩q显存的W??字节(它们是用于显C第1列的)Q第2?字节(它们是用于显C第2列的)Q然后把需要显C字W的ASCⅡ码值入W?字节Q把字符的属性写入第5字节?<br /><br /><br />把程序写臛_动扇?<br /><br /><br />下面写一个CE序Q把我的操作pȝ写入软盘W一扇区。程序内容如下:(x) <br /><br />#include /* unistd.h 需要这个文?*/ <br />#include /* 包含有read和write函数 */ <br />#include <br />int main() <br />{ <br />char boot_buf[512]; <br />int floppy_desc, file_desc; <br />file_desc = open("./boot", O_RDONLY); <br />read(file_desc, boot_buf, 510); <br />close(file_desc); <br />boot_buf[510] = 0x55; <br />boot_buf[511] = 0xaa; <br />floppy_desc = open("/dev/fd0", O_RDWR); <br />lseek(floppy_desc, 0, SEEK_CUR); <br />write(floppy_desc, boot_buf, 512); <br />close(floppy_desc); <br />} <br /><br /><br />首先Q以只读模式打开boot文gQ然后在打开文g时把文g描述W复制到file_desc变量中。从文g中读?10个字W,或者读取直到文件结束。在本例中由于文件很,所以是dx件结束。然后关闭文件?<br /><br />最?行代码打开软盘驱动讑֤(一般来说是/dev/fd0)。用lseek扑ֈ文g开始处Q然后从~冲中向软盘?12个字节?<br /><br />在read、write、open和lseek的帮助页中,可以看到与函数所有有关的参数?qing)其使用?gu)。程序中有两行比较难懂:(x) <br /><br />boot_buf[510] = 0x55; <br />boot_buf[511] = 0xaa; <br /><br /><br />该信息是用于BIOS的,如果它识别出该设备是一个可启动的设备,那么在第510?11的位|,该值就应该?x55?xaa。程序会(x)把文件boot读至名ؓ(f)boot_buf的缓冲中。它要求改变W?10和第511字节Q然后把boot_buf写至软盘之上。如果执行代码,软盘上的?12字节包含了(jin)启动代码。最后,把文件存为write.c?<br /><br /><br />~译q行 <br /><br /><br />使用下面的命令把文g变ؓ(f)可执行文Ӟ(x) <br /><br />as86 boot.s -o boot.o <br />ld86 -d boot.o -o boot <br />cc write.c -o write <br /><br /><br />首先boot.s文g~译成目标文件boot.oQ然后将该文件连接成最l的boot文g。最后CE序~译成可执行的write文g?<br /><br />插入一个空白Y盘,q行以下E序Q?<br /><br />./write <br /><br /><br />重新启动?sh)脑Q进行BIOS的界面设|,q且把Y盘设为第一个启动的讑֤。然后插入Y盘,?sh)脑从Y盘上启动?<br /><br />启动完成后,在屏q上可以看到一个字母A(蓝底白字)Q启动速度很快Q几乎是在瞬间完成。这意味着pȝ已经从我们制作的软盘上启动了(jin)Qƈ且执行了(jin)刚才写入启动扇区的程序。现在,它正处在一个无限@环的状态。所以,如果惌入LinuxQ必需拿掉软盘Qƈ且重启机器?<br /><br />xQ这个操作系l就完成了(jin)Q虽然它没有实现什么功能,但是它已l可以启动机器了(jin)?<br /><br />下一期我在q个启动扇区E序里加入一些代码,使它可以做一些比较复杂的事情(比如使用BIOS中断、保护模式切换等{??<br /><br />自己动手写操作系l?? <br />作者:(x)伊梅 <br /><br />上一期,我讲qC(jin)如何在Y盘的启动扇区写一些代码,然后再从软盘启动的过E。制作好一个启动扇区,在切换到保护模式之前Q我们还应该知道如何使用BIOS中断。BIOS中断是一些由BIOS提供的、ؓ(f)?jin)操作pȝ的创建更Ҏ(gu)的低U程序。在本文中,我们学?fn)处理BIOS的中断?<br /><br />Z么要用BIOS <br /><br />BIOS ?x)把启动扇区拯至RAM中,q且执行q些代码。除此之外,BIOSq要做很多其它的事情。当一个操作系l刚开始启动时Q系l中q没有显卡驱动、Y盘驱动等M驱动E序。因此,启动扇区中不可能包含M一个驱动程序,我们要采取其它的途径。这个时候,BIOS可以帮助我们了(jin)。BIOS中包含有各种可以使用的程序,包括(g)安装的讑֤、控制打印机、计内存大等用于各种目的的程序。这些程序就是所说的BIOS中断?<br /><br />如何调用BIOS中断 <br /><br />在一般的E序设计语言中,函数的调用是一仉常容易的事情。比如在C语言中,如果有一个名为display的程序,它带有两个参敎ͼ其中参数 noofchar表示昄的字W数Q参数attr表示昄字符的属性。那么要调用它,只需l出E序的名U即可。对于中断的调用Q我们用的是汇~语a中的 int指o(h)?<br /><br />比如Q在C语言中要昄一些东西时Q用的指o(h)如下所C:(x) <br /><br />display(nofcharQattr)Q?<br />而用BIOSӞ要实现相同功能用的指o(h)如下Q?<br /><br />int 0x10 <br /><br />如何传递参?<br /><br />在调用BIOS中断之前Q我们需要先往寄存器中送一些特定的倹{假设要使用BIOS的中?3hQ该中断的功能是把数据从软盘传送至内存之中。在调用该中断之前,要先指定拯数据的段地址Q指定驱动器受磁道号、扇区号Q以?qing)要传送的扇区数等{。然后,p往相应的寄存器送入相应的倹{在q行下面的步骤前Q读者有必要对这一Ҏ(gu)比较明确地认识?<br /><br />此外Q一个比较重要的事实是同一个中断往往可以实现各种不同的功能。中断所实现的确切功能取决于所选择的功能号Q功能号一般都存在ah寄存器之中。比如中?3h可以用于ȝ盘、写盘{功能,如果?送入ah寄存器中Q那么中断选择的功能就是写盘Q如果把2送入ah寄存器中Q选择的功能则是读盘{?<br /><br />我们要做的事?<br /><br />q次我们的源代码׃个汇~语aE序和一个CE序l成。第一个汇~文件是引导扇区的代码。在引导扇区中,我们写的代码是要把Y盘中W二扇区拯臛_存段?x500?地址?x5000Q即偏移地址?)。这时我们需要用BIOS的中?3h。这时启动扇区的代码׃(x)把控制权转移?x500处。在W二个汇~文件中Q代码会(x)使用BIOS中断 10h在屏q上昄一个信息。CE序实现的功能则是把可执行的文g1拯臛_动扇区,把可执行的文?拯臌Y盘的W二扇区?<br /><br />启动扇区代码 <br /><br />使用中断13hQ启动扇区把软盘W二扇区里的内容加蝲臛_存的0x5000?D地址?x500)。下面的代码是用于实现这一目的的代码,其保存x件sbect.s中?<br /><br />LOC1=0x500 <br />entry start <br />start: <br />mov ax,#LOC1 <br />mov es,ax <br />mov bx,#0 <br />mov dl,#0 <br />mov dh,#0 <br />mov ch,#0 <br />mov cl,#2 <br />mov al,#1 <br />mov ah,#2 <br />int 0x13 <br />jmpi 0,#LOC1 <br /><br /><br />上面代码W一行类g一个宏。接下去的两行则是把?x500加蝲至es寄存器中Q这是Y盘上W二扇区代码拷贝到的地?W一扇区是启动扇?。这Ӟ把段内的偏移设ؓ(f)0?<br /><br />接下来把驱动器号送入dl寄存器中Q其中磁头号送入dl寄存器中Q磁道号送入ch寄存器中Q扇区号送入cl寄存器中Q扇区数送入al寄存器之中。我们想要实现的功能是把扇区2、磁道号?、驱动器号ؓ(f)0的内定w至D地址0x500处。所有这些参数都?.44MB的Y盘相对应?<br /><br />?送入ah寄存器中Q是选择?jin)由中?3h提供的相应功能,卛_C软驱转移数据的功能?<br /><br />最后调用中?3hQƈ且{臛_UMؓ(f)0的段地址0x500处?<br /><br />W二个扇区的代码 <br /><br />W二个扇Z的代码如下所C?把这些代码保存至文gsbect2.s之中)Q?<br /><br />entry start <br />start: <br />mov ah,#0x03 <br />xor bh,bh <br />int 0x10 <br /><br />mov cx,#26 <br />mov bx,#0x0007 <br />mov bp,#mymsg <br />mov ax,#0x1301 <br />int 0x10 <br /><br />loop1: jmp loop1 <br />mymsg: <br />.byte 13,10 <br />.ascii "Operating System is Loading......" <br /><br /><br />上面代码被加蝲x地址?x500处,q且被执行。在q段代码中,使用?jin)中?0h来获取目前的光标位置Q然后显CZ息?<br /><br />从第3行到W?行用于得到目前光标的位置Q在此中?0h选用的是功能3。然后,清除?jin)bh寄存器的内容Qƈ把字W串送至ch寄存器中。在bx中,我们送入?jin)页码?qing)昄的属性。此处,我们惌在黑背景上显C白色的字符。然后,把要昄字符的地址送到bp之中Q信息由两个字节l成Q其值分别ؓ(f)13?0Q它们分别对应回车和LF(换行)的ASCⅡ倹{接下来是一个由29个字W组成的Ԍ在下面实现的功能是输出字W串然后Ud光标Q最后是调用中断Q然后进入@环?<br /><br />CE序代码 <br />CE序的源代码如下所C,其存储为write.c文g?<br /><br />#include /* unistd.h needs this */ <br />#include /* contains read/write */ <br />#include <br />int main() <br />{ <br />char boot_buf[512]; <br />int floppy_desc, file_desc; <br />file_desc = open("./bsect", O_RDONLY); <br />read(file_desc, boot_buf, 510); <br />close(file_desc); <br />boot_buf[510] = 0x55; <br />boot_buf[511] = 0xaa; <br />floppy_desc = open("/dev/fd0", O_RDWR); <br />lseek(floppy_desc, 0, SEEK_SET); <br />write(floppy_desc, boot_buf, 512); <br />file_desc = open("./sect2", O_RDONLY); <br />read(file_desc, boot_buf, 512); <br />close(file_desc); <br />lseek(floppy_desc, 512, SEEK_SET); <br />write(floppy_desc, boot_buf, 512); <br />close(floppy_desc); <br />} <br /><br /><br />在上一期中Q我曄介绍q如何操作能启动的Y盘。现在这一个过E稍微有点不同,首先把由bsect.s~译出来的可执行文gbsect拯臌Y盘的启动扇区。然后再把由sect2.s产生的可执行文gsect2拯臌Y盘的W二个扇区?<br /><br />把上q文件置于同一目录之下Q然后分别对其进行编译,Ҏ(gu)如下所C:(x) <br /><br />as86 bsect.s -o bsect.o <br />ld86 -d bsect.o -o bsect <br /><br />对sect2.s文g重复以上的操作,得出可执行文件sect2。编译write.cQ插入Y盘后执行write文gQ命令如下所C:(x) <br /><br />cc write.c -o write <br />./write <br /><br />下一步我们要做的事情 <br /><br />从Y盘启动以后,可以看到昄出来的字W串。这是用了(jin)BIOS中断来完成的。下一期要做的事情是在q个操作pȝ中实现实模式向保护模式的转换?<br /><br />自己动手写操作系l?? <br />作者:(x)伊梅 <br /><br /><br />在上两期中(自己动手写操作系l?Q?Q,我向大家讲述?jin)如何用Linux 提供的开发工具在软盘的启动扇区写一些代码,以及(qing)如何调用BIOS的问题。现在,q个操作pȝ已经来接q当qLinus Torvalds的那个具?历史意义"的Linux内核?jin)。因此,要马上把q个pȝ切换C护模式之下?<br /><br />什么是保护模式 <br /><br />自从1969q推出第一个微处理器以来,Intel处理器就在不断地更新换代Q从8086?088?0286Q到80386?0486、奔腾、奔?Ⅱ、奔?{,其体pȝ构也在不断变化?0386以后Q提供了(jin)一些新的功能,弥补?086的一些缺陗这其中包括内存保护、多d?qing)?40KB以上的内存等Qƈ仍然保持?086家族的兼Ҏ(gu)。也是?0386仍然具备?086?0286的所有功能,但是在功能上有了(jin)很大的增强。早期的处理器是工作在实模式之下的,80286以后引入?jin)保护模式,而在80386以后保护模式又进行了(jin)很大的改q。在80386中,保护模式为程序员提供?jin)更好的保护Q提供了(jin)更多的内存。事实上Q保护模式的目的不是Z(jin)保护E序Q而是要保护程序以外的所有程序(包括操作pȝQ?<br /><br />a之,保护模式是处理器的一U最自然的模式。在q种模式下,处理器的所有指令及(qing)体系l构的所有特色都是可用的Qƈ且能够达到最高的性能?<br /><br />保护模式和实模式 <br /><br />从表面上看,保护模式和实模式q没有太大的区别Q二者都使用?jin)内存段、中断和讑֤驱动来处理硬Ӟ但二者有很多不同之处。我们知道,在实模式中内存被划分成段Q每个段的大ؓ(f)64KBQ而这L(fng)D地址可以?6位来表示。内存段的处理是通过和段寄存器相兌的内部机制来处理的,q些D寄存器QCS、DS?SS和ESQ的内容形成?jin)物理地址的一部分。具体来_(d)最l的物理地址是由16位的D地址?6位的D内偏移地址l成的。用公式表示为:(x) <br /><br />物理地址=左移4位的D地址+偏移地址?<br /><br />在保护模式下Q段是通过一pd被称之ؓ(f)"描述W表"的表所定义的。段寄存器存储的是指向这些表的指针。用于定义内存段的表有两U:(x)全局描述W表(GDT)和局部描q符?LDT)。GDT是一个段描述W数l,其中包含所有应用程序都可以使用的基本描q符。在实模式中Q段长是固定??4KB)Q而在保护模式中,D长是可变的Q其最大可?GB。LDT也是D|q符的一个数l。与GDT不同QLDT是一个段Q其中存攄是局部的、不需要全局׃n的段描述W。每一个操作系l都必须定义一个GDTQ而每一个正在运行的d都会(x)有一个相应的LDT。每一个描q符的长度是8个字节,格式如图3所C。当D寄存器被加载的时候,D基地址׃(x)从相应的表入口获得。描q符的内容会(x)被存储在一个程序员不可见的影像寄存?shadow register)之中Q以便下一ơ同一个段可以使用该信息而不用每ơ都到表中提取。物理地址?6位或?2位的偏移加上影像寄存器中的基址l成。实模式和保护模式的不同可以从图1和图2中很清楚地看出来?<br /><br /><br />? 实模式的d <br /><br /><br />? 保护模式下的d <br /><br /><br />? D|qC的格?<br /><br />此外Q还有一个中断描q符?IDT)。这些中断描q符?x)告诉处理器到那里可以找C断处理程序。和实模式一P每一个中断都有一个入口,但是q些入口的格式却完全不同。因为在切换C护模式的q程中没有用到IDTQ所以在此就不多做介l了(jin)?<br /><br />q入保护模式 <br /><br />80386 ??2位控制寄存器Q名字分别ؓ(f)CR0、CR1、CR2和CR3。CR1是保留在未来处理器中使用的,?0386中没有定义。CR0包含pȝ的控制标志,用于控制处理器的操作模式和状态。CR2和CR3是用于控制分|制的。在此,我们x的是CR0寄存器的PE位控Ӟ它负责实模式和保护模式之间的切换。当P(yng)E=1Ӟ说明处理器运行于保护模式之下Q其采用的段机制和前面所q的相应内容对应。如果PE=0Q那么处理器工作在实模式之下?<br /><br />切换C护模式,实际是把PE位置?。ؓ(f)?jin)把pȝ切换C护模式,q要做一些其它的事情。程序必要对系l的D寄存器和控制寄存器q行初始化。把PE位置1后,q要执行跌{指o(h)。过E简q如下:(x) <br /><br />1.创徏GDT? <br /><br />2.通过|PE位ؓ(f)1q入保护模式; <br /><br />3.执行跌{以清除在实模式下d的Q何指令?<br /><br />下面使用代码来实现这个切换过E?<br /><br />需要的东西 <br /><br />?一张空白Y?<br /><br />?NASM~译?<br /><br />下面是整个程序的源代码:(x) <br /><br />org 0x07c00; 起始地址?000:7c00 <br />jmp short begin_boot ; 跌其它的数据,跌{到引导程序的开始处 <br />bootmesg db "Our OS boot sector loading ......" <br />pm_mesg db "Switching to protected mode ...." <br />dw 512 ; 每一扇区的字节数 <br />db 1 ; 每一的扇区?<br />dw 1 ; 保留的扇区号 <br />db 2 <br />dw 0x00e0 <br />dw 0x0b40 <br />db 0x0f0 <br />dw 9 <br />dw 18 <br />dw 2 ; d扇区?<br />dw 0 ; 隐藏扇区?<br />print_mesg : <br />mov ah,0x13 ; 使用中断10h的功?3Q在屏幕上写一个字W串 <br />mov al,0x00 ; 军_调用函数后光标所处的位置 <br />mov bx,0x0007 ; 讄昄属?<br />mov cx,0x20 ; 在此字符串长度ؓ(f)32 <br />mov dx,0x0000 ; 光标的v始行和列 <br />int 0x10 ; 调用BIOS的中?0h <br />ret ; q回调用E序 <br />get_key : <br />mov ah,0x00 <br />int 0x16 ; Get_key使用中断16h的功?Q读取下一个字W?<br />ret <br />clrscr : <br />mov ax,0x0600 ; 使用中断10h的功?Q实现卷屏,如果al=0则清?<br />mov cx,0x0000 ; 清屏 <br />mov dx,0x174f ; 卷屏?3Q?9 <br />mov bh,0 ; 使用颜色0来填?<br />int 0x10 ; 调用10h中断 <br />ret <br />begin_boot : <br />call clrscr ; 先清?<br />mov bp,bootmesg ; 提供串地址 <br />call print_mesg ; 输出信息 <br />call get_key ; {待用户按下M?<br />bits 16 <br />call clrscr ; 清屏 <br />mov ax,0xb800 ; 使gs指向昄内存 <br />mov gs,ax ; 在实模式下显CZ个棕色的A <br />mov word [gs:0],0x641 ; 昄 <br />call get_key ; 调用Get_key{待用户按下M?<br />mov bp,pm_mesg ; 讄串指?<br />call print_mesg ; 调用print_mesg子程?<br />call get_key ; {待按键 <br />call clrscr ; 清屏 <br />cli ; 关中?<br />lgdt[gdtr] ; 加蝲GDT <br />mov eax,cr0 <br />or al,0x01 ; 讄保护模式?<br />mov cr0,eax ; 更改后的字送至控制寄存器中 <br />jmp codesel:go_pm <br />bits 32 <br />go_pm : <br />mov ax,datasel <br />mov ds,ax ; 初始化ds和esQ其指向数据段 <br />mov es,ax <br />mov ax,videosel ; 初始化gsQ其指向显C内?<br />mov gs,ax <br />mov word [gs:0],0x741 ; 在保护模式下昄一个白色的字符A <br />spin : jmp spin ; 循环 <br />bits 16 <br />gdtr : <br />dw gdt_end-gdt-1 ; gdt的长?<br />dd gdt ; gdt的物理地址 <br />gdt <br />nullsel equ $-gdt ; $指向当前位置Q所以nullsel = 0h <br />gdt0 ; I描q符 <br />dd 0 <br />dd 0 ; 所有的D|q符都是64位的 <br />codesel equ $-gdt ; q是8h也就是gdt的第二个描述W?<br />code_gdt <br />dw 0x0ffff ; D|q符的界限是4Gb <br />dw 0x0000 <br />db 0x00 <br />db 0x09a <br />db 0x0cf <br />db 0x00 <br />datasel equ $-gdt <br />data_gdt <br />dw 0x0ffff <br />dw 0x0000 <br />db 0x00 <br />db 0x092 <br />db 0x0cf <br />db 0x00 <br />videosel equ $-gdt <br />dw 3999 <br />dw 0x8000 ; 基址?xb8000 <br />db 0x0b <br />db 0x92 <br />db 0x00 <br />db 0x00 <br />gdt_end <br />times 510-($-$$) db 0 <br />dw 0x0aa55 <br /><br /><br />把上面的代码存在一个名为abc.asm的文件之中,使用命o(h)nasm abc.asmQ将得出一个名为abc的文件。然后插入Y盘,输入命o(h)Qdd if=abc of=/dev/fd0。该命o(h)把文gabc写入到Y盘的W一扇区之中。然后重新启动系l,׃(x)看到如下的信息:(x) <br /><br />*Our os booting................ <br />* A (色) <br />* Switching to protected mode.... <br />* A (白色) <br /><br /><br />对代码的解释 <br /><br />上面l出?jin)所有的代码Q下面我对上qC码做一些解释?<br /><br />?使用的函?<br /><br />下面是代码中一些函数的说明Q?<br /><br />print_mesg 该子E序使用?jin)BIOS中断10h的功?3hQ即向屏q写一字符丌Ӏ属性控制是通过向一些寄存器中送入不同的值来实现的。中?0h是用于各U字W串操作Q我们把子功能号13h送到ah中,用于指明要打C个字W串。al寄存器中?说明?jin)光标返回的起始位置Q?表示调用函数后光标返回到下一行的行首。如果al?则表C光标位于最后一个字W处?<br /><br />昑֭被分成了(jin)几页Q在同一时刻只能昄其中的一c(din)bh指明的是号Qbl则指明要昄字符的颜Ԍcx指明要显C字W串的长度;dx指明光标的位|?卌v始的行和?。所有相兛_存器初始化完成以后,可以调用BIOS中断10h?jin)?<br /><br />get_key 使用中断16h的子功能00hQ从屏幕得到下一个字W?<br /><br />clrscr 该函C用了(jin)中断10h的另外一个子功能06hQ用于输出开始前清屏。初始化时给al中送入0。寄存器cx和dx指明要清屏的屏幕范围Q在本例中是整个屏幕。寄存器bh指明屏幕填充的颜Ԍ在本例中是黑艌Ӏ?<br /><br />?其它内容 <br /><br />E序一开始是一条短跌{指o(h)Q蟩到begin_boot处。在实模式下Q在此打C个棕色的"A"Qƈ且设|一个GDT。切换到保护模式Qƈ且打C个白色的"A"。这两种模式使用的都是自qdҎ(gu)?<br /><br />在实模式下,使用D寄存器gs指示昑֭位置Q我们用的是CGA昑֍(默认基址?xb8000)。在代码中是不是漏了(jin)一?呢?没有Q因为实模式下会(x)提供一个附加的0。这U方式也?0386l承下来?jin)。A的ASCⅡ是0x41Q?x06指明?jin)需要一个棕色的字符。该昄?x)一直持l直x下Q意键。下面要在屏q上昄一句话Q告诉用者下面马上要q入保护模式?jin)?<br /><br />启动C护模式,在进行切换时不希望此时有中断的媄(jing)响,故要关闭所有的中断(使用cli来实?。然后对GDT初始化。在整个切换q程中,?个描q符q行?jin)初始化。这些描q符对代码段(code_gdt)、数据和堆栈D?(data_gdt)Q以?qing)?f)?jin)访问显存而对昄D进行初始化。此外,q会(x)对一个空描述W进行初始化?<br /><br />GDT的基址要加载至GDTR pȝ寄存器之中。gdtrD늚W一个字加蝲的是GDT的大,在下一个双字中则加载的是基址。然后,lgdt指o(h)把把gdtD加载至GDTR寄存器中。现在已l做好了(jin)切换C护模式前的所有准备。最后一件事情就是把CR0寄存器的PE位置1。不q,即ɘq样q没有处于保护模式状态之下?<br /><br />讄?jin)PE位以后,q需要通过执行JMP指o(h)来清除处理器指o(h)预取队列。在80386中,使用指o(h)前L先将其从内存中取出,q且q行解码和寻址。然而,当进入保护模式以后,预取指o(h)信息(它还处于实地址模式)无效了(jin)。用JMP指o(h)的目的就是强q处理器攑ּ无效的信息?<br /><br />现在Q已l在保护模式下了(jin)。那么,如何(g)是在保护模式状态之下呢Q让我们来看一看屏q上q个白色的字母A。在q里Q用了(jin)数据D选择W?datase1)Ҏ(gu)据段和附加段q行?jin)初始化Q用显C段选择W?videose1)对gsq行?jin)初始化。告C的字符"A"其ASCⅡ值和属性位于[gs:0000]处,也就?b8000:0000处。@环语句得该字符一直在屏幕上显C,直至重新启动pȝ?img src ="http://www.shnenglu.com/mydriverc/aggbug/40627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mydriverc/" target="_blank">旅?/a> 2008-01-07 16:28 <a href="http://www.shnenglu.com/mydriverc/archive/2008/01/07/40627.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开发自q操作pȝ引导E序 ?/title><link>http://www.shnenglu.com/mydriverc/archive/2008/01/07/40622.html</link><dc:creator>旅?/dc:creator><author>旅?/author><pubDate>Mon, 07 Jan 2008 08:11:00 GMT</pubDate><guid>http://www.shnenglu.com/mydriverc/archive/2008/01/07/40622.html</guid><wfw:comment>http://www.shnenglu.com/mydriverc/comments/40622.html</wfw:comment><comments>http://www.shnenglu.com/mydriverc/archive/2008/01/07/40622.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/mydriverc/comments/commentRss/40622.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mydriverc/services/trackbacks/40622.html</trackback:ping><description><![CDATA[ <strong>开发自q操作pȝ引导E序</strong> <br /> <br />  当你打开计算机时发生?jin)什么? <br /><br />  1.甉|打开Q?.BIOS开始执行;3.引导E序开始执行?<br /><br />  引导E序的规定:(x)你要有一个普通的二进制文ӞCOM 格式Q;大小?12个字节;最后两个字节一定是0AA55hQ它能被载入到内存地址0x7C00?<br /><br />  工具Q?<br /><br />  NASM——是一个免费的汇编工具Q有DOS/windows/Linux三种版本Q?<br /><br />  PARTCOPY2.0——DOS下可自由往盘拯数据的Y?<br /><br />  举例Q?<br /><br />  1.Just hang…?<br /><br />  q个单的引导E序只能挂vQ?<br /><br />  hang: <br /><br />  jmp hang <br /><br />  times 512Q?Q-Q$)Q? db 0 <br /><br />  dw 0AA55h <br /><br />  q接q个引导E序Q?<br /><br />  nasm Qf bin Qo hang.bin hang.asm <br /><br />  现在你需要一张格式化盘Q传送hang.bin到磁盘的引导扇区 <br /><br />  partcopy hang.bin 0 200 Qf0 <br /><br />  ?”的意思是指从hang.bin文g的顶端开始传?<br /><br />  ?00”的意思是指拷?00个字?<br /><br />  插入盘和重新启动机器,试q个引导E序?<br /><br />  2.一个实模式下的引导E序 <br /><br />  上面的程序非常简单,下面介绍一个稍微复杂一点的E序?<br /><br />  bits 16 <br /><br />  org 0x7C00 <br /><br />  start: <br /><br />  cliQ关中断 <br /><br />  mov ax,0x9000Q设|堆栈址Q?x90000 <br /><br />  mov ss,ax <br /><br />  mov sp,0 <br /><br />  stiQ开中断 <br /><br />  l1:push ds <br /><br />  mov dl,0Q?<br /><br />  重新讄盘控制?<br /><br />  mov ax,0 <br /><br />  int 13h <br /><br />  pop ds <br /><br />  jc fail <br /><br />  push es <br /><br />  mov ax,0x1000QES:BX=10000 <br /><br />  mov es,ax <br /><br />  mov bx,0 <br /><br />  mov ah,2Q读盘扇区 <br /><br />  mov al,5Q读?个扇?<br /><br />  mov cx,2Q柱面号=0Q扇区号=2 <br /><br />  mov dx, 0Q磁头号=0Q驱动器?0 <br /><br />  int 13hQES:BX=来自盘上的数据 <br /><br />  pop es <br /><br />  jc l1 <br /><br />  mov ax,0x10000Q设|段寄器 <br /><br />  mov es,ax <br /><br />  mov ds,ax <br /><br />  push ax <br /><br />  mov ax,0 <br /><br />  push ax <br /><br />  retf <br /><br />  fail: <br /><br />  jmp fail <br /><br />  times 512Q?Q-Q$)Q? db 0 <br /><br />  dw 0AA55h <br /><br />  q接q个引导E序Q?<br /><br />  nasm Qf bin Qo boot.bin boot.asm <br /><br />  传送boot.bin到磁盘的引导扇区 <br /><br />  partcopy boot.bin 0 200 Qf0 <br /><br />  Z(jin)使程序可以看刎ͼ在编译下面程?<br /><br />  mov ax,1000hQ修Ҏ(gu)寄存?<br /><br />  mov ds,ax <br /><br />  mov es,ax <br /><br />  mov si,msgQ打?"JIPPIKAYE!" <br /><br />  call putstr <br /><br />  hang:Q挂?<br /><br />  jmp hang <br /><br />  putstr: <br /><br />  lodsb <br /><br />  or al,al <br /><br />  jz short putstrd <br /><br />  mov ah,0x0E <br /><br />  mov bx,0x0007 <br /><br />  int 0x10 <br /><br />  jmp putstr <br /><br />  putstrd: <br /><br />  retn <br /><br />  msg db 'JIPPIKAYE!',13,10,0 <br /><br />  q接和传送:(x) <br /><br />  nasm Qf bin Qo boot.bin boot.asm <br /><br />  partcopy boot.bin 0 200 Qf0 200 <br /><br />  在partcopy中最后一个参数?00”意思是指磁盘的偏移地址插入盘和重新启动机器,你会(x)看到“JIPPIKAYE”然后挂赗?<br /><br /><br /><br />本文转自 <br /><br /><a >http://www.woos.cn/bbs/read.php?tid=72</a><br /><img src ="http://www.shnenglu.com/mydriverc/aggbug/40622.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mydriverc/" target="_blank">旅?/a> 2008-01-07 16:11 <a href="http://www.shnenglu.com/mydriverc/archive/2008/01/07/40622.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.xbxb1314.cn" target="_blank">ŷ˾þƬ</a>| <a href="http://www.b42k.cn" target="_blank">þһٸ</a>| <a href="http://www.t421.cn" target="_blank">һþaþþƷۺҹҹ</a>| <a href="http://www.fsxslvs.cn" target="_blank">2021ƷþþƷ</a>| <a href="http://www.lushihu.cn" target="_blank">þþ99ƷƬĻ</a>| <a href="http://www.yinxingcun.com.cn" target="_blank">þþһ</a>| <a href="http://www.qxmobile.cn" target="_blank">þþþþþƷѿSSS</a>| <a href="http://www.t55n3z.cn" target="_blank">þ޾Ʒϵַ</a>| <a href="http://www.ycs8.cn" target="_blank">ɫ8ŷ˾þۺϵ</a>| <a href="http://www.ruan8.cn" target="_blank">þþƷ޾Ʒŷ</a>| <a href="http://www.sc-cits.com.cn" target="_blank">þþƷҹɫA</a>| <a href="http://www.dl-dr.cn" target="_blank">þþþù</a>| <a href="http://www.reboc.cn" target="_blank">þþþþϸApp</a>| <a href="http://www.cjlxz.cn" target="_blank">ŷ޹Ʒþ</a>| <a href="http://www.linkyes.cn" target="_blank">һþaþþƷvrۺ</a>| <a href="http://www.7111393.cn" target="_blank">þ99ڹ</a>| <a href="http://www.whchangxin.com.cn" target="_blank">97þóƷ2021</a>| <a href="http://www.facz.cn" target="_blank">ѹ99þþ㽶</a>| <a href="http://www.puruimu.cn" target="_blank">ŮƷþþ</a>| <a href="http://www.iqyyh.cn" target="_blank">ĻӰӾþþ</a>| <a href="http://www.911sss.cn" target="_blank">ŷղþ99</a>| <a href="http://www.jrtz232.cn" target="_blank">þþþ뾫Ʒ</a>| <a href="http://www.yonganwl.cn" target="_blank">Ʒþþþþù</a>| <a href="http://www.jywxhs.cn" target="_blank">þþƷ˵</a>| <a href="http://www.douyinyutang.cn" target="_blank">ƷһþaaaƬ</a>| <a href="http://www.80xz.cn" target="_blank">aaaƷþþùƬ</a>| <a href="http://www.englishtutor.com.cn" target="_blank">þþƷƷ޾Ʒ </a>| <a href="http://www.bttzc.cn" target="_blank">þþþAVۺϲҰ</a>| <a href="http://www.liuyunying.cn" target="_blank">þþƷ99þ㽶</a>| <a href="http://www.suba400.cn" target="_blank">þþƷһۺ</a>| <a href="http://www.lpnppddrppp.cn" target="_blank">þþƷAVӰ</a>| <a href="http://www.dgtspcb.com.cn" target="_blank">þùƵ</a>| <a href="http://www.xin-qi.com.cn" target="_blank">vĻþ</a>| <a href="http://www.hfpump.com.cn" target="_blank">9999Ʒŷþþþþ </a>| <a href="http://www.ybyibao.cn" target="_blank">2021Ʒҹþ</a>| <a href="http://www.jcfw-1.cn" target="_blank">ھƷþþþӰԺձ</a>| <a href="http://www.kaczw3.cn" target="_blank">þþþùƵӰ</a>| <a href="http://www.lafei-pingtai.cn" target="_blank">þҹɫƷվ</a>| <a href="http://www.qwkhd.cn" target="_blank">þۺ¶þü</a>| <a href="http://www.hrwp.net.cn" target="_blank">99þùۺϾƷ鶹</a>| <a href="http://www.gxyy.org.cn" target="_blank">ۺϾþþƷɫ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>