Chinaunix首页 | 论坛 | 博客
  • 博客访问: 534539
  • 博文数量: 120
  • 博客积分: 3030
  • 博客等级: 中校
  • 技术积分: 1445
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-05 01:00
文章存档

2011年(1)

2009年(2)

2008年(32)

2007年(33)

2006年(52)

我的朋友

分类: LINUX

2006-03-22 23:18:36

  最近因为做的东西太底层,所以有幸接触了linux系统的内核,所以对操作系统产生兴趣 ,也知道了通过什么途径可以接触到系统的相关知识 ,感觉学到很多东西 ,目前的想法是白天在公司分析驱动 ,晚上分析操作系统嘿嘿  ,累了些 ,但感觉很好
  我用的是linux-0.11-devel-040809带gcc 核原码的系统 ,前几天终于琢磨出来怎么在bochs上面编译核调试内核 。但是发现内核内容太多所以先从启动部分学习起
   废话少说,在参考并且试验网络文章《自己动手写操作系统〉〉失败后 (主要原因是ld86 0.11 没有 - d 选项),经过几天的徘徊 ,终于想另外的办法 ,不就是构造一个软盘或软盘IMG文件么,俺自己写汇编生成BIN然后自己用ULTRA_EDIT拷贝到IMG文件上 ,通过痛苦的实验 ,可以是可以了 但好辛苦 ,我都要哭了 ,这个时候发现俺买过的一本书上有系统试验指南 ,靠,发现的太晚了吧 (以前看到也不明白做什么的) 于是发现了 PARTCOPY NASM等工具这下好了 可以干活了
    于是cp了一段启动代码
------------------------------------------------------------
 ; boot.asm
; 从磁盘扇区装载另外一个程序,并且执行
[ORG 0]
        jmp 07C0h:start     ; 跳转到段07C0
start:
        ; 设置段寄存器
        mov ax, cs           ;将代码段的内容装载到数据寄存器
        mov ds, ax           ;讲数据段内容放入数据段寄存器
        mov es, ax           ;讲数据段内容放入扩展段

reset:                      ; 重置软盘驱动器
        mov ax, 0           ;
        mov dl, 0           ; Drive=0 (=A)
        int 13h             ;
        jc reset            ; ERROR => reset again

read:
        mov ax, 1000h       ; ES:BX = 1000:0000
        mov es, ax          ;
        mov bx, 0           ;
        mov ah, 2           ; 读取磁盘数据到地址ES:BX
        mov al, 5           ; 读取5个扇区
        mov ch, 0           ; Cylinder=0
        mov cl, 2           ; Sector=2
        mov dh, 0           ; Head=0
        mov dl, 0           ; Drive=0
        int 13h             ; Read!
        jc read             ; ERROR => Try again

        jmp 1000h:0000      ; 跳转到被装载的程序处,开始执行

times 510-($-$$) db 0
dw 0AA55h
-----------------------------------------------------------------
 
嘿嘿 ,毕竟是第一次这么干 ,有人要偷笑了
; prog.ASM
; 被引导程序装载的程序
; 在屏幕上打印:Program Loaded Succeed! Hello, myos!
[ORG 0]
 jmp start2 ; Goto segment 07C0
; 定义需要打印的字符串
msg     db  'Program Loaded Succeed! Hello, myos!',$0
start2:
        ; 设置段寄存器
        mov ax, cs
        mov ds, ax
        mov es, ax
        mov si, msg     ; 打印字符串
print:
        lodsb           ; AL=字符串存放在DS:SI
        cmp al, 0       ; If AL=0 then hang
        je hang
        mov ah, 0Eh     ; Print AL
        mov bx, 7
        int 10h
        jmp print       ; 打印下一个字符
hang:                   ; 挂起计算机!
 jmp hang
------------------------------------------------------------------
这两天走了很多弯路 ,碰到一些困难 ,总不能一点都不写吧 ,呵呵管它呢 ,也不知道书的作者会不会骂我,反正俺学过做过的就是自己的,俺也不指望做网站卖钱 ,俺就是图个兴趣,按照书里面的步骤写的 。
    然后再编译上面2个代码
    nasm boot.asm -o boot.bin
    nasm  prog.asm -o prog.bin
    然后用ultera_edit将boot.bin的内容拷贝到软盘img文件的0-512字节 ,prog.bin拷贝到512后面的字节 ,然后用这个新的img文件引导linxu0.11 ,管它的反正是引导成功 ,打印出来hello,myos!
    今天虽然依葫芦画瓢引导成功,但里面的内容很多不太明白 ,以后会详细分析这个引导文件 。太晚了休息了嘿嘿
   
 
 
 
阅读(942) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~