分享
 
 
 

手把手教你做操作系统(一)

王朝other·作者佚名  2006-02-01
窄屏简体版  字體: |||超大  

手把手教你做操作系统(一)

呵呵,名字挺吓人的。

这个样子,这学期的专业课里有“UNIX操作系统”,刚好软件工程老师也要我们做个小型的项目出来。合二为一,就做个自己的操作系统玩玩。把自己的一些经过写下来,供那些想自己做操作系统的朋友们参考吧。(忘说了,这个操作系统是仿UNIX 6和LINUX0.01写出来的。)

项目名称:操作系统blacksun

时间:2个星期

参考书籍:《LINUX0.01内核分析与操作系统设计》,《莱昂式UNIX代码分析》

第一天:

一系列的准备工作:

1, X86虚拟机的使用

虚拟机的作用是什么,相信也不要我罗嗦了。简单点,你测试个操作系统,总不能每次都“重启”---“测试”---“重启”---“编码”吧?在自己的机器上运行个X86虚拟机,OK,下面你就可以把它当畜生一样整了。

推荐bochs,呵呵,因为我只会用这个。这款软件是免费开放的,要是自己用着不爽,把源码当下来改改就行。软件下载地址:sourceforge.net/projects/bochs/,现在最新的版本应该是2..2.1吧,我用的是2.0版本的,反正够用就行。注意,如果用的是windows操作系统一定要下带-win的版本哦。

恩,现在举个例子教一下怎么用。

将bochs-2.0.zip解压到C文件夹下,里面有个dlxlinux文件夹,编辑里面的start.bat,改成如下格式:

SET BXSHARE=c:\bochs-2.0\dlxlinux

..\bochs

然后,“开始”---“运行”----“c:\bochs2.0\dlxlinux\start.bat”----“确定”

进入选择界面,如下

回车,就进入LINUX的登陆界面,再在login里键入root就可以登陆LINUX。

不知道大家有没有注意到,dlxlinux文件夹里的bochsrc.txt,这是个关键的东西,里面定义的东西很复杂。建议大家看看bochs文件夹里的bochsrc-example.txt,把这个看懂了,基本就可以很熟悉的使用bochs了。

Bochs里还有个exe文件bochsdbg.exe,这是个类似DOS里debug的东西,可以进行一些调试。下面列出一些命令。

[执行控制]

c|cont 向下执行,相当于WinDBG的“g”。

s|step|stepi [count] 单步执行,相当于WinDBG的“t”,count 默认为 1。

p|n|next 单步执行,类似于WinDBG的“p”。

q|quit|exit 退出调试,同时关闭虚拟机。

Ctrl-C 结束执行状态,返回调试器提示符。

Ctrl-D if at empty line on command line, exit

(至少在Windows版本中我没有发现Ctrl-D有什么功能)

[执行断点]

vb|vbreak [seg:off] 在虚拟地址上下断点。

lb|lbreak [addr] 在线性地址上下断点,相当于WinDBG的“bp”。

pb|pbreak|b|break [addr] 在物理地址上下断点。(为了兼容GDB的语法,地址前可以加上一个“*”)。

blist 显示断点状态,相当于WinDBG的“bl”。

bpd|bpe [num] 禁用/启用断点,WinDBG的“be”和“bd”。num是断点号,可以用blist命令查询。

d|del|delete [num] 删除断点,相当于WinDBG的“bc”。mum是断点号,可以用blist命令查询。

[读写断点]

watch read [addr] 设置读断点。

watch write [addr] 设置写断点。

unwatch read [addr] 清除读断点。

unwatch write [addr] 清除写断点。

watch 显示当前所有读写断点。

unwatch 清除当前所有读写断点。

watch stop|continue 开关选项,设置遇到读写断点时中断下来还是显示出来但是继续运行。

[内存操作]

x /nuf [addr] 显示线性地址的内容

xp /nuf [addr] 显示物理地址的内容

n 显示的单元数

u 每个显示单元的大小,u可以是下列之一:

b BYTE

h WORD

w DWORD

g DWORD64

注意: 这种命名法是按照GDB习惯的,而并不是按照inter的规范。

f 显示格式,f可以是下列之一:

x 按照十六进制显示

d 十进制显示

u 按照无符号十进制显示

o 按照八进制显示

t 按照二进制显示

c 按照字符显示

n、f、u是可选参数,如果不指定,则u默认是w,f默认是x。如果前面使用过x或者xp命令,会按照上一次的x或者xp命令所使用的值。n默认为1。addr 也是一个可选参数,如果不指定,addr是0,如过前面使用过x或者xp命令,指定了n=i,则再次执行时n默认为i+1。

setpmem [addr] [size] [val] 设置物理内存某地址的内容。

需要注意的是,每次最多只能设置一个DWORD:

这样是可以的:

<bochs:1> setpmem 0x00000000 0x4 0x11223344

<bochs:2> x /4 0x00000000

[bochs]:

0x00000000 <bogus+ 0>: 0x11223344 0x00000000 0x00000000 0x00000000

这样也可以:

<bochs:1> setpmem 0x00000000 0x2 0x11223344

<bochs:2> x /4 0x00000000

[bochs]:

0x00000000 <bogus+ 0>: 0x00003344 0x00000000 0x00000000 0x00000000

或者:

<bochs:1> setpmem 0x00000000 0x1 0x20

<bochs:2> x /4 0x00000000

[bochs]:

0x00000000 <bogus+ 0>: 0x00000020 0x00000000 0x00000000 0x00000000

下面的做法都会导致出错:

<bochs:1> setpmem 0x00000000 0x3 0x112233

Error: setpmem: bad length value = 3

<bochs:2> setpmem 0x00000000 0x8 0x11223344

Error: setpmem: bad length value = 8

crc [start] [end] 显示物理地址start到end之间数据的CRC。

[寄存器操作]

set $reg = val 设置寄存器的值。现在版本可以设置的寄存器包括:

eax ecx edx ebx esp ebp esi edi

暂时不能设置:

eflags cs ss ds es fs gs

r|reg|registers reg = val 同上。

dump_cpu 显示完整的CPU信息。

set_cpu 设置CPU状态,这里可以设置dump_cpu所能显示出来所有CPU状态。

[反汇编命令]

u|disas|disassemble [/num] [start] [end]

反汇编物理地址start到end 之间的代码,如果不指定参数则反汇编当前EIP指向的代码。num是可选参数,指定处理的代码量。

set $disassemble_size = 0|16|32 $disassemble_size变量指定反汇编使用的段大小。

set $auto_disassemble = 0|1 $auto_disassemble决定每次执行中断下来的时候(例如遇到断点、Ctrl-C等)是否反汇编当前指令。

[其他命令]

trace-on|trace-off Tracing开关打开后,每执行一条指令都会将反汇编的结果显示出来。

ptime 显示Bochs自本次运行以来执行的指令条数。

sb [val] 再执行val条指令就中断。val是64-bit整数,以L结尾,形如“1000L”

sba [val] 执行到Bochs自本次运行以来的第val条指令就中断。val是64-bit整数,以L结尾,形如“1000L”

modebp 设置切换到v86模式时中断。

record ["filename"] 将输入的调试指令记录到文件中。文件名必须包含引号。

playback ["filename"] 回放record的记录文件文件名必须包含引号。

print-stack [num] 显示堆栈,num默认为16,表示打印的条数。

?|calc 和WinDBG的“?”命令类似,计算表达式的值。

load-symbols [global] filename [offset]

载入符号文件。如果设定了“global”关键字,则符号针对所有上下文都有效。offset会默认加到所有的symbol地址上。symbol文件的格式为:"%x %s"。

[info命令]

info program 显示程序执行的情况。

info registers|reg|r 显示寄存器的信息。

info pb|pbreak|b|break 相当于blist

info dirty 显示脏页的页地址。

info cpu 显示所有CPU寄存器的值。

info fpu 显示所有FPU寄存器的值。

info idt 显示IDT。

info gdt [num] 显示GDT。

info ldt 显示LDT。

info tss 显示TSS。

info pic 显示PIC。

info ivt [num] [num] 显示IVT。

info flags 显示状态寄存器。

info cr 显示CR系列寄存器。

info symbols 显示symbol信息。

info ne2k|ne2000 显示虚拟的ne2k网卡信息。

2, 装DJGPP

简单介绍下DJGPP,DJGPP是DOS下的自由源代码的保护模式C语言编译器。因为它支持保护模式,所以可以轻松应付寻址范围在4GB的软件开发,这也是我们选用这款编译器的原因。

由于它是开源软件,所以可以自由的下载,网址是www.delorie.com/djgpp.

先把这个当下来,熟悉一下它。要是对DOS操作感觉不适,也可以装它的图形化版本RHIDE。具体怎么装,怎么用,就自己摸索吧。

2005.11.07

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有