(84.76 KB)
赵炯博士、LGJ及各位LINUX专家:
我一直对操作系统的内部机理充满兴趣,总想搞懂它,可能是由于基础薄弱、天资有限,我花了很多的时间,总算把UNIX level six(John Lions)的源代码、linux 0.0.1的源代码、linux 2.0.40的大部分的源代码搞清楚。
看了Linux的源代码后,觉得还是太复杂了!
能有一个运行在386保护模式下的、单任务的、类似DOS的操作系统,该有多好!
我就努力了一把,写了一个自己的“超级DOS”。
在写的过程中,我发现程序规模大了,连接就会不成功。虽然能得到连接后的结果,但当做成启动盘后,总是重启动。
很苦恼!
附件中有我编写的两个版本的“超级DOS”。
《 实现键盘、显示功能的超级DOS 》,这个程序是能正常工作的。能接受键盘字符,在显示器上显示出来。
《 最新的超级DOS(有重启动问题) 》,这是我最近写的程序。老是重启动!
我分析了一下,似乎是ld连接不成功的缘故。
连接后段地址翻译不正确。
分析head.s中的开始一段:
.text
.globl idt,gdt,pg_dir,startup_32
pg_dir:
startup_32:
movl $0x10,%eax
mov %ax,%ds
mov %ax,%es
mov %ax,%fs
mov %ax,%gs
//the_here:
//jmp the_here
lss stack_start,%esp
//the_here:
// jmp the_here
call setup_idt
call setup_gdt
movl $0x10,%eax
mov %ax,%ds
mov %ax,%es
mov %ax,%fs
mov %ax,%gs
lss stack_start,%esp
如果前一个 //the_here:
//jmp the_here
去掉注释,启动盘运行到此就停住,这是很正常的。
如果后一个 //the_here:
//jmp the_here
去掉注释,启动盘就总是重启动。
这是在 Red Hat Linux Release 9 (Shrike)
Kernel 2.4.20-8下实验的。
Gcc是该系统自带的。
但你不能怀疑HEAD.S会有什么错误,因为《 实现键盘、显示功能的超级DOS 》中的HEAD。S和《 最新的超级DOS(有重启动问题) 》的几乎是一样的。为什么前者的head.s能正常运行呢?
二者的连接顺序也是相同的:
boot + ( head.o + main.o + …….)
请各位高明指点!
你可以用以下的安装:
1.在LINUX下建一个目录
2.把《 实现键盘、显示功能的超级DOS 》下的文件cp到该目录下
如果是实验《 最新的超级DOS(有重启动问题) 》,则当CP后,
还要运行 MAKE DOINSTALL,生成子目录
3.MAKE CLEAN
4.MAKE ALL
5.MAKE DOWRITE
6.得到启动软盘!
杭州电子科技大学 计算机学院 俞岳军 2005-10-24 晚
阅读(683) | 评论(0) | 转发(0) |