于渊

Stupid is as stupid does.

于渊ID:forrestyu
46296次访问,排名2337好友0人,关注者14
forrestyu的文章
原创 13 篇
翻译 0 篇
转载 1 篇
评论 199 篇
最近评论
wzhiw8223:to all:
关于显存写操作的问题已经解决。
原因真的是看漏眼了,不过不是对.asm代码,而是对.inc里的宏定义。我定义DA_DPL3=03h了,应该是DA_DPL3=60h。不过让我真正细心地去看.inc里的定义,还是在经历一翻分析之后:
  既然是写显存时出问题,那肯定与寄存器gs有关,也就是与gs关联的显存段选择子SelectorVideo……
wzhiw8223:向大伙请教一个问题:
  我根据章节“3.2.3.3 不同特权级代码段之间的转移 – 5.进入ring3”所叙述的功能及代码介绍,写了pmtest5.asm的代码。可是编译后运行有错误导致DOS重启,我已经调试出了出错的代码指令了,就是为打印进入保护模式信息“In Protect Mode Now.^-^”而写显存的指令mov [gs:edi], ax出错。
  查了整……
wzhiw8223:TO:dj123jary
1. 用VPC新建一个PC,,命名为Linux,其中在安装操作系统步骤里选择“Linux”
2. 在VPC的界面中选择新建Linux,点击“启动系统”,界面提示插入启动盘的信息
3. 把Linux安装光盘放到光驱
4. 在菜单在选择"CD->载入主机驱动器",然后按回车,熟悉的Linux安装界面就出来了
5. ……
myselfzp1007:于大哥好
dj123jary:你好
于大哥!
菜鸟问题:virtual pc怎样安装Red Hat9,请你赐教,小弟不甚感激,急急急.........,否则学不下去了
文章分类
    收藏
      相册
      链接
      vmg转txt的bash脚本
      修改后的N6510驱动(for gnokii)
      借助gnokii获取手机上的短信,并转成自己喜欢的格式
      成批将vmg转成txt的脚本(依赖vmg2txt)
      我的.fvwm2rc
      我的.fvwm2rc用到的图图
      走进程序世界的田园(上)
      存档
      软件项目交易
      订阅我的博客
      XML聚合  FeedSky
      订阅到鲜果
      订阅到Google
      订阅到抓虾
      订阅到BlogLines
      订阅到Yahoo
      订阅到GouGou
      订阅到飞鸽
      订阅到Rojo
      订阅到newsgator
      订阅到netvibes

      原创 有关《自己动手写操作系统》的问题请在此回复收藏

      新一篇: Ubuntu使用笔记 | 旧一篇: Ubuntu at AMD64 with GeForce6100+nForce 410 chipsets

      有关《自己动手写操作系统》的问题请在此回复。
      无论是问题还是指教,我都将非常感谢!

      发表于 @ 2006年05月07日 13:28:00|评论(loading...)|编辑

      新一篇: Ubuntu使用笔记 | 旧一篇: Ubuntu at AMD64 with GeForce6100+nForce 410 chipsets

      评论

      #farsky16 发表于2006-05-11 09:18:00  IP: 218.249.89.*
      请问第三章pmtest2例子:保护模式切回到实模式为什么必须从16位代码段中返回?我的意思是说那些操作放在32位代码段中不行吗?
      这个问题困惑我很久了,谢谢!
      #Forrest 发表于2006-05-20 14:21:00  IP: 59.80.126.*
      请见书中第55页最下面。
      #farsky16 发表于2006-05-28 22:15:00  IP: 222.130.189.*
      谢谢你的回答!不过我不明白的也正是这句话:“无法实现从32位代码段返回时CS高速缓冲寄存器中的属性符合实模式的要求(实模式不能改变段属性)”。不明白这句话的意思,能否请你在论坛中解答一下?
      http://forum.broadview.com.cn/viewtopic.php?t=1761
      #afei 发表于2006-06-07 00:14:00  IP: 222.248.238.*
      有个问题请教:
      在pmtest5.asm中通过调用门从ring3到ring0时,下面这段代码运行在ring0,而SelectorVideo是在ring3,怎么可以显示字符?我自己照样子写了一段代码,运行到这里就崩溃了,如果去掉显示字符,一切正常。请帮忙解释一下。

      [SECTION .sdest]; 调用门目标段
      ALIGN 32
      [BITS 32]

      LABEL_SEG_CODE_DEST:
      mov ax, SelectorVideo
      mov gs, ax ; 视频段选择子(目的)

      mov edi, (80 * 12 + 0) * 2 ; 屏幕第 12 行, 第 0 列。
      mov ah, 0Ch ; 0000: 黑底 1100: 红字
      mov al, 'C'
      mov [gs:edi], ax

      ; Load LDT
      mov ax, SelectorLDT
      lldt ax

      jmp SelectorLDTCodeA:0 ; 跳入局部任务,将打印字母 'L'。

      ;retf

      SegCodeDestLen equ $ - LABEL_SEG_CODE_DEST
      ; END of [SECTION .sdest]
      #Forrest 发表于2006-06-13 01:19:00  IP: 221.223.30.*
      to farsky16, 请原谅我偷一次懒吧!你自己看看杨季文的《80X86汇编语言程序设计教程》第388页。
      #Forrest 发表于2006-06-13 01:22:00  IP: 221.223.30.*
      to afei: ring0下是可以访问DPL为3的数据的,请见书第63页。
      #胡章优 发表于2006-07-01 15:06:00  IP: 219.217.5.*
      您好,于渊大哥,买了一本您的书籍,非常非常的感谢您能写出如此的书籍。
      我为了您的书籍,特意写了一篇日志:
      请看:
      http://www.libing.net.cn/boblog/read.php?359
      #xulx 发表于2006-07-09 23:52:00  IP: 219.239.227.*
      你好,你能给我一份turbo debugger的下载地址吗?我找了好久也没找到,只有windows下的。
      谢谢,如果能把改软件直接发给我的话,那就更好了。
      xulx2007@163.com
      #xulx 发表于2006-07-19 23:36:00  IP: 219.239.227.*
      你好,为什么我在编译时nasm提示每个段名不合法,比如:
      [SECTION .s32]
      nasm不认 .s32
      why?
      #Forrest 发表于2006-07-21 01:24:00  IP: 221.223.17.*
      报什么错?
      #xulx 发表于2006-07-24 23:39:00  IP: 219.239.227.*
      就是说段名不认识:
      segment name 's32' not recognized
      但是 .text又可以?

      另外一个问题:
      在加载成功KERNEL.BIN到8000:000后,进入保护模式,设置好分页等工作以后,我用jmp指令想跳到kernel处执行,因为我写得一个简单的kernel是在dos下写的com文件,并不是书中说的ELF格式。
      jmp 80000;此处加不加SelectorFlatC:应该一样吧
      但是不能成功,在VM下回重启虚拟机。
      什么原因?是不是在实模式下编译的程序在保护模式下不能执行,那为什么loader.bin又可以?还是什么别的原因?
      (我用debug调试过loader.bin的加载代码,kernel.bin确实是被加载成功了的。)


      谢谢Forrest!
      #xulx 发表于2006-07-24 23:40:00  IP: 219.239.227.*
      就是说段名不认识:
      segment name 's32' not recognized
      但是 .text又可以?

      另外一个问题:
      在加载成功KERNEL.BIN到8000:000后,进入保护模式,设置好分页等工作以后,我用jmp指令想跳到kernel处执行,因为我写得一个简单的kernel是在dos下写的com文件,并不是书中说的ELF格式。
      jmp 80000;此处加不加SelectorFlatC:应该一样吧
      但是不能成功,在VM下回重启虚拟机。
      什么原因?是不是在实模式下编译的程序在保护模式下不能执行,那为什么loader.bin又可以?还是什么别的原因?
      (我用debug调试过loader.bin的加载代码,kernel.bin确实是被加载成功了的。)


      谢谢Forrest!
      #xulx 发表于2006-07-26 20:31:00  IP: 219.239.227.*
      section的问题已经解决了。
      #东东 发表于2006-08-02 19:15:00  IP: 221.9.92.*
      今天刚买了您的大作,刚刚看序言~~真是感动万分,每句话都说到我心里了
      #zwolfox 发表于2006-08-03 23:23:00  IP: 60.12.0.*
      有什么工具可以生成floppy的image文件,
      我的floppy驱动坏了,想用boch模拟,可是怎么生成这个文件呢?
      #xulx 发表于2006-08-04 11:39:00  IP: 219.239.227.*
      zwolfox:
      利用VMware可以生成image文件。另外,《自》书中也有工具吧。
      #Maple-x 发表于2006-08-04 17:35:00  IP: 219.237.194.*
      在NTFS格式的共享文件中的DOS程序是不是有问题?我在虚拟机里执行DOS程序不成功。......
      #xulx 发表于2006-08-05 14:51:00  IP: 219.239.227.*
      Forrest:
      我实践过程中遇到了一个问题:
      对应书中的P282,我得系统调用的代码为:
      _syscall: ; when int 0x80,cpu is in PROC context
      pushad
      push ds
      push es
      push fs
      push gs
      ;; TSS.ss0 has been set to point to KERNEL_DS,so..
      mov dx,ss
      mov ds,dx
      mov es,dx

      inc byte [gs:170]

      mov esi,esp ; first ,we saved esp
      ;; now switch to kernel stack
      mov esp,StackTop ; esp --> ring0'stacktop ( kernel stack )

      ; sti ; enable interrutps

      mov eax,0
      ;; call _sys_get_ticks
      call [syscall_table+eax*4] ; call syscall_X
      ;; push eax
      ;; call dispint
      ;; pop eax
      ;; jmp $
      cli ; disable all interrupts

      mov esp,[pCurProcess] ; we saved esp before to avoid clock handler changed the pCurProcess
      ;; be ceareful of the codes below
      ;; because we don't call schedule,so we don't need reset Tss.esp0
      mov dword[esp+KERNELESPREG+4*4],eax ; set the returned value saved in EAX of the current proc

      pop gs
      pop fs
      pop es
      pop ds
      popad

      iretd

      此句:
      mov esp,[pCurProcess]
      我在保存好现场后,把esp保存在了esi中,为什么我把上一句改为:
      mov esp,esi
      就运行不正常。我故意用:sti 防止处理期间出现中断,并且我的syscall_table+eax*4 对应的函数使用c写的,按说esi的值是不应该会变的啊?

      我个人认为此处把esp恢复到原来的值更好些,因为有可能在系统调用期间,调度函数会更改当前的进程的值。当然,按照书中的代码,因为防止重入,所以这样处理也没有问题。不知我的想法对不对?

      另外一点。书上在处理中断时,首先禁止掉了同一个irq的中断,这样的话,防止中断重入也就成了防止别的irq的中断在此中断过程期间进入其自身的实际处理过程(当然不包括保存和恢复现场)?是这样的吗?
      #Forrest 发表于2006-08-07 12:42:00  IP: 221.223.37.*
      to xulx,

      “sti 防止处理期间出现中断”--sti是开中断吧

      “我的syscall_table+eax*4 对应的函数使用c写的,按说esi的值是不应该会变的啊”--确认它是不是改变了esi的好办法是用一个nop指令取代call [syscall_table+eax*4],然后再执行一遍,看是不是还会不正常。

      “我个人认为此处把esp恢复到原来的值更好些……”--书282页对应的代码是/chapter6/g/kernel/kernel.asm,里面的sys_call执行完毕之后会马上执行restart它里面的第一句就是恢复esp的值啊:mov esp, [p_proc_ready]。不知道你说的是不是这一点。

      很高兴看到你的这些问题,如果发现我的代码有任何的不妥,请一定告诉我。:)
      #xulx 发表于2006-08-07 15:19:00  IP: 219.239.227.*
      to Forrest:
      sti是开中断,我些错了。:(

      关于:mov esp, [p_proc_ready]
      我理解你的意思,我开始想的是应该恢复到进入syscall的进程,你这样更好。
      交流就是好,前几天一位我那样处理会好些,呵呵
      谢谢!
      #xulx 发表于2006-08-07 15:57:00  IP: 219.239.227.*

      to Forrest:
      sti是开中断,我写错了。:(

      关于:mov esp, [p_proc_ready]
      我理解你的意思,我开始想的是应该恢复到进入syscall的进程,你这样更好。
      交流就是好,前几天一位我那样处理会好些,呵呵
      谢谢!
      #xulx 发表于2006-08-07 17:41:00  IP: 219.239.227.*

      to Forrest:
      sti是开中断,我些错了。:(

      关于:mov esp, [p_proc_ready]
      我理解你的意思,我开始想的是应该恢复到进入syscall的进程,你这样更好。
      交流就是好,前几天一位我那样处理会好些,呵呵
      谢谢!


      另外一个问题请教:
      我照书上写了一个系统调用,同时运行3个进程,调度程序的算法和书上有些不同,但能够正常工作(我测试很久了)。问题是:在每个进程体中直接使用进程调用:get_ticks(),3个进程都能按照期望的规律运行,并且打印出来的ticks的值也显示系统调用正常。但是如果使用一个milli_delay()函数(同书本的一摸一样),在进程a中调用延迟函数(而其他的进程使用的是循环延迟),则工作不正常。情况是:开始几秒钟正常,然后就一直在进行系统调用,没有发生时钟中断(观察不到跳动的字符)。这是什么原因啊?能帮忙分析一下吗?已困扰我很久了。
      我开始想是不是应为在syscall的代码里面开中断和关中断(sti和cli)之间的太少,使得时钟中断一直被屏蔽了,可是我在syscall的代码里面(确切的说是在_get_ticks的代码里面)加入一个循环,却也是这样。
      Help me!!(我用的是VM)
      #Forrest 发表于2006-08-08 01:01:00  IP: 221.223.37.*
      把相关代码发给我看一下吧:forrest.yu[AT]gmail[d0t]c0m。
      #maple-x 发表于2006-08-08 00:34:00  IP: 221.219.115.*
      楼上的朋友,问一下你用VM怎么实现文件共享的
      #伟杰 发表于2006-08-13 13:01:00  IP: 60.216.87.*
      呵呵,Forrest,有什么新作的计划啊,这阵子暂时还没去北京,先在这里给你捧捧场,前几天刚刚跟Summer,Tom他们吃了顿饭,兄弟们见面的机会比以前少多了,不过Jack他们都应当离你不远。
      #李祥光 发表于2006-08-23 00:29:00  IP: 222.212.98.*

      老兄
      你好
      最近忙吧?
      我看了《自己动手写操作系统》,你的文笔真的不错,程序也是。最近在实验其中的小程序是时候发现有个程序有两个小BUG:
      http://writeos.com/writeos/bbs/showbbs.asp?bd=6&id=40&totable=1
      有空看看哈?老兄
      李祥光
      成都
      #xulx 发表于2006-08-24 23:52:00  IP: 219.239.227.*
      这段时间回家了,上网不方便,所以没来看。马上发给你

      TO maple-x:
      是说我吧?我是winXP里面运行redhat9,使用mount命令就可以了啊
      #Forrest 发表于2006-08-25 13:44:00  IP: 221.218.226.*
      to 伟杰,听说Jack兄买了套大房子,我打算有空去看看呢。:)
      你啥时候来啊?
      #Forrest 发表于2006-08-25 13:51:00  IP: 221.218.226.*
      to 李祥光,感谢你的细心,的确有个bug。
      你的修改汇编代码的方法是我的原意,粗心忘掉加[]了,*^-^*。

      修改的方法,可以直接将 num1st 和 num2nd 改成 dword [num1st] 和 dword [num2nd] ,不用通过寄存器eax的,修改后的 foo.asm 变成:

      extern choose ; int choose(int a, int b);

      [section .data] ; 数据在此
      num1st dd 3
      num2nd dd 4

      [section .text] ; 代码在此

      global _start ; 我们必须导出 _start 这个入口,以便让链接器识别。
      global myprint ; 导出这个函数为了让 bar.c 使用

      _start:
      push dword [num2nd] ; ┓
      push dword [num1st] ; ┃
      call choose ; ┣ choose(num1st, num2nd);
      add esp, 4 ; ┛

      mov ebx, 0
      mov eax, 1 ; sys_exit
      int 0x80 ; 系统调用

      ; void myprint(char* msg, int len)
      myprint:
      mov edx, [esp + 8] ; len
      mov ecx, [esp + 4] ; msg
      mov ebx, 1
      mov eax, 4 ; sys_write
      int 0x80 ; 系统调用
      ret

      谢谢你。:)
      #李祥光 发表于2006-08-25 20:52:00  IP: 222.212.96.*
      于渊老兄,
      你好
      顺便问一下,你家是山东的吗?
      我说是有两BUG,
      还有个是:

      _start:
      push dword [num2nd] ;
      push dword [num1st] ;
      call choose ;
      add esp, 4 ; ┣ 这句,我觉得应该是add esp, 8;

      你没有注意到啊
      #Forrest 发表于2006-08-25 22:24:00  IP: 221.218.225.*
      是的呵呵,应该是8。总共几行的程序,居然错了这么多,不好意思,不好意思……

      我是山东人,从哪儿看出来滴?
      #李祥光 发表于2006-08-25 23:09:00  IP: 222.212.110.*
      程序是人写的吗,人非圣贤,谁能无过呢
      我是徐州沛县的
      我妈老家是山东的
      我觉得山东人特别有中国文化底蕴的感觉
      就像海尔这样的公司能出在山东不是偶然的
      不好意思,我随便吹吹的
      #李祥光  发表于2006-08-25 23:26:00  IP: 222.212.110.*
      “程序是人写的嘛,人非圣贤,谁能无过呢 ”
      对不起,老兄,我刚才打错一个字^_^
      #Forrest 发表于2006-08-27 00:40:00  IP: 221.223.38.*
      呵呵,沛县就在山东旁边啊。:)
      中国的文化底蕴,很文化糟粕是纠缠在一起的……
      --不太想在技术论坛聊这些呵呵,有机会在别处聊.:)
      #Forrest 发表于2006-08-31 13:15:00  IP: 221.218.231.*
      谁告诉你我的英语棒了呵呵?

      我觉得读技术类的英文还好吧,多读几篇就差不多习惯了。我的英文也不好的,我想等我读得更多了,或许会好起来吧。:)

      我上学的时候学过一门课叫做 Econometrics,用的是英文版课本(我想你可能也学过英文版课本的课程),英文版课本不重要,重要的是老师说了一句话:你们一开始读会不习惯,等读到后来就习惯了。遗憾的是当时我好像到最后也没读几页,不过这话我记住了。

      “一开始读会不习惯,等读到后来就习惯了”--读得不爽的时候就想想这一句呵呵。
      #love_kernel 发表于2006-08-31 10:35:00  IP: 218.247.215.*
      请问一下:为什么你的英语那么棒呢?读原版文会觉得吃力吗?你有没有考过英语等级?
      #love_kernel 发表于2006-09-01 10:16:00  IP: 218.247.215.*
      因为在你书中说把Intel的三卷手册都看完了,所以我猜测你的英文一定很厉害啦。

      我没有学过英文版课程,英语水平也很差,因为我就没上过正经的大学(这个理由好像不是很充足,呵呵)。在看了你的书之后,也信心十足地下载了Intel手册,在金山词霸的辅助下,花半天功夫勉强翻了不到两页,对文中意思还是云里雾里的,只好放弃了这种吃力不讨好的想法。

      感觉你现在不是在做技术类工作似的,我想以你的实力,在国内找个符合你兴趣的牛公司应该是件很easy的事,为什么不呢?
      很希望能再到你这本书的续篇!
      #love_kernel 发表于2006-09-06 09:45:00  IP: 218.247.215.*
      请问:你在写这本书之前看过《操作系统:设计与实现》一书吗?我想知道在实践一个自己的操作系统之前,需要哪些准备知识?
      #jronald 发表于2006-09-09 17:15:00  IP: 222.64.177.*
      为什么不用int 10h来显示字符?而要写显存。
      有什么区别。
      #Forrest 发表于2006-09-10 12:46:00  IP: 221.223.35.*
      to love_kernel,

      《自己动手写操作系统》这本书的初衷之一,其实就是作为读《操作系统:设计与实现》的预备知识呢。:) 书里基本上涉及了开始写一个操作系统需要准备的基本知识,当然,介绍得可能不足够详尽,但我想简单的介绍可以让你入一个门。入了门,深造也就容易了。
      #Forrest 发表于2006-09-10 12:50:00  IP: 221.223.35.*
      to jronald,
      写显存的方式在实模式和保护模式下都可以用。
      #Forrest 发表于2006-09-10 13:37:00  IP: 221.223.35.*
      to love_kernel,

      《自己动手写操作系统》这本书的初衷之一,其实就是作为读《操作系统:设计与实现》的预备知识呢。:) 书里基本上涉及了开始写一个操作系统需要准备的基本知识,当然,介绍得可能不足够详尽,但我想简单的介绍可以让你入一个门。入了门,深造也就容易了。
      #jronald 发表于2006-09-11 16:31:00  IP: 58.34.189.*
      那在保护模式下得设置一个显存的段描述符,不如在保护模式下增加一个中断用来显示字符串,好像更通用一些。
      #jronald 发表于2006-09-11 16:31:00  IP: 58.34.189.*
      那得在保护模式下得设置一个显存的段描述符,不如在保护模式下增加一个中断用来显示字符串,好像更通用一些。
      #jronald 发表于2006-09-11 16:32:00  IP: 58.34.189.*
      那得在保护模式下得设置一个显存的段描述符,不如在保护模式下增加一个中断用来显示字符串,好像更通用一些。
      #jronald 发表于2006-09-11 16:33:00  IP: 58.34.189.*
      emacs中能否运行基本的lisp程序。

      我刚开始学lisp,想做一些基础的练习。

      谢谢。
      #jronald 发表于2006-09-11 16:33:00  IP: 58.34.189.*
      emacs中能否运行基本的lisp程序。

      我刚开始学lisp,想做一些基础的练习。

      谢谢。
      #jronald 发表于2006-09-11 16:37:00  IP: 58.34.189.*
      blog刷新的有点慢,发重复了。
      那个emacs的问题是粘帖错了。
      删除不了了。
      不好意思。
      #Forrest 发表于2006-09-13 23:03:00  IP: 221.223.21.*
      “在保护模式下增加一个中断用来显示字符串”--你指的是……?
      #jronald 发表于2006-09-14 03:25:00  IP: 222.64.164.*
      在保护模式下增加中断号为10h的中断处理函数,参数和bios 10h显示字符串的一致。这样只要写一个中断处理函数,不用考虑别的问题了,如include不必要内容。显存的处理也被封装了。
      不知道可不可行?
      #Forrest 发表于2006-09-14 12:07:00  IP: 221.223.21.*
      "显存的处理也被封装了"--到头来还是要写显存的呀。感觉那样更复杂了呵呵,本来写显存并不难的,mov就可以了。

      不过应该是可行的。:)

      另:你学的是lisp的哪个分支?Scheme?在Windows下还是Linux下?参考的是什么资料?
      #jronald 发表于2006-09-15 02:08:00  IP: 222.64.176.*
      确实更复杂了,虽然实模式和保护模式下可以有相同的接口了,但只是模似的结果。
      只include必要内容的要求好像有些过份。
      你的书上有两个函数分别的两种模式下显示字符串,为什么不写成一个函数,在内部判断处于哪种模式,然后分别处理。
      不过这样,效率就差些了。

      另外,我在学Emacs Lisp,windows下,主要参考Emacs自带文档和《learn gnu emacs 3rd》。lisp很有意思啊,不过我现在还很菜。
      #Forrest 发表于2006-09-15 17:09:00  IP: 221.223.37.*
      你或许可以看一下SICP。
      http://mitpress.mit.edu/sicp/
      有一个中文版,但是翻译得不好,所以直接看英文版应该会好些。我看了个开头,打算找时间看完它。
      #jronald 发表于2006-09-17 08:30:00  IP: 222.64.177.*
      谢谢。
      我发现<ansi common lisp>不错
      http://www.cublog.cn/opera/showart.php?blogid=4614&id=98703
      #ongzi 发表于2006-09-22 11:52:00  IP: 59.59.200.*
      我现在在学习您的书,遇到了几个问题
      1. 您书上P170的第8行:memcpy(p_vaddr,BaseOfLoaderPhyAddr + p_offset, p_filesz);
      我觉得您是不是笔误了啊,BaseOfLoaderPhyAddr应该是BaseOfKernelPhyAddr吧?
      2. 我参考您书上的代码\chapter5\e自己写了一个。
      可是在linux上运行 bochs时候出现这样的错误:
      Bochs is exiting with the following message:
      floppy recal:fo7:ctrl not ready

      我的代码具体是这样的:在boot.asm里就把kernel.bin拷贝到80000H下了.(所以就没有象\chapter5\e\loader.asm那样去搜索软盘了)
      kernel.bin也是编译为ELF格式的,连接的时候也用-Ttext 30400h,可是再call InitKernel后
      jmp SelectorFlatc:KernelEntryPointPhyAddr的时候在linux下就出了这个问题。



      这个问题我现在的解决办法是->链接的时候不用-Ttext命令。然后链接完后查看kernel.bin文件。搜索BF04,然后看他所在的地址。 这就是Kernel.bin的入口地址。然后我没有callInitKernel,也就是说不把他考到30000H下。而是直接跳到BF04所在的地址下。虽然暂时解决了上面这个问题。可是以后我在kernel.asm里添其他代码的时候,这个BF04的地址是会变的。所以变成只要我改动一次kernel.asm我就要去从新设置jmp的地址。

      3.我用我上面说的这个解决办法跳到了kernel.bin后可以打出K了。可是问题又来了,我照着您\chapter5\g一摸一样的写了一个的打印-----“cstart”begins-----,就是怎么也显示不出这行字串。按道理进里kernel就和你的程序一点差别都没了呀,怎么会显示不出来啊!

      所以您能否半我看看怎么解决,我都快去撞墙了,这个事情整了我3天了。救救我吧。我的mail:ongzi@126.com,您如果有时间的话,帮我看看好吗???
      #ongzi 发表于2006-09-22 16:34:00  IP: 59.59.203.*
      再请问一个问题 怎么把重新编译好的loader.bin和kernel.bin文件写入floppy.img中啊,你书里面都没有提到过
      #ongzi 发表于2006-09-25 11:07:00  IP: 59.59.203.*
      于渊.是不是<<自>>的问题回复搬家了.这么久都没回音,如果搬家了告诉我一下网址好吗
      #Forrest 发表于2006-09-26 16:06:00  IP: 222.131.251.*
      ongzi,不好意思,周末有点事,就没来。

      1. P170的第8行的确错了,谢谢你的指正。

      2. 有一个问题不知道你是不是忽略了,就是编译好了的kernel.bin中的虚拟地址必须同样被放置到内存中相应的地址,否则在读数据或者执行与绝对地址相关的指令时,就容易出现问题。

      3. 你可以将floppy.img用mount命令挂载到文件系统,然后将loader.bin和kernel.bin拷贝进去,用cp命令。--我记得我应该是在书上提到了呀,刚才自己也没找到,等有空再仔细找找。
      #ongzi 发表于2006-09-27 14:18:00  IP: 125.79.129.*
      Forrest:
      谢了.第3个问题解决了,第2个问题还是没解决.

      第2个问题暂时先放一放.

      我现在有个疑问. 就是书上P98页

      表3-10 列出的内存情况
      0009FC00H----0009FFFFH这段和000E0000H----000FFFFFH
      之间的那段内存的使用情况为什么没有打印出来?
      #jack 发表于2006-10-20 09:27:00  IP: 60.28.140.*
      按作者的方法用vritual pc 装 ms-dos7.10 然后运行.com文件得到的结果是
      "emm386:unrecoverable privileged operation error #n9.press enter to reboot.." 请问是怎么会事啊????请高手指点!
      .com文件一定是没问题的,我运行的是你的.com文件,请问你们都装的哪个版本的dos啊,能给我个下载路径么?我怀疑是dos的问题!上google上搜了一下,也没有答案.
      不过感觉真的很榜,爽啊!嘿嘿,自己写系统!不过困难也多多啊!希望有个论坛什么的地方,好供学习的朋友一起讨论啊!
      我的邮箱:startxue@hotmail.com
      #jack 发表于2006-10-20 09:34:00  IP: 60.28.140.*
      按作者的方法用vritual pc 装 ms-dos7.10 然后运行.com文件得到的结果是
      "emm386:unrecoverable privileged operation error #n9.press enter to reboot.." 请问是怎么会事啊????请高手指点!
      .com文件一定是没问题的,我运行的是你的.com文件,请问你们都装的哪个版本的dos啊,能给我个下载路径么?我怀疑是dos的问题!上google上搜了一下,也没有答案.
      不过感觉真的很榜,爽啊!嘿嘿,自己写系统!不过困难也多多啊!希望有个论坛什么的地方,好供学习的朋友一起讨论啊!
      我的邮箱:startxue@hotmail.com
      #jack.zuo 发表于2006-10-20 09:55:00  IP: 60.28.140.*
      按作者的方法用vritual pc 装 ms-dos7.10 然后运行.com文件得到的结果是
      "emm386:unrecoverable privileged operation error #n9.press enter to reboot.." 请问是怎么会事啊????请高手指点!
      .com文件一定是没问题的,我运行的是你的.com文件,请问你们都装的哪个版本的dos啊,能给我个下载路径么?我怀疑是dos的问题!上google上搜了一下,说要修改Config.sys文件,也不知道怎么该?

      不过感觉真的很榜,爽啊!嘿嘿,自己写系统!不过困难也多多啊!希望有个论坛什么的地方,好供学习的朋友一起讨论啊!
      我的邮箱:startxue@hotmail.com
      #jack.zuo 发表于2006-10-23 09:19:00  IP: 60.28.140.*
      问题解决了!进dos修改config.sys文件,把emm去掉,呵呵!
      #axx1611 发表于2006-12-24 16:02:40  IP: 219.131.196.*
      请问pmtest8.asm换页为什么要重新设置整个页表??
      理论上只要将需要换页的两个页面的的映射关系作一下调整就可以了吧??

      我自己动手尝试了这个方法,结果是输出了
      Foa
      ba
      令我百思不得其解
      #axx1611 发表于2006-12-24 16:07:25  IP: 219.131.196.*
      还有一点想说一下
      我一直使用VM裸机写的程序,其中的初始化描述符表代码总是会罢工,类似:

      xor eax, eax
      mov ax, cs
      shl eax, 4
      add eax, LABEL_SEG_CODE32
      mov word [LABEL_DESC_CODE32 + 2], ax
      shr eax, 16
      mov byte [LABEL_DESC_CODE32 + 4], al
      mov byte [LABEL_DESC_CODE32 + 7], ah
      我全部改作:
      mov eax, LABEL_SEG_CODE32
      mov word [LABEL_DESC_CODE32 + 2], ax
      shr eax, 16
      mov byte [LABEL_DESC_CODE32 + 4], al
      mov byte [LABEL_DESC_CODE32 + 7], ah
      才能够正常工作
      我曾经用ndisasm反汇编看过前者的代码,证实了LABEL_SEG_CODE32是一个32位值,如果
      xor eax, eax
      mov ax, cs
      shl eax, 4
      add eax, LABEL_SEG_CODE32
      反而会把段基址加两遍,造成结果错误,这么写也是没错的:
      xor eax, eax
      mov ax, cs
      shl eax, 4
      add ax, LABEL_SEG_CODE32
      #fants 发表于2006-12-28 21:44:37  IP: 202.117.20.*
      请问,那里有书上提到的turbo debugger下载?
      要求能在dos下用的
      #fants 发表于2007-01-04 16:27:05  IP:
      不用了,我找到了
      #hahaheheheihei 发表于2007-01-08 18:52:48  IP: 10.197.44.*
      于渊,你好,我也遇到xulx碰到的那个问题,编译光盘里面的pmtest2.asm时会报错:
      pmtest2.asm:11: segment name `.gdt' not recognised
      pmtest2.asm:38: segment name `.data1' not recognised
      pmtest2.asm:53: segment name `.gs' not recognised
      pmtest2.asm:64: segment name `.s16' not recognised
      pmtest2.asm:163: segment name `.s32' not recognised
      pmtest2.asm:308: segment name `.s16code' not recognised
      请问怎么解决这个问题?
      #hahaheheheihei 发表于2007-01-10 13:39:10  IP: 10.197.44.*
      问题已经解决,在linux下进行编译就没有这个问题了
      #huayanghao 发表于2007-01-14 17:21:47  IP: 155.69.56.*
      呵呵,你的书写的很不错。要是你完全抛弃windows做就好了。你用VC写的那几个程序我没用上,因为linux下有很好的替代品。bximage可以用来作任意的硬盘和软盘文件镜像,dd命令可以用来写镜像文件的MBR,非常灵活。希望以后多支持GNU/linux : )
      #lengxujun 发表于2007-01-27 21:24:21  IP: 124.161.157.*
      Forrest ,介意帮我解决一个问题(菜鸟问题)吗?
      我安装了虚拟机(Vitual PC 5.2中文版),但是实现不了共享,您能帮我解决这个问题吗?
      #lengxujun 发表于2007-01-27 22:09:13  IP:
      Forrest,再问一个问题。
      我想知道我需要有哪些关于汇编的基础才能很好的理解《自己动手写操作系统》的代码呢?(我的理解是指理解代码本身),你能不能介绍一下我需要看哪些关于汇编的书?我现在看这些代码比较吃力,以前只有些关于8086/8088汇编的浅薄经验,现在找了一个nasm的中文手册在边学边看,希望看完了这个手册后能理解这些代码。
      真的很希望你能介绍关于汇编的书给我看。谢谢!
      #axjlq 发表于2007-01-30 14:05:37  IP: 218.4.189.*
      于渊你好,我问一个关于fvwm的问题,你的fvwm可以实现中英文分别用两种字体来显示吗?你的系统用什么locale麻烦告知一下
      #forrestyu 发表于2007-01-30 14:17:55  IP: 203.86.34.*
      汇编嘛,我也没什么好建议,只是一定要自己写点代码,这样理解得才好些。
      #axjlq 发表于2007-01-30 14:21:58  IP: 218.4.189.*
      于渊你好,我问一个关于fvwm的问题,你的fvwm可以实现中英文分别用两种字体来显示吗?你的系统用什么locale麻烦告知一下
      #forrestyu 发表于2007-01-30 15:03:20  IP:
      汇编嘛,我也没什么好建议,只是一定要自己写点代码,这样理解得才好些。
      #forrestyu 发表于2007-01-31 14:03:37  IP: 203.86.34.*
      汇编嘛,我也没什么好建议,只是一定要自己写点代码,这样理解得才好些。
      #xyh5829130 发表于2007-02-04 15:31:14  IP: 125.79.148.*
      %define _BOOT_DEBUG_ ; 做 Boot Sector 时一定将此行注释掉!将此行打开后用 nasm Boot.asm -o Boot.com 做成一个.COM文件易于调试

      %ifdef _BOOT_DEBUG_
      org 0100h ; 调试状态, 做成 .COM 文件, 可调试
      %else
      org 07c00h ; Boot 状态, Bios 将把 Boot Sector 加载到 0:7C00 处并开始执行
      %endif

      mov ax, cs
      mov ds, ax
      mov es, ax
      call DispStr ; 调用显示字符串例程
      jmp $ ; 无限循环
      DispStr:
      mov ax, BootMessage
      mov bp, ax ; ES:BP = 串地址
      mov cx, 16 ; CX = 串长度
      mov ax, 01301h ; AH = 13, AL = 01h
      mov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
      mov dl, 0
      int 10h ; int 10h
      ret
      BootMessage: db "Hello, OS world!"
      times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
      dw 0xaa55 ; 结束标志


      forrestyu 你好 !
      你的这段代码 ,我把它编译成 boot。com 文件后
      在虚拟pc 的dos 下 运行 怎么没有结果显示,
      而在 虚拟pc 的dos 下的tubro debugger 下 调试运行 却可以得到显示 ,这是什么原因?
      dos 版本问题

      还是 编译问题啊?
      #xyh5829130 发表于2007-02-04 16:28:09  IP: 125.79.148.*
      我在 dos 在调试你的 pmtest1。com程序的时候 出现“处理器遇到一个随即错误,要重启 ” 而直接运行则可以看到红色的 p 。
      是说调试到32 位的代码要用 32 的调试器马?
      #dxqfjq 发表于2007-02-08 10:30:56  IP: 202.115.30.*
      那位大哥能否说下,在虚拟PC的dos下是怎么安装Tubro debugger的。另外Tubro Debugger的下载地址在哪里?

      先谢了!
      #dxqfjq 发表于2007-02-08 10:47:14  IP: 202.115.30.*
      还有个问题,P140代码4-9中:
      LABEL_FILENAME_FOUND:
      mov ax,RootDirSectors
      and di,0FFE0h ;di->当前目录的开始
      add di,01Ah ;di->首Sector
      mov cx, word[es:di]
      push cx
      add cx,ax
      add cx,DeltaSectorNo
      .......
      中的and di,0FFE0h后为什么di就是指向当前目录的开始呢?
      add di,01Ah 后为什么di就是首Sector的地址呢?
      #xyh5829130 发表于2007-02-08 21:05:32  IP:
      可以到 http://win32asm.yeah.net/ 下载 Tasm 安装到机子上 然后 在虚拟dos 共享 安装后的tasm 文件夹 就可以在虚拟dos下 使用tubro debugger了
      #daihao12345 发表于2007-03-16 11:35:14  IP: 211.140.10.*
      于渊你好 我对你的书中P186的代码有点小疑问
      *p_gdt_base = (t_32)&gdt;

      是否应该是
      *p_gdt_base = (t_32)&gdt[0];
      或者
      *p_gdt_base = (t_32)gdt;

      可能我的C语言不是很好,如果不对,请你给我解释一下,谢谢了。。
      #yubo_ccdx 发表于2007-03-26 20:42:38  IP: 58.244.35.*
      于渊你好,我也姓于:) 最近开始读你的书,感觉良好。但看到建一个dos虚拟机的时候,怎么也不能共享文件夹,也就是shared folder,看了网上的解决方法,说载入\\Program Files\Microsoft Virtual PC\Additions\”文件夹中的“Dos Virtual Machine Additions.vfd”映像文件。而我找不到该文件,非常困惑,希望你给予指导,如果你有该文件发给我一份,或者有更好地解决办法,非常感谢!!
      Email: yubo_ccdx@yahoo.com.cn
      #yubo_ccu 发表于2007-03-30 23:29:00  IP: 58.244.42.*
      想问一下 p38 倒数第6行和p39页第4行的shl eax, 4是什么意思呢?有什么用?谢谢
      #it_cracker 发表于2007-04-03 18:57:31  IP: 218.6.129.*
      请问我在DOS中运行程序的时候怎么显示
      “EMM386: UNRECOVERABLE PREVILLEGED OPERATION ERROR #n9 -PRESS ENTER TO REBOOT”
      然后就一直是死机状态
      谢谢!
      #lplong 发表于2007-04-05 10:37:33  IP: 13.187.26.*
      于兄好! 我很想把书中的例子程序放到bochs中调试,比如说第3章的例子。但是大部分文件已经超过512byte,请问怎么样做成启动盘载入调试呢? 虽然第四章谈到用loader的方法可以突破512byte限制,但需要改程序结构了。我只是想就调试书中第3章的例子,该怎么办呢,您是怎么做到的?
      非常感谢!
      #su_horng 发表于2007-04-08 20:57:52  IP: 61.230.6.*
      請問一下,有沒有辦法在我們自己寫的作業系統中載入Windows的pe檔?因為我實在搞不定Linux,編譯不出elf檔....
      之前我曾經試過wlink,它確實可以編譯出elf檔,可是無法指定-Ttext及其他的。
      #su_horng 发表于2007-04-08 20:58:11  IP: 61.230.6.*
      请问一下,有没有办法在我们自己写的作业系统中载入Windows的pe档?因为我实在搞不定Linux,编译不出elf档....
      之前我曾经试过wlink,它确实可以编译出elf档,可是无法指定-Ttext及其他的。
      #su_horng 发表于2007-04-09 18:08:33  IP: 61.230.6.*
      it_cracker:
      把config.sys中有关于emm386的部分删除就好了。
      我想,既然emm386能用到1mb以外的记忆体,那应该就是令cpu工作于保护模式吧!可能就是这样造成的。
      #chengxinwen 发表于2007-04-10 00:04:33  IP: 222.71.34.*
      我在这看到了一帮喜欢操作系统的人,如果原意我想向大家学习学习,与大家一起进步!
      我的MSN:chengxinwen@hd123.com
      请在加入时注明:操作系统
      #heihei1252 发表于2007-04-11 09:30:58  IP: 202.113.41.*
      于大哥,我想问问你安装的PCDOS用的是DOS的那个版本阿?为什么我用MS7.10,运行pmtest1.com时显示:EMM386:Unrecoverable privileged operation error #n9 - press ENTER to reboot
      难道虚拟机下也禁止特权操作?我给怎么办啊?
      #heihei1252 发表于2007-04-11 09:33:22  IP: 202.113.41.*
      哦,上面有答案哦,不好意思,冒泡了!嘿嘿
      #gyyg08 发表于2007-04-14 07:44:02  IP: 58.210.110.*
      请发一个pc dos boot disk.vfd给我把!
      我实在找不到这个文件,下载回来的vpc里面也没有
      我的email是somebird87@hotmail.com
      #W_few 发表于2007-04-24 18:37:01  IP: 222.18.189.*
      第一章我就遇到了问题,引导扇区最后一个字必须是AA55为什么我改成其它数,都能引导进去呢?
      #peteryxk 发表于2007-05-05 15:48:26  IP: 221.201.57.*
      # yubo_ccdx 发表于2007-03-26 20:42:38 IP: 58.244.35.*
      于渊你好,我也姓于:) 最近开始读你的书,感觉良好。但看到建一个dos虚拟机的时候,怎么也不能共享文件夹,也就是shared folder,看了网上的解决方法,说载入\\Program Files\Microsoft Virtual PC\Additions\”文件夹中的“Dos Virtual Machine Additions.vfd”映像文件。而我找不到该文件,非常困惑,希望你给予指导,如果你有该文件发给我一份,或者有更好地解决办法,非常感谢!!
      Email: yubo_ccdx@yahoo.com.cn

      同样的问题,我也没搞定shared folder,手动执行VMAdditions.iso文件里的fshare程序,却显示ERROR: Folder sharing is not supported on this host。

      给点儿建议阿
      #jjnn75 发表于2007-05-07 19:50:57  IP: 219.153.62.*
      你好,我买了你的《自己动手写操作系统》。书上说有个书友论坛http://forum.broadview.com.cn。
      不过要用户名和密码才能进去。不知是不是书上那里隐藏着这些啊???
      我发Email到editor@broadview.com.cn很多天了也没人回。
      #gjl606 发表于2007-05-30 19:00:02  IP: 218.249.196.*
      你的系统为什么基于Intel 32的CPU呢,怎么不考虑下国产的呢,龙芯等;怎么还是32位的,是不是要考虑64位及138位的呢;还单核,应该考虑双核、多核了。你的系统有什么新鲜的东西没?
      #gjl606 发表于2007-05-30 19:01:28  IP: 218.249.196.*
      138更正128
      #meee1 发表于2007-06-15 00:45:39  IP: 141.117.36.*
      于渊大哥,您好. 最近在拜读您的大作遇到一个问题.为什么我在编译PMTEST1.ASM时会遇到:

      segment name `.gdt' not recognised
      segment name `.s16' not recognised
      segment name `.s32' not recognised

      这样的问题, 我是在MSDOS7.0下编译的. 如何解决这个问题呢?是不是一定要换到LINUX下?
      #meee1 发表于2007-06-15 22:35:19  IP: 141.117.36.*
      还有一个奇怪的问题, 每次编译后的二进制文件写入软盘的引导扇区后, . 软盘就不能在DOS正常读写了, 连识别都不能, (但可以引导, 只是DOS再也无法识别该软盘). 但写入硬盘却没这样的问题. 文件大小512, 只修改引导扇区.为什么会导致软盘不能访问呢? 因为我在DOS下工作, 所以我用的是 DEBUG 的 "W 100 0 0 1" 命令写入. 不知什么原因?
      #meee1 发表于2007-06-15 23:22:16  IP: 141.117.36.*
      另外还有两个奇怪的问题:
      1. 编译后的二进制文件(512B)写如软盘引导扇区后, 虽然可以引导, 但是该软盘再也无法在DOS下正确识别, 必须从新格式化. 但是写入硬盘则没有问题. 只需从新SYS系统便可恢复. 因为我在DOS下工作, 所以我用的是DEBUG的"W 100 0 0 1"指令写盘. 请问是什么原因?

      2. 在LINUX下编译32位引导程序时出现 Symbol 'DA_C' undefined. 和 Symbol 'DA_DRW' undefined 错误, 请问是什么原因?
      #rocking200102 发表于2007-07-02 00:08:52  IP: 124.77.120.*
      轻教各位:Makefile老不能通过
      [root@localhost boot]# make
      nasm -o boot.bin boot.asm
      boot.asm:24: fatal: unable to open include file `load.inc'
      make: *** [boot.bin] 错误 1
      这是怎么回事?
      #rocking200102 发表于2007-07-04 12:04:23  IP: 124.77.120.*
      我是在fc4下,运行于渊写的原程序也会出现同样的问题,请那位大侠指点一下。
      #loverlinux 发表于2007-07-08 12:48:36  IP: 61.186.154.*
      我想知道我用vpc 2004 在windows xp安装,vpc安装ms-dos 7.10但不能共享主机的文件夹.要怎么才能共享文件夹呀>....
      #pianzhikuang 发表于2007-07-23 21:39:40  IP: 124.114.95.*
      你好!
      我刚接触你的大作!
      刚开始就遇到一个问题:
      我用Virtual PC加载了你的Tinix.img,没什么反映;理论上是不是应该显示"Hello, OS world!"!是不是我操作的有误??
      #Yibans 发表于2007-07-25 16:16:51  IP: 222.69.215.*
      您好!
      请问第五章(P161),kernel.asm里,
      为什么“跳到这里来的时候,我们假设gs指向显存”?
      这个假设的基础是什么呢?
      虽然kernel被加载到了8000的位置,但是gs的值跟这个是什么样的关系呢?
      谢谢解答!:)

      PS:P264,中间global.c里好像有个笔误吧,最后一个TestB应该是TestC吧?
      #Yibans 发表于2007-07-25 16:18:04  IP: 222.69.215.*
      TO pianzhikuang :
      不好意思,可是,请问你重启了吗?
      #Yibans 发表于2007-07-25 16:27:06  IP: 222.69.215.*
      TO loverlinux :
      要安装Virtual Machine Additions。
      #Yibans 发表于2007-07-25 16:46:02  IP: 222.69.215.*
      TO peteryxk :
      那个fshare是不能直接运行的。
      DOS Virtual Machine Additions.vfd 我已经给你发了,你注意查收。
      安装后你的两个问题都可以解决。
      这个是VPC的不好,没办法。
      #frozenmaple 发表于2007-07-26 08:29:31  IP: 61.155.18.*
      PCDOS的ISO网上找不到啊,我现在装了个FreeDOS,但是VPC2007安装附加组件DOS Virtual Machine Additions时,挂载后DOS目录下的fshare.exe直接在dos下运行时提示bad command……
      请问PCDSO的ISO能发我一份吗?谢谢
      frozenmaple@126.com
      #Yibans 发表于2007-07-26 13:58:09  IP: 222.69.215.*
      TO frozenmaple :
      什么是PCDSO?
      关于你的问题,请查看前面别人的留言。
      #Yibans 发表于2007-07-26 14:06:10  IP: 222.69.215.*
      TO peteryxk :
      (咦?我怎么发现我的一条回复不见了呢?)

      你的地址是不是写错了呀?
      我给你发过邮件了,可是被退了回来。。。。

      #Yibans 发表于2007-07-26 14:15:45  IP: 222.69.215.*
      TO meee1 :
      <自>书上有写怎么制作一个可以被DOS识别的引导扇区。
      详见书上P131。(4.1.2 DOS可以识别的引导盘)
      #frozenmaple 发表于2007-07-26 18:07:27  IP: 222.92.183.*
      TO Yibans:
      是我把PCDOS打错了……
      DOS Virtual Machine Additions.vfd 能发一份给我吗?谢谢啦
      #lspanchong 发表于2007-08-02 22:08:52  IP: 218.74.71.*
      PMTest2.asm中第2行和第3行显示内容是一样的,这是为什么呀。
      #Yibans 发表于2007-08-03 21:22:16  IP: 222.69.214.*
      又来看了一下,
      于渊好像好久好久没有来这里的样子。。。。。
      #Yibans 发表于2007-08-03 21:52:56  IP: 222.69.214.*
      又来看了一下,
      于渊好像好久好久没有来这里的样子。。。。。
      #Toy_OS 发表于2007-08-25 20:43:29  IP: 218.15.159.*
      于渊大哥你好!我是从去年开始看您的书的.你的书给了我很大的帮助.现在我也在写一个小的操作系统(当然有很多是参考您的).我采取的是微内核的模式.这两个月,参照着Minix,自己写了一个文件系统,我是在VC下完成的(直接在裸机上调试太困难了),文件系统的底层接口(磁盘读写)我是用读写文件代替的.我很早前就想完成硬盘或软盘的驱动的,但按书上的方法,总不成功.不知您能不能在这方面给些指导,我现在也只能用BIOS代替了(先跳回实时模式,读写完再跳回保护模式,挺麻烦的).
      #chenhuibest 发表于2007-09-12 22:45:12  IP: 222.197.173.*
      HI Forrest :
      您好!
      我这是第一次上您这儿来看看,感觉您好像现在很少到这儿来回答问题了。我建议您可以按照您书《自》的各个章节把大家的问题组织划分为不同的版块。当然这些事情不用您亲自动手,找个小弟帮你整理就行了,比如像我就十分愿意 ^_^。
      这样即可以减少你回答的工作量,也可以方便大家查找问题。也方便大家讨论。
      比如像我在读到第三章就卡住了,以前汇编是从《微机原理》这本书上来的,读你的第一个程序就如此困难,我化了两天时间了还在pmtest1.com上打转转。正希望获得帮助了。
      #lbzhao_28 发表于2007-09-26 16:08:00  IP: 61.172.200.*
      这边好热闹啊。我也在学习这本书对着写操作系统。
      去年开始看的,当中又补了下汇编和操作系统还有linux。
      希望这次能把这本书搞定。

      请问大家,都用什么dos的?我实在找不到好用的pc-dos,只能用ms-dos了。

      谁有pc-dos,发个给我啊。
      #LCBoy 发表于2007-10-04 12:16:58  IP: 59.54.99.*
      于渊大哥,您好,今天特地买了本《自己动手写操作系统》,有个问题想请教:
      开发环境怎么也弄不好
      Windows XP; Connectix Virtual PC 5.2; MS-DOS 7.1 , PC DOS version 7.00

      其实已经装好了,只是不能运行 关盘中的 pmtest1 ~ pmtest8 这些程序,就是没有输出字符,

      不知道哪里的问题,可惜光盘中没有提供开发平台。

      #zieckey 发表于2007-10-07 19:38:30  IP: 124.64.66.*
      操作系统研究学习交流QQ群:11860788
      热诚欢迎有兴趣的同仁加入!
      #zieckey 发表于2007-10-07 20:52:29  IP: 124.64.66.*
      于大哥,
      好,
      我找了好久都没有找到pcdos7.0,
      劳烦您请发一份给我吧:zieckey@yahoo.com.cn
      #zieckey 发表于2007-10-07 22:43:20  IP: 124.64.66.*
      我现在装的是ms-dos7.1
      但是我不知道如何在VPC下共享文件夹
      VPC让安装Virtual Mathine Additions
      但是我不知道如何安装?
      请帮忙啊
      #liuweisz 发表于2007-10-14 20:29:45  IP: 219.134.72.*
      我有pcdos下载. 我用过了,可以用的
      #liuweisz 发表于2007-10-14 20:31:50  IP: 219.134.72.*
      我有pcdos下载,已经试用过了,可以的
      #liuweisz 发表于2007-10-16 20:24:37  IP: 219.134.72.*
      Windows XP; Connectix Virtual PC 5.2; PC DOS7.1

      不能运行 关盘中的 pmtest1 ~ pmtest8 这些程序,没有输出字符,不停的输入乱码,电脑发出异常声音.请过来人指点下,谢谢
      #lingjunyue 发表于2007-10-20 22:54:14  IP: 222.240.107.*
      于大哥,你好!
      DOS Virtual Machine Additions.vfd 能发一份给我吗?谢谢啦
      我的邮箱是lingjunyue@126.com
      #lingjunyue 发表于2007-10-20 22:58:46  IP: 222.240.107.*
      于大哥,你好!
      DOS Virtual Machine Additions.vfd 能发一份给我吗?谢谢啦
      lingjunyue@126.com
      #liulantao0000 发表于2007-10-22 20:38:41  IP: 58.154.238.*
      于渊大哥:
      小弟最近在看你的自己动手写操作系统,可是在dos 下却共享不了文件夹,我用的是Connectix Virtual PC 5.2,安装的msdos7.1,怎眼解决这样的问题啊?我看楼上的有说DOS Additions.vfd的,你有吗,这是我的油箱:lltneu@126.com ,请发到我的油箱里,或是有更好的解决办法,多谢了
      #szf5555 发表于2007-11-05 11:38:16  IP: 121.76.56.*
      于渊,你好.很高兴能看到你写的书,不简单.我是个初学者,当我将光盘中的 Tinix\chapter1\a\boot.bin 文件用 FloppyWriter.exe 程序写入一张刚在WIN2003 server中格式化成fat格式的软盘然后重新启动后,系统出现 "Verifying DMI Pool Data ..." 后就不动了.不知道是不是我的塞扬 2.13 G cpu 的原因. 如果方便的话,帮我一下,好吗?
      #qiuting200 发表于2007-11-08 14:38:25  IP: 221.12.171.*
      关于"EMM386:Unrecoverable privileged operation error #n9 - press ENTER to reboot
      "的错误,为什么把config中的emm386删除就行,不知道这个错误是有代码中的哪段代码引起的.
      谢谢 于渊大哥
      #qiuting200 发表于2007-11-08 14:54:51  IP: 221.12.171.*
      你好,于渊大哥,我想问问关于这个错误"EMM386:Unrecoverable privileged operation error #n9 - press ENTER to reboot"
      是由什么引起的,能不能简略得说下,哪段代码与这个错误有关,
      谢谢
      #fly_on_grass 发表于2007-11-12 17:15:12  IP: 10.22.12.17, 61.*
      我运行第4页的反汇编命令:
      ndisasm -o 0x7c00 boot.ini >> disboot.asm
      将disboot.asm打开,结果里面只有一行:
      “This is a DOS/4G executable”
      请问这是怎么回事?
      这与我用的是MS-DOS有关系吗?
      #fly_on_grass 发表于2007-11-12 17:52:08  IP: 10.22.12.17, 61.*
      知道我错在那儿了。是我自己下载的nasm不对。
      #pangangjz 发表于2007-12-03 08:03:01  IP: 219.234.178.*
      11,我用XP系统,虚电脑上安的LINUX, 如何在LINUX 下共享文件,我的机器不能上网,


      22,只能在网吧下东西,回去安装,如何安装RPM
      #pangangjz 发表于2007-12-03 08:04:53  IP: 219.234.178.*
      哪位大侠帮帮忙啊,小弟不胜感激


      11,我用XP系统,虚电脑上安的LINUX, 如何在LINUX 下共享文件,我的机器不能上网,


      22,只能在网吧下东西,回去安装,如何安装RPM



      #vvoody 发表于2007-12-08 15:46:33  IP: 116.225.15.*
      你好,
      你的书要求C和ASM,我不会ASM,不知你有什么好的教材推荐。

      我手头有《Professional Assembly Language》、《Guide to Assembly Language Programming in Linux》,都是Linux平台的。

      我打算直接在Linux上学习你的书。
      #hawkish001 发表于2007-12-29 00:07:11  IP: 221.232.169.*
      在虚拟机的pcdos中执行第3章的pmtest1.com和pmtest2.com时出现pcdos屏幕输出乱码且机器发出蜂鸣声
      希望前辈指点一二...
      这里有具体的上机时的截图
      http://hi.baidu.com/hawkish001/blog/item/0bd49dd3506fa0043af3cf11.html
      #pankkk2002 发表于2008-02-01 15:38:29  IP: 61.144.207.*
      你好,我在VM安装了linux9.0。但是按照你说的方法并不能使得在虚拟linux上能访问windows文件夹。请帮忙。
      我的邮箱:pankkk2002@126.com
      谢谢
      #fuzzyfrog 发表于2008-02-01 16:48:22  IP: 58.216.1.*
      拜读您的大作,确实感觉对初学者很有帮助,感谢您的辛勤工作。
      有个很大的疑问,想咨询一下:
      按照您章节的安排,应该是从第4章才真正进入操作系统,第三章及之前的内容其实都是在讲PM,局限于512字节大小的系统引导部分,这也可以从您的FloppyWriter源码中看出来。
      但是显然,您的第三章的例子的编译结果(bin格式)基本上都是大于512字节的,这造成FloppyWriter无法正确写入虚拟软盘,即使把FloppyWriter中的文件大小改成1024或更大,这样虽然可以成功写入,但是程序也无法在虚拟机中正确执行。归根到底是程序的编译结果大于512字节。
      为了解决这个问题,只好将全局的堆栈和Ring3的堆栈改小,并且为了实验主要目的的实现而将无关的代码删除,这样勉强能使编译结果不大于512字节。但是对于pmtest5这样的例子,堆栈太小,在特权级转换的过程中又会造成堆栈溢出。
      另外,我的实验环境:
      VMWare5 + nasm +FloppyWriter
      原来怀疑虚拟机的差异,但是在Virtual PC 5.2、2004、2007中问题是一样的。
      所以,我想问问,您光盘上第三章的代码(编译成bin格式,org 07c00h)具体是怎么在虚拟机上弄成功的?
      #fuzzyfrog 发表于2008-02-01 17:16:03  IP: 58.216.1.*
      另外再补充一点,如果是把第三章的代码(比如pmtest6.asm)编译成com格式,然后在VMware下的DOS71下运行,都提示权限问题,然后终止,只能重新启动。
      #fuzzyfrog 发表于2008-02-01 17:18:12  IP: 58.216.1.*
      另外再补充一点:
      把第三章的代码(如pmtest6.asm)编译成com格式,在VMWare下的PCDOS71下运行,都会提示权限问题,然后终止,只能重新启动虚拟机。
      #wumingchenchao 发表于2008-03-04 09:09:14  IP: 125.69.44.*
      TO: pankkk2002
      ______________________________________
      你安装 VMware tools后就能实现Linux和Windows文件夹的共享了,具体安装方法可在网上查,或者按照解压出来的有一个install的安装说明文件提供的步骤进行.
      #roadingyh 发表于2008-03-05 22:07:19  IP: 210.77.10.*
      拜读您的大作,受益菲浅。我现在大概把书上的内容都实现了,不过都是在linux下做的。现在有两个问题想请教下:

      1.我看在minix中,TSS就定义了一个,是不是所有进程都只用了一个tss?tss中是不是也就只使用了SS0和ESP0两个成员?

      2.我看《操作系统设计与实现》里说的好像是把tss里的SS0:ESP0指向了进程表里,您书上也这么说的(我没看minix和您后来的代码)。那如果进程运行时,不是由硬件中断引发而切入了内核,比如系统调用,我觉得硬件中断是从属于系统的,而系统调用是从属于某个进程的。那这时系统调用的堆栈是不是也就指向了tss中所指的进程表?还是也像中断似的指向了内核的堆栈?

      谢谢!
      #roadingyh 发表于2008-03-05 22:10:49  IP: 210.77.10.*
      上面第二个问题说的不清楚。再说次:
      那如果进程运行时,不是由硬件中断引发而切入了内核,比如系统调用,那这时系统调用的堆栈是指向了tss中所指的进程表?还是也像中断似的指向了内核的堆栈?我觉得硬件中断是从属于系统的,而系统调用是从属于某个进程的,不应该使用内核的堆栈而应该使用自己的内核级堆栈。
      #xueyeyangpp 发表于2008-03-09 14:00:17  IP: 58.242.227.*
      请问:时钟中断程序 时钟驱动程序 和 时钟任务 三者各自的工作到底是什么。类似的有 硬盘中断 硬盘驱动 和 硬盘任务 它们到底是如何组织的?
      #kennymarx 发表于2008-03-20 22:47:35  IP: 218.20.45.*
      我用ld -s-Ttext 0x30400 -o kernel.bin kernel_main.o kernel.o命令连接生成kernel.bin, 指定了地址为30400h, 但是实际生成文件中程序入口地址变成了30470h;之后换成了几个值入80400, 但是连接之后的结果都是80470h;不知道70h怎么来的, 弄了好久找不到答案。forrest兄, 帮忙解答一下。
      我的邮箱kennymarx@tom.com, Q:532638317. 也请各位朋友解答一下, 谢谢
      #openbenzus 发表于2008-03-27 20:44:53  IP: 222.69.215.*
      《自己动手写操作系统》的第128页:
      “先来创建一个虚拟软盘,假设是FLOOPY.IMG,然后把它作为 Virtual PC 的A盘,格式化后就可以方便的往其中添加文件和目录了”
      请问这是怎么做的?虚拟软盘怎么格式化?怎么创建?怎么把它作为Virtual PC 的A盘?
      #littlehedgehog 发表于2008-04-01 22:37:23  IP: 218.75.123.*
      最近和同学在读这本书 感觉写的不错 和同学一起把看这本书的经历写成了一个系列 里面包括些环境配置、文章难点 希望对后面的新手有点用处

      http://blog.csdn.net/littlehedgehog/archive/2008/03/29/2229386.aspx

      http://blog.csdn.net/lingang_/archive/2008/03/30/2229913.aspx

      #baihaoken 发表于2008-04-08 05:55:05  IP: 117.32.133.*
      ;----------------------------------------------------------------------------
      ; 函数名: GetFATEntry
      ;----------------------------------------------------------------------------
      ; 作用:
      ; 找到序号为 ax 的 Sector 在 FAT 中的条目, 结果放在 ax 中
      ; 需要注意的是, 中间需要读 FAT 的扇区到 es:bx 处, 所以函数一开始保存了 es 和 bx
      GetFATEntry:
      push es
      push bx
      push ax
      mov ax, BaseOfLoader ; ┓
      sub ax, 0100h ; ┣ 在 BaseOfLoader 后面留出 4K 空间用于存放 FAT
      mov es, ax ; ┛
      pop ax
      mov byte [bOdd], 0
      mov bx, 3
      mul bx ; dx:ax = ax * 3
      mov bx, 2
      div bx ; dx:ax / 2 ==> ax <- 商, dx <- 余数
      cmp dx, 0
      jz LABEL_EVEN
      mov byte [bOdd], 1
      LABEL_EVEN:;偶数
      xor dx, dx ; 现在 ax 中是 FATEntry 在 FAT 中的偏移量. 下面来计算 FATEntry 在哪个扇区中(FAT占用不止一个扇区)
      mov bx, [BPB_BytsPerSec]
      div bx ; dx:ax / BPB_BytsPerSec ==> ax <- 商 (FATEntry 所在的扇区相对于 FAT 来说的扇区号)
      ; dx <- 余数 (FATEntry 在扇区内的偏移)。
      push dx
      mov bx, 0 ; bx <- 0 于是, es:bx = (BaseOfLoader - 100):00 = (BaseOfLoader - 100) * 10h
      add ax, SectorNoOfFAT1 ; 此句执行之后的 ax 就是 FATEntry 所在的扇区号
      mov cl, 2
      call ReadSector ; 读取 FATEntry 所在的扇区, 一次读两个, 避免在边界发生错误, 因为一个 FATEntry 可能跨越两个扇区
      pop dx
      add bx, dx
      mov ax, [es:bx]
      cmp byte [bOdd], 1
      jnz LABEL_EVEN_2
      shr ax, 4 这里为什么是AX右移4位哦
      LABEL_EVEN_2:
      and ax, 0FFFh 这一句的用意又如何,这里真的这两句不明白和我想的不一样。

      下面的BA98不是属于前面的么
      3
      #wings_chang 发表于2008-04-21 15:46:38  IP: 221.226.124.*
      请问有谁在VMWare下dos共享配置成功的?请指点下!先谢了!:)
      我的实验都不能正常运行.恐怕主要是dos共享没配置好.
      #hap_pig 发表于2008-05-03 18:17:51  IP: 221.2.164.*
      关于第二章用到的rpm要装道哪里呢?怎么装啊?
      #hap_pig 发表于2008-05-03 18:48:53  IP: 221.2.164.*
      我装virtual pc5.2时提示我说不能在实模式在运行,有哪位知道,帮下忙
      #littlehedgehog 发表于2008-05-08 15:01:30  IP: 60.12.8.*
      上面的给个详细问题说明
      可以参看
      http://blog.csdn.net/littlehedgehog/archive/2008/03/29/2229386.aspx
      可能有你需要的
      #JavaCoffeedwl 发表于2008-05-12 09:46:16  IP: 124.135.233.*
      有没有电子版的《自己动手写操作系统》啊?
      #huahuahua12 发表于2008-05-14 12:44:24  IP: 60.2.249.*
      Forrest,你好。
      感谢你的书,
      书中有一处不明白,“我们在virtual PC中用虚拟DOS把它复制到虚拟软盘中”。
      其中的内核kernel.bin在linux中生成,DOS中如何使用它?linux或DOS中如何生成软盘映像文件,又如何读写它?
      谢谢!
      #huahuahua12 发表于2008-05-14 12:46:34  IP: 60.2.249.*
      以上在书中160页中kernel.asm代码上方
      #beijingbeerman 发表于2008-05-15 06:34:05  IP: 221.219.130.*
      大家如果没有DOS共享目录成功,多数都是因为没有安装dos附加模块。这个可以下载virtual pc5.2,这个里面有。
      #gotohome418 发表于2008-06-02 14:47:17  IP: 220.205.48.*
      我装了linux,按书上的方法,没有与windows共享成文件夹,哪位大哥指点下。
      #zhoutc1029 发表于2008-06-13 09:49:45  IP: 210.72.218.*
      刚刚完成Csdn注册,试试发言行不行!
      #ggggfjeicfh 发表于2008-06-21 23:07:09  IP: 125.116.127.*
      我想在操作系统中加入vga的图形界面,用tc的图形函数写的能编译到内核里去吗,怎么弄呢,难道一定要用汇编?
      #xiaoyudian4900 发表于2008-07-03 23:44:19  IP: 125.64.233.*
      于渊大哥,你好。关于GetFatEntry函数我不太理解。从上下文来看,这个函数的作用应该是寻找序号为ax的sector的下一个簇号,假设Loader占用了3,8,9,10四个簇,则将簇号为3的扇区(根据代码4-9,这时以0为基准的扇区号应该是33+3=36,也就是Loader在数据区的第一个扇区)读入内存,然后pop ax(此时ax=3,不知道对不对?),调用GetFatEntry函数(调用完毕返回值应该是8,对不对)。在函数内部,经过*3/2之后,ax=4,div bx(512)之后ax=0(不知道对不对?),add ax,SectorNoOfFAT1(1)之后ax=1,读两个扇区之后,es:bx的值是第0个FAT项,并不是8,请问怎么解释呀?是不是我的理解有错误?
      #xiaoyudian4900 发表于2008-07-04 07:53:46  IP: 125.64.233.*
      上面写错了,簇号为3的扇区对应的以0为基准的扇区号应该思31+3=34。
      #ywd_bill 发表于2008-07-21 17:20:17  IP: 222.90.76.*
      我近期在看于大哥的这本书,怎么说呢,这本书给人以操作系统编程方面很多的思路,确实给国内这方面填补了一个空缺,我也比较赞赏作者的这种理论加实践的学习方法。在阅读的过程中,可以体会到于大哥当时也遇到很多问题和困难,比较钦佩那种打破砂锅问到底的钻研精神。但是可能是由于作者时间上的问题或者其他方面的考虑,有些细节确实是很粗略的带过。看看上面的网友这些问题就可以证明。当然,有些问题是网友的学习进程而导致的认识不全面。但为什么不能在这些问题上多加笔墨,或者在相关的问题上加上参考文献的注释。为什么就不能像国外的书籍一样规范一点?希望于大哥再版应该注意这些问题,我很期待。
      #jo_say 发表于2008-07-22 10:32:35  IP: 221.0.78.*
      我也楼上一位有相同的困惑,无法实心linux与window的共享,那个ip设置,只要该主机就行么?linux内部不用配置么?还有一定要用pcdos么,普通的ucdos之类不行么?能不能详细说下linux与window的共享,很急迫,就如你所说,世界充满了悖论,这个过不去,我就没有心情继续,我已经查了很多资料还是没有解决。
      #tianxingjianhd 发表于2008-07-24 20:50:58  IP: 218.82.3.*
      我也有楼上的困惑,无法实现linux与windows下的文件的共享,还有在VPC-2007下dos共享应该如何,,查了好多,也是郁闷。。。希望于大哥能解答一二
      #wacious 发表于2008-07-31 00:17:04  IP: 218.94.136.*
      楼上2位的困惑我也遇到.在liunx下敲那个文件挂载的命令好象没有效果.
      如果本机没有连接网络,IP地址是不是127.0.0.1啊
      主机方面还需要什么设置吗,共享文件放置的路径有什么要求吗?还请大哥指点迷津,这个问题困惑几天了
      #xiangxineirong 发表于2008-07-31 19:18:50  IP: 221.204.246.*
      于大哥,你好,刚读这本书,有种豁然开朗的感觉。
      不过我是个新手,对很多地方看的不是太明白。
      刚开篇的一个程序就有点不懂
      org 07c00h 这条语句在编译后有什么作用,我在其他论坛里见说是在7c00前填0,但是自己编译后看.bin文件和写到软盘里的内容,并没有体现出ORG伪指令填0的作用,如果只是改变计数器的值,那在编译完后体现在哪里呢。我看了反汇编后的程序,反汇编是用
      ndisasm -o xxx boot.bin >>disboot.asm,之后看到的开始地址是XXX,即是自定义的。
      还有就是看到Tinix.img中的机器指令是从0000:0000开始的,那么系统读进去是直接就将这些指令加载到7c00h处吗?如果是,那还用org 07c00h 干什么呢?不过我将org 07c00h 注释掉后编译出的boot.bin和之前没有注释org 07c00h 后编译出的boot.bin内容是一样的,但是只有后者能正确输出。另外我试着把AA55H去掉或者改变其位置使其不存在或不在所谓的7defh处,照样可以读出字符,这又是什么问题呢?
      #yuyinyuyin664 发表于2008-08-03 16:13:03  IP: 58.60.118.*
      pop dx
      add bx, dx
      mov ax, [es:bx]
      cmp byte [bOdd], 1
      jnz LABEL_EVEN_2
      shr ax, 4 这里为什么是AX右移4位哦
      LABEL_EVEN_2:
      and ax, 0FFFh 这一句的用意又如何,这里真的这两句不明白和我想的不一样。

      我也是上面2句没搞懂 这和我理解的也是不一样的
      上面2句对FAT的分配和那3个字节的结构与书上说的不匹配~
      #szwyf000 发表于2008-08-04 00:12:04  IP: 222.248.240.*
      有几个问题请教一下:
      时钟中断中任务切换代码如下:

      mov esp,[pReadyTask]
      mov ax,[esp+TSS] ;获取tss选择子,假设为0x20
      call ax ;切换到tssselector = 0x20的任务
      .....
      iretd
      问题1:cpu怎么知道0x20是选择子,而不是位于0x20处的一个函数?
      问题2:上面代码确实切换了任务,但call ax后面的代码就没有被执行过,为什么?难道中断不返回,直接切换任务了?
      问题3:原任务tss中保存的eip是时钟中断代码的eip还是被时钟中断中断的任务的eip?
      #beijingbeerman 发表于2008-08-05 14:55:56  IP: 124.193.147.*
      楼上同学请注意,如果在共享linux和windows目录不成功,可以使用vmware虚拟机,该虚拟机菜单中vm/seting/options中有sharedfolders可以轻松实现目录共享。
      另dos目录共享查看我上面的回复!
      #jjj346 发表于2008-08-07 15:54:48  IP: 121.204.253.*
      你好,有个问题请教一下:
      P104代码3-34
      里面是
      mov eax, LinaerAddrDemo
      call eax
      为什么要这么做
      我直接用
      call LinearAddrDemo
      又为什么会出错?
      #jjj346 发表于2008-08-07 15:56:30  IP: 121.204.253.*
      你好,有个问题请教一下:
      P104代码3-34
      里面是
      mov eax, LinaerAddrDemo
      call eax
      为什么要这么做
      我直接用
      call LinearAddrDemo
      又为什么会出错?
      #check200309 发表于2008-08-07 19:27:57  IP: 58.246.14.*
      回jjj346:
      call 后面好像不能跟个光杆立即数吧,要么是段:立即数
      对下面的情况
      fun:
      mov ax, 3h
      ...
      ret
      call_fun:
      call fun
      好像汇编时会将fun转换成与call_fun的相对偏移值,而call LinearAddrDemo中的LinearAddrDemo equ 00401000h是个立即数,不是标志
      呵呵,不知是不是这样,有问题再讨论~

      #jjj346 发表于2008-08-08 11:10:26  IP: 121.204.255.*
      to check200309:
      谢谢你的回答,我觉得你说的有道理
      我之前用
      call SelectorFlatC:LinearAddrDemo
      确实可以
      所以便想不懂在段内的话直接使用函数名为什么不行
      #dj123jary 发表于2008-08-20 17:46:22  IP: 125.72.79.*
      你好
      于大哥!
      菜鸟问题:virtual pc怎样安装Red Hat9,请你赐教,小弟不甚感激,急急急.........,否则学不下去了
      #wzhiw8223 发表于2008-09-03 09:08:42  IP: 121.34.180.*
      TO:dj123jary
      1. 用VPC新建一个PC,,命名为Linux,其中在安装操作系统步骤里选择“Linux”
      2. 在VPC的界面中选择新建Linux,点击“启动系统”,界面提示插入启动盘的信息
      3. 把Linux安装光盘放到光驱
      4. 在菜单在选择"CD->载入主机驱动器",然后按回车,熟悉的Linux安装界面就出来了
      5. ......继续Good luck
      #wzhiw8223 发表于2008-09-03 10:36:00  IP: 121.34.180.*
      向大伙请教一个问题:
        我根据章节“3.2.3.3 不同特权级代码段之间的转移 – 5.进入ring3”所叙述的功能及代码介绍,写了pmtest5.asm的代码。可是编译后运行有错误导致DOS重启,我已经调试出了出错的代码指令了,就是为打印进入保护模式信息“In Protect Mode Now.^-^”而写显存的指令mov [gs:edi], ax出错。
        查了整整一个上午的代码都没有看出什么不对地方,不知道看漏眼还是实现的问题(手上没有书的光盘,代码都是根据书本介绍自己写的)?
        为了节省这里的页面空间,我不直接在这里附源代码,麻烦大家到以下链接去拷贝源代码,标题是“自己动手写操作系统-pmtest5.asm”(所附代码已经包括.inc和.asm文件了,直接保存到一个.asm文件后编译即可)http://blog.baisi.net/?uid-193851-action-viewspace-itemid-3777
      #wzhiw8223 发表于2008-09-03 11:46:56  IP: 121.34.180.*
      to all:
      关于显存写操作的问题已经解决。
      原因真的是看漏眼了,不过不是对.asm代码,而是对.inc里的宏定义。我定义DA_DPL3=03h了,应该是DA_DPL3=60h。不过让我真正细心地去看.inc里的定义,还是在经历一翻分析之后:
        既然是写显存时出问题,那肯定与寄存器gs有关,也就是与gs关联的显存段选择子SelectorVideo或者显示段描述符LABEL_DESC_VIDEO的定义有关。相对于pmtest4.asm代码,显存段选择子SelectorVideo没有修改,而显示段描述符LABEL_DESC_VIDEO则添了DA_DPL3属性。那么显存段是DPL=3的存在的可读写数据段。
      LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh, DA_DRW + DA_DPL3
      SelectorVideo equ LABEL_DESC_VID