📄 program-kernel-boot-comment.html
字号:
<br> mov cx,ax
----| | (别忙,这里暂时不关cx什么事!)
<br> add ax,sread
| | AX是这次读出的扇区数, sread是该磁道已
<br>
| | 读出的扇区,相加更新AX的值.
<br> cmp ax,#sectors
| | 该磁道所有的扇区都读出了吗?
<br> jne ok3_read
| | 尚未,还不能移到下个磁道!
<br> mov ax,#1
|
<br> sub ax,head
| | head对应软盘来说只能是0,1
<br> jne ok4_read
| | 0,1 head都读过了才准往下走!
<br> inc track
| | 终于可以读下个磁道了,真累!
<br>ok4_read:
|
<br> mov head,ax
|
<br> xor ax,ax
|
<br>ok3_read:
|
<br> mov sread,ax
| | 如果是由于还没读完所有的磁道?
<br>
| | 那么ax记载当前磁道已读出的扇区,更新sread.
<br>
| | 如果已读完18个扇区,ax被上一行代码置零.
<br> shl cx,#9
<----| | cx记载最近一次读的扇区数,*512算成字节.
<p> add bx,cx
| bx是缓冲区的偏移.往前移!
<br> jnc rp_read
| 看看当前段(64K)是不是已经装满了?
<br>
| 这里是不会超出当前段的,(见上的代码)
<br>
| 最多也就是刚刚装满. :-)
<br> mov ax,es
| 装满了!移到下一段!!!
<br> add ax,#0x1000
<br> mov es,ax
<br> xor bx,bx
| 偏移置零!
<br> jmp rp_read
<p>read_track:
<br> push ax
<br> push bx
<br> push cx
<br> push dx
<br> mov dx,track
<br> mov cx,sread
<br> inc cx
| CL的低位0-5指示扇区号
<br> mov ch,dl
| 磁道号(0-1023)由10位bits组成:CH 8位,CL
<br>2位.
<br> mov dx,head
<br> mov dh,dl
| DH=磁头号
<br> mov dl,#0
| DL=驱动器号,0代表A:, 0x80代表C:
<br> and dx,#0x0100
| 不明白为什么要再检验一次,也许
<br>
| 为了确保万无一失. ???
<br> mov ah,#2
| AX当前的值为sub as, sread, 那么
<br>
| AL的值,即扇区数为当前剩余未读的sectors.
<br> int 0x13
| BOIS CALL, ES:BX指示缓冲区位置.
<br> jc bad_rt
| 出错处理,见下:
<br> pop dx
<br> pop cx
<br> pop bx
<br> pop ax
<br> ret
<br>bad_rt: mov ax,#0
<br> mov dx,#0
<br> int 0x13
| 软盘复位!
<br> pop dx
<br> pop cx
<br> pop bx
<br> pop ax
<br> jmp read_track
<p>/*
<br>* This procedure turns off the floppy drive motor, so
<br>* that we enter the kernel in a known state, and
<br>* don't have to worry about it later.
<br>*/
<br>kill_motor:
<br> push dx
<br> mov dx,#0x3f2
<br> mov al,#0
<br> outb
| 向Floppy Controller端口写零,STOP!
<br> pop dx
<br> ret
<p>gdt:
<br> .word 0,0,0,0
| dummy
<p> .word 0x07FF
| 8Mb - limit=2047 (2048*4096=8Mb)
<br> .word 0x0000
| base address=0
<br> .word 0x9A00
| code read/exec
<br> .word 0x00C0
| granularity=4096, 386
<p> .word 0x07FF
| 8Mb - limit=2047 (2048*4096=8Mb)
<br> .word 0x0000
| base address=0
<br> .word 0x9200
| data read/write
<br> .word 0x00C0
| granularity=4096, 386
<p>idt_48:
<br> .word 0
| idt limit=0
<br> .word 0,0
| idt base=0L
<p>gdt_48:
<br> .word 0x800
| gdt limit=2048, 256 GDT entries
<br> .word gdt,0x9
| gdt base = 0X9xxxx
<p>msg1:
<br> .byte 13,10
<br> .ascii "Loading system ..."
<br> .byte 13,10,13,10
<p>.text
<br>endtext:
<br>.data
<br>enddata:
<br>.bss
<br>endbss:
<p>/**
<br>* 黄,你好.上面的代码注释就是我读boot.S的心得.
第一次没搞清楚的SYSSIZE
<br>* 问题已经解决,它是在Makefile在编译时定义的.定义的方法很奇怪,还用到
<br>* Shell script. 读系统到内存我想我应该是弄清淅了,但后面的386PM和8259A
<br>* 难度就大多了.
<br>* 1)boot在读完system到0x10000之后,又将它这么一移到0x90000
<br>* 岂不是把自己给覆盖了吗?我这么也不理解,我没有调试kernel的工具,不知
<br>* 实际运行时是这样的.你上次说的单机调试的工具地址能再mail给我吗?
<br>* 你能在你的双机上看看是怎样的吗?
<br>* 2)在boot之后,绝对地址0x00000里面
<br>* 到底是什么?(中断向量?!)在整个初始化过程完毕后,系统jump到那里是什么
<br>* 意思?初始的两个GDT也是指向0x00000000.
<br>* 3)8259A的工作原理我主要参看
<br>* 的是清华的<<微机IBM-PC/XT原理及应用>>,周德明.后来我发现Minix的那本
<br>* 书里也有一点东西,还没来的及看.
<br>* 另外多谢你提供的 across reference building tool,我还没用熟,能简单
<br>* 介绍介绍吗? ^_^
<br>* 杜晓明 98.11.17
<br>**/
<br>@@ 1,你搞错了,boot在读完system到0x10000之后,又将它这么一移到0x0。:-)
<br>@@ 2.绝对地址0x00000里面 system.实模式中断不能再用了
<br>@@ !)在整个初始化过程完毕后,系统jump: jmpi
0,8 这是个长跳转 cs=8 eip=0
<br>@@ cs=8不是实模式的段,而是gdt表中第一 (0开始),就是你定义的初始的两个GDT
<br>@@ 中的第一项,所以,现在系统跳到绝对0,即head.s的startup
<br>@@ 3.用lxr的across reference building tool先解开后,基本上按INSTLL说明
<br>@@ make install
<br>@@ edit $(安装目录)/http/lxr.conf
<br>@@ baseurl
改为你的url
<br>@@ 我是这样设的 http://192.168.1.3/lxr/
<br>@@ 同一目录下设.htaccess INSTALL有
<br>@@ 配置 httpd server
<br>@@
httpd.conf 加一行 Alias /lxr $(安装目录)/http/
<br>@@ cd $(安装目录)/source 产生标识符库 ../bin/genxref
$(kernel source目录)
<br>@@ kernel source: /linux/0.01/....
<br>@@
/0.10/...
<br>@@ 你还可用global http://zaphod.ethz.ch/linux/
<br>@@ 我装过,可是最后装好后没有搜索,不然应该会更好用。?
<br>@@ 4.内核调试我用过gdbstub,但是我发现调试好象的是gdbstub.c程序,而不是内核,只
<br>@@ 看到gdbstub.c的原代码,没有内核的原代码,或许有个步骤我没做导致如此.
<br>
<br>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -