




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
说明一下,这里省略了一些print信息,目的是为了使代码短一些,而且print信息的代码都很简单,大家有兴趣可以自己读一下。 #include /* for CONFIG_ROOT_RDONLY */ #include / 我把这些宏的定义都列在下面了。SETUPSECS =4 /* default nr ofsetup-sectors */BOOTSEG =0x07C0 /* original address ofboot-sector */INITSEG =0x9000 /* we move boot here - out of theway */SETUPSEG =0x9020 /* setup starts here */SYSSEG =0x10000 /* system loadedat 0x10000 (65536) */SYSSIZE =0x7F00 /* system size: # of16-byte clicks */ /* to be loaded */ROOT_DEV =0 /* ROOT_DEV is nowwritten by build */SWAP_DEV =0 /* SWAP_DEV is nowwritten by build */ #ifndef SVGA_MODE#define SVGA_MODE ASK_VGA#endif #ifndef RAMDISK#define RAMDISK 0#endif #ifndef CONFIG_ROOT_RDONLY#define CONFIG_ROOT_RDONLY 1#endif/ 在此这上的部分,是不会出现在编译运行的二进制中的,这一部分内容只是汇编器所需要的信息 /下面是真正运行的代码了.code16 / 表示下面的代码运行在16位模式下.text .global _start /global标签的意思是让链接器可以看到_start符号。_start:/* section 1的内容很简单,开机上电bios会把启动设备的一个扇区,加载到0x0:0x7c00* 即BOOTSEG,并跳转到这里执行,然后程序会把自己搬运到0x:0x9000,如何搬?下面的* 代码很简单,不说了!为什么搬?最好的解释是,这块内存后面会挪作他用。*/*section1* movw $BOOTSEG, %ax movw %ax, %ds movw $INITSEG, %ax movw %ax, %es movw $256, %cx subw %si, %si subw %di, %di cld rep movsw*section 1*/ 所谓的长跳转,后面跟段基址:段内偏移。别忘了这里是16位实模式 ljmp $INITSEG, $go / 上面的ljmp的作用,就是在搬运完之后从go这里开始继续执行go: movw $0x4000-12, %di / 用来设置栈底 / 注意在上面的搬运过程中ax被置为0x9000,即INITSEG movw %ax, %ds / 接下来这两句,将stack设置在0x9000:(0x4000 -12) movw %ax, %ss movw %di, %sp movw %cx, %fs /开机上电,cx会被置为0,这里也就把fs置为0 movw $0x78, %bx / %fs:%bx,即0x0:0x78处放置这磁盘参数表地址 pushw %ds / 将参数0x0:0x78处存放的两个word(共32 bits),依次放入到ds和si/ 所以ds:si就是磁盘参数表的首地址,这个表的总长度为12bytes ldsw %fs:(%bx), %si #ds:si is source / section 2的作用就是从ds:si赋值12bytes到es:di,es:di即0x9000:(0x4000-12)/ 也就是说在栈底之后的12bytes,放置了从原始位置搬运过来的磁盘参数表*section2* movb $6, %cl #copy 12 bytes pushw %di #di = 0x4000-12. rep # dont need cld- done on line 66 movsw*section2* popw %di popw %ds movb $36, 0x4(%di) # patch sector count / 重新设置0x0:0x78处的磁盘参数表的地址,这样以后在通过int 13查看参数表的/ 信息时,就到新的位置去找了。 movw %di, %fs:(%bx) movw %es, %fs:2(%bx) load_setup: xorb %ah, %ah #reset FDC xorb %dl, %dl int $0x13 / 调用bios int 13中断服务,从设备的第二个扇区开始复制总共4个扇区(setup.S)到/0x9000:0x200,具体int 13 读扇区的具体参数设置,可以查看相关资料 *section 3* xorw %dx, %dx # drive 0, head 0 movb $0x02, %cl # sector 2, track 0 movw $0x0200, %bx # address = 512, in INITSEG movb $0x02, %ah # service 2, read sector(s) movb setup_sects, %al # (assume all on head 0, track 0) int $0x13 # read it*section 3* jnc ok_load_setup # ok - continue / 加载setup.S失败,ax中含有错误码。这里会打印一些信息,并作重试 pushw %ax #dump error code call print_nl movw %sp, %bp call print_hex popw %ax jmp load_setup ok_load_setup: / ds:si执行用于获得磁道总扇区数的猜测值,为什么使用猜测值呢?原因是没有可以/直接使用的bios调用来获取总的扇区数,无奈之下:能读到36个扇区,就认为是36个,/不行就尝试18,15等,都失败时,就是用9 movw $disksizes, %si # table of sizes to tryprobe_loop: lodsb / 将猜测值依次放到al中 cbtw # extend toword / al 扩展成ax movw %ax, sectors cmpw $disksizes+4, %si / 前面都失败了,到最后一个值的时候 jae got_sectors / 就使用这个值了 xchgw %cx, %ax #cx = track and sector xorw %dx, %dx # drive 0, head 0 xorb %bl,%bl movb setup_sects, %bh incb %bh shlb %bh #address after setup (es = cs) movw $0x0201, %ax # service 2, 1 sector int $0x13 jc probe_loop #try next value got_sectors:/ 获取鼠标位置 movw $INITSEG, %ax movw %ax, %es #set up es movb $0x03, %ah # read cursor pos xorb %bh,%bh int $0x10/ 显示“loading”字符 movw $9, %cx movw $0x0007, %bx # page 0, attribute 7 (normal) movw $msg1, %bp movw $0x1301, %ax # write string, move cursor int $0x10 # tell the user wereloading. movw $SYSSEG, %ax # ok, weve written the message, now movw %ax, %es #we want to load system (at 0x10000) call read_it call kill_motor / 关闭磁盘马达 call print_nl movw root_dev, %ax orw %ax,%ax jne root_defined movw sectors, %bx / read_it中确定出的每条磁道的扇区数 movw $0x0208, %ax # /dev/ps0 - 1.2Mb cmpw $15, %bx / 等于15,则设备号为0x0208 je root_defined movb $0x1c, %al # /dev/PS0 - 1.44Mb cmpw $18, %bx je root_defined movb $0x20, %al # /dev/fd0H2880 - 2.88Mb cmpw $36, %bx je root_defined movb $0, %al #/dev/fd0 - autodetectroot_defined: movw %ax, root_dev / root_dev保存根设备号 ljmp $SETUPSEG,$0 / 跳转到setup.S继续执行 sread: .word0 # sectorsread of current trackhead: .word0 # currentheadtrack: .word0 # currenttrack read_it: movb setup_sects, %al / setup_sects = 4 incb %al movb %al, sread / 4+1 已经读出的扇区数 movw %es, %ax / 目的位置的基址:0x1000 testw $0x0fff, %ax / 基址必须是64KB边界对齐die: jne die # es must be at 64kBboundary xorw %bx, %bx # bx is starting address within segmentrp_read:#ifdef _BIG_KERNEL_ bootsect_kludge= 0x220 # 0x200 (size ofbootsector) + 0x20 (offset lcall bootsect_kludge # of bootsect_kludge in setup.S)#else movw %es, %ax subw $SYSSEG, %ax#endif cmpw syssize, %ax # have we loaded all yet? jbe ok1_read ret ok1_read: movw sectors, %ax / 假定的磁道总扇区数 subw sread, %ax / 需要读的扇区数= 总扇区数 - 已读扇区数 movw %ax, %cx shlw $9,%cx / 扇区数换算成字节数 addw %bx, %cx / 加段内当前偏移(开始为0) jnc ok2_read / 未超过64KB,(即bx未溢出),则全部读出 je ok2_read / 全部读完 /超过64KB xorw %ax, %ax subw %bx, %ax / 64KB bx shrw $9,%ax / 换算成扇区ok2_read: call read_track movw %ax, %cx / 此次读取的扇区数 addw sread, %ax / 累加已读扇区数,临时放到ax中 cmpw sectors, %ax jne ok3_read / 当前磁道内扇区未全部读完 / 一个柱面有两个磁头,0和1 movw $1, %ax subw head, %ax jne ok4_read/ 若为磁头0,就去读磁头1上数据 incw track / 否则读下一磁道(即当前磁道已经读完) ok4_read: movw %ax, head xorw %ax, %ax ok3_read: movw %ax, sread / ax含有目前总共读出的扇区数 shlw $9,%cx / 转换为字节数 addw %cx, %bx / 更新偏移值 jnc rp_read / 继续读 / 已读够64KB,设置接收下面的64KB数据 movw %es, %ax addb $0x10, %ah movw %ax, %es xorw %bx, %bx jmp rp_read read_track: pusha pusha / 每次read操作都会在屏幕显示一个点,这样做的目的是让用户知道系统现在在运转/ 而不是死机了,因为整个读磁盘的操作较慢。 movw $0xe2e, %ax # 0x2e 是.的ascii码 movw $7, %bx int $0x10 popa movw track, %dx / 磁道号 movw sread, %cx / 开始扇区 (从第6扇区开始,nr = 5) incw %cx / 下次开始扇区 movb %dl, %ch / 磁道号放到cx的高字节,低字节是扇区 movw head, %dx / 磁头号放低字节 movb %dl, %dh / 驱动器号放高字节 andw $0x0100, %dx / 并且不大于1 movb $2, %ah / 读扇区功能号为2 pushw %dx #save for error dump pushw %cx pushw
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO 8203-4:2025 EN Fibre-reinforced plastic composites - Non-destructive testing - Part 4: Laser shearography
- 应急安全培训软件课件
- 应急与安全培训演练总结课件
- 秋季腹泻自然病程规律与预后影响因素
- 购买电子产品合同(标准版)
- 中策职业学校钱塘学校钱塘校区设备项目网络攻防实训室项目(一期)招标文件
- 2025年法律硕士测试卷含完整答案详解【名师系列】
- 住宅专项维修资金管理基础信息数据标准
- 养老院事故灾难应急预案范文(35篇)
- 2025年海绵城市建设与城市生态修复研究报告
- 国开《建设监理》形成性作业1-4答案
- 智能采矿导论PPT完整全套教学课件
- 腹壁整形课件
- 过盈配合压装力计算
- ECMO IABP完整版可编辑
- 华为项目管理10大模板Excel版可直接套用-非常实用
- 部编版五年级上册语文教案1-6单元(表格式)
- HPLC高效液相色谱解读课件
- 移动通信5G关键技术分析课件
- 理想与前途教育主题班会
- 无人机操作与使用教案
评论
0/150
提交评论