青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-80  評論-24  文章-0  trackbacks-0
本篇主要將boot程序所做的工作做一筆記。
先看代碼吧:

  1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2 ; 該文件主要用于加載loader和kernel入內存,其中默認loader和kernel是被壓縮成System.Image
  3 ; 文件存放到軟盤的第二個扇區起始的地方,loader最大大小不應超過128KB,loader+kernel不應
  4 ; 超過512KB - 32KB = 480KB大小,否則系統將崩潰。
  5 
  6 ; Author :  
  7 ; v 0.01 2011/11/22
  8 ;
  9 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 10 org 0x7c00
 11 jmp start
 12 
 13 ; loader和kernel映像一起被加載到
 14 ; 內存段基址:0x8000 (* 0x10)
 15 ; 即在1MB尋址范圍的正中間
 16 ; 將來還會從0xf0000地址起始處放置一些系統參數
 17 ; 因此loader+kernel大小不應超過512KB - 32KB = 480KB,如果
 18 ; 超過這個數字那么地址將回滾,系統崩潰
 19 LOADER_ADDR equ 0x8000
 20 
 21 start:
 22     mov ax, cs
 23     mov ds, ax
 24     mov es, ax
 25     mov ss, ax
 26     mov sp, 0x7b00 ; 棧頂為0x7b00,向低地址延伸;其實boot中我們沒有用到棧,因此不需設置堆棧
 27     
 28     ; 清屏
 29     mov ax, 0x0600
 30     mov bx, 0x0700
 31     mov cx, 0
 32     mov dx, 0x184f
 33     int 0x10
 34 
 35     ; 設置光標位置
 36     mov ah, 0x02
 37     mov bh, 0x00
 38     mov dx, 0x0
 39     int 0x10
 40 
 41 get_disk_param:
 42     mov dl, 0x00 ; 讀軟盤
 43     mov ax, 0x0800 ; 獲取磁盤參數
 44     int 0x13
 45     jnc goon_get_disk_param ; 如果讀磁盤驅動器參數成功則保存相關參數
 46     mov dx, 0x0000 ; 出錯則將磁盤復位然后無限循環讀
 47     mov ax, 0x0000
 48     int 0x13
 49     jmp get_disk_param ; 出錯則將磁盤復位然后無限循環讀
 50 
 51 goon_get_disk_param:
 52     mov bl, cl
 53     and bl, 0x3f
 54     mov byte [SECTOR_PER_TRACK], bl ; SECTOR_PER_TRACK保存每磁道最大扇區數
 55     shr cx, 6
 56     mov word [TRACK_NUM], cx ; TRACK_NUM保存最大磁道號
 57 
 58     ; 獲取當前光標位置
 59     mov ah, 0x03
 60     xor bh, bh
 61     int 0x10
 62 
 63     ; 打印一些信息
 64     mov ax, cs
 65     mov es, ax
 66     mov cx, MSG1_LEN
 67     mov bx, 0x0007
 68     mov bp, MSG1 ; 顯示字符串"Loading System "
 69     mov ax, 0x1301
 70     int 0x10
 71 
 72 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 73 ; 加載loader和kernel文件,存放位置在0x80000起始的地方
 74 ; loader+kernel大小不應超過480KB,否則由于在實模式下僅有
 75 ; 1MB的尋址能力,loader+kernel的存放空間將超過0x80000~0xf0000的大小
 76 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 77 
 78 load_loader_and_kernel:
 79     mov ax, 0x00
 80     mov byte al, [LOADER_LEN]
 81     add word ax, [KERNEL_LEN]
 82     mov word [CUR_UNREAD_SECTOR], ax ; 初始化當前未加載的扇區數
 83     mov ax, LOADER_ADDR
 84     mov es, ax
 85     mov bx, 0x00 ; es:bx指向loader+kernel映像加載的位置:0x8000 * 0x10 + 0x0
 86 
 87 read_one_track:
 88     mov word ax, [CUR_TRACK]
 89     mov ch, al ; 當前讀到的磁道號的低8位
 90     shl ah, 0x06
 91     mov cl, ah
 92     mov byte al, [CUR_READ]
 93     inc al
 94     or cl, al ; cl寄存器高兩位為當前讀到的磁道號的高兩位,低六位為開始扇區號
 95     mov byte dh, [CUR_HEAD] ; 當前的磁頭號
 96     mov dl, 0x00 ; 驅動器號為0,代表是軟盤
 97     mov ah, 0x02 ; 讀扇區
 98     mov byte al, [SECTOR_PER_TRACK]
 99     sub byte al, [CUR_READ] ; 要讀取的扇區數量
100     int 0x13
101     mov byte cl, [SECTOR_PER_TRACK]
102     sub byte cl, [CUR_READ]
103     cmp al, cl
104     jne die ; 如果實際讀出的扇區數比所請求的扇區數少,則報錯
105     xor ah, ah
106     sub word [CUR_UNREAD_SECTOR], ax ; 修改當前剩余的未讀扇區數
107     jc finish_loading
108     cmp word [CUR_UNREAD_SECTOR], 0x00
109     je finish_loading ; 如果已經讀完loader和kernel,則跳出
110     shl ax, 0x09 ; al * 512代表本次讀出的字節數
111     add bx, ax
112     jno no_overflow
113     mov cx, es
114     add cx, 0x1000
115     cmp cx, 0xf000
116     ja die ; es已經超過了1MB的界限,說明loader+kernel過大
117     mov es, cx ; 修改es:bx緩沖區地址
118 no_overflow:
119     mov byte [CUR_READ], 0x0
120     cmp byte [CUR_HEAD], 0x0
121     je read_head_1
122     add byte [CUR_TRACK], 0x01
123     mov word ax, [TRACK_NUM]
124     cmp word [CUR_TRACK], ax
125     ja die
126 read_head_1:
127     add byte [CUR_HEAD], 0x01
128     and byte [CUR_HEAD], 0x01 ; 磁頭號由0轉為1,或者由1轉為0
129     jmp read_one_track
130 
131 die:
132     ; 獲取當前光標位置
133     mov ah, 0x03
134     xor bh, bh
135     int 0x10
136 
137     ; 打印一些信息
138     mov ax, cs
139     mov es, ax
140     mov cx, MSG2_LEN
141     mov bx, 0x0007
142     mov bp, MSG2 ; 顯示字符串"The loader or kernel is too long "
143     mov ax, 0x1301
144     int 0x10
145 
146     xor ax, ax
147     int 0x16
148     int 0x19
149     jmp $
150 
151 finish_loading:
152     ; 關閉軟驅馬達
153     mov dx, 0x03f2
154     mov al, 0
155     out dx, al
156     nop
157     
158     ; 獲取當前光標位置
159     mov ah, 0x03
160     xor bh, bh
161     int 0x10
162 
163     ; 打印一些信息
164     mov ax, cs
165     mov es, ax
166     mov cx, MSG3_LEN
167     mov bx, 0x0007
168     mov bp, MSG3 ; 顯示字符串"Success to load the loader and kernel\n\nEntering loader "
169     mov ax, 0x1301
170     int 0x10
171 
172     jmp LOADER_ADDR:0 ; 跳轉到loader去執行
173 
174 ; 要顯示的字符串
175 MSG1:                db 1310"Loading loader and kernel "1310
176 MSG1_LEN            equ $ - MSG1
177 MSG2:                db 1310"The loader or kernel is too long "1310
178 MSG2_LEN            equ $ - MSG2
179 MSG3:                db 1310"Entering loader "1310
180 MSG3_LEN            equ $ - MSG3
181 
182 CUR_READ:            db 1 ; 當前磁道已經讀出的扇區數
183 CUR_HEAD:            db 0 ; 當前的磁頭號
184 CUR_TRACK:            dw 0 ; 當前讀到的磁道號
185 CUR_UNREAD_SECTOR    dw 0 ; 當前剩余的未讀扇區數
186 
187 TRACK_NUM:            dw 0 ; 最大磁道號
188 SECTOR_PER_TRACK:    db 0 ; 每磁道扇區數
189 
190 times 507 - ($ - $$) db 0 ; 填充剩余容量為0
191 
192 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
193 ; 將loader文件的大小和kernel文件的大小都
194 ; 放到boot文件oxaa55前的末尾
195 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
196 
197 ; loader文件所占用的扇區數,loader不會大過
198 2^8 * 512 = 128KB大小,這在短期內應該足夠了
199 LOADER_LEN            db 0
200 ; kernel文件所占用的扇區數,kernel不會大過
201 2^16 * 512 = 32MB大小,這在用1.44MB大小的軟盤里足夠了
202 KERNEL_LEN            dw 0
203 
204 dw 0xaa55

      該文件是由BIOS自動從軟盤的第一個扇區加載進內存的0x0:0x7c00處的。因此必須將boot放到軟盤的第一個扇區,且要求該文件編譯出來必須是512字節,正好占用一個扇區大小。
      boot中指定了loader+kernel被加載的位置:0x8000:0x0,也就是物理地址為0x80000的位置。另外將來loader還要在地址0xf000:0x0處放置一些系統參數,因此loader+kernel文件應該位于0x8000:0x0~0xf000:0x0之間,也就是不大于480KB的大小,超過這個大小系統崩潰,無法啟動。
      該文件的核心操作就是從軟盤的第二個扇區開始將loader+kernel加載進內存,不過前提是應該已經使用proc_kernel和buildImage程序將boot+loader和kernel壓縮成一個System.Image文件,也就是說loader和kernel被一起放到軟盤的第二個扇區開始的位置,boot將連續讀磁道將loader+kernel加載到從0x8000:0x0起始的內存位置。
      還有一個地方需要注意,boot文件可啟動的標志除了大小需要是512B外,最后兩個字節也必須是0xaa55。而且我們在緊挨著0xaa55的地方開辟了3個字節的空間用來記錄loader的大小和kernel的大小,都是以扇區數計量。其中loader大小占1個字節,因此說loader不得大于2^8 * 512B = 128KB,緊挨著是kernel大小,占用2個字節。這兩個值是為了加載loader+kernel做準備的,而且這兩個值不是boot或者loader寫入的,而是buildImage這個工具直接在獲取了loader文件和kernel文件的大小后直接寫入的。
      核心的部分是將loader+kernel加載進內存,這個工作具體思想如下:boot先從自己的最后幾個字節位置獲取loader和kernel占用的扇區數量,然后再利用BIOS中斷獲取軟盤參數,最后加載對應數量的扇區,不過為了加快加載速度,這里學習了linux的做法,每次只要可以,就加載整個磁道。
posted on 2011-11-22 19:31 myjfm 閱讀(759) 評論(0)  編輯 收藏 引用 所屬分類: 操作系統
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧美日韩精品久久奇米色影视 | 欧美日韩国产色站一区二区三区| 韩日欧美一区| 欧美黄色一级视频| 欧美久久电影| 久久综合久久久久88| 久久在线播放| 欧美一区二区性| 男女精品网站| 久久精品久久综合| 欧美韩日视频| 久久精品99国产精品日本| 国产精品a级| 欧美在线一二三区| 欧美性一二三区| 久久国产精品久久久久久久久久 | 久久久www成人免费精品| 国产欧美日韩视频在线观看| 久久久在线视频| 99精品国产在热久久婷婷| 亚洲一区二区三区四区五区午夜| 国产精品视频yy9299一区| 欧美一区二区三区婷婷月色| 欧美高清视频一区二区| 在线视频亚洲| 亚洲国产精品一区二区第一页| 欧美大秀在线观看| 欧美怡红院视频一区二区三区| 亚洲第一级黄色片| 欧美诱惑福利视频| 亚洲少妇在线| 亚洲麻豆一区| 亚洲激情第一区| 激情国产一区| 国内偷自视频区视频综合| 国产精品视频区| 欧美日韩免费网站| 欧美二区在线播放| 欧美亚洲色图校园春色| 一区二区三区在线免费视频| 欧美激情成人在线| 午夜精品免费视频| 欧美aa在线视频| 欧美亚洲综合网| 在线观看亚洲a| 国产精品色婷婷久久58| 欧美精品一区三区| 久久精品免费播放| 亚洲欧美国产高清va在线播| 暖暖成人免费视频| 亚洲欧美制服中文字幕| 一本久久a久久精品亚洲| 狠狠v欧美v日韩v亚洲ⅴ| 国产精品区一区二区三区| 欧美极品色图| 蘑菇福利视频一区播放| 美女视频网站黄色亚洲| 久久不见久久见免费视频1| 亚洲日本久久| 久久精品99国产精品日本| 欧美aⅴ一区二区三区视频| 在线视频精品一| 在线日韩电影| 在线免费观看日本欧美| 国内精品久久久久影院 日本资源| 欧美特黄a级高清免费大片a级| 亚洲视频日本| 在线中文字幕一区| 久久久久久久高潮| 欧美三级电影网| 极品尤物久久久av免费看| 日韩一级精品视频在线观看| 校园春色综合网| 91久久久久久久久| 亚洲欧美伊人| 亚洲高清一区二| 久久亚洲一区| 久久国产天堂福利天堂| 久久久精品国产99久久精品芒果| 久久久精品免费视频| 久久综合国产精品| 欧美激情一区二区三区不卡| 最近看过的日韩成人| 99精品免费| 久久理论片午夜琪琪电影网| 欧美高清你懂得| 欧美日韩在线不卡一区| 国产综合久久久久久| 一区二区不卡在线视频 午夜欧美不卡在 | 日韩一区二区免费看| 午夜亚洲一区| 亚洲大片免费看| 欧美影院在线| 欧美日韩亚洲网| 亚洲人成在线播放网站岛国| 欧美一区二区私人影院日本| 亚洲狠狠婷婷| 久久综合激情| 一区二区三区自拍| 久久爱91午夜羞羞| 亚洲精品综合| 欧美韩国在线| 亚洲精品一区二区三区99| 久久亚洲影音av资源网| 性欧美在线看片a免费观看| 国产精品黄视频| 亚洲一本视频| 亚洲欧美日韩国产一区二区| 欧美婷婷久久| 欧美一区二区福利在线| 一本一本久久a久久精品牛牛影视| 欧美插天视频在线播放| 亚洲精品欧洲| 中文亚洲欧美| 国外成人在线视频| 欧美肥婆bbw| 欧美日韩一区二区三区在线| 亚洲视频一区二区免费在线观看| 99国产精品久久久久久久| 欧美日韩精品欧美日韩精品| 亚洲嫩草精品久久| 久久av一区二区三区亚洲| 亚洲高清资源综合久久精品| 亚洲国产一区二区在线| 国产精品视频一二| 免费一区二区三区| 欧美日韩午夜激情| 久久精视频免费在线久久完整在线看| 欧美一区二区福利在线| 亚洲午夜精品一区二区| 欧美中文字幕在线播放| 日韩亚洲欧美一区| 久久精品国产99| 亚洲男女自偷自拍图片另类| 嫩草伊人久久精品少妇av杨幂| 亚洲午夜精品网| 欧美精品久久久久久久久老牛影院| 午夜一区二区三区在线观看| 欧美日韩国产电影| 欧美高清自拍一区| 狠狠久久婷婷| 久久激情久久| 久久亚洲影院| 在线精品一区二区| 久久激情综合网| 久久精品一区二区国产| 国产精品久久久久久户外露出 | 亚洲视频在线观看免费| 亚洲网站视频| 国产精品女主播| 中文亚洲字幕| 久久精品在这里| 永久免费视频成人| 久久女同精品一区二区| 欧美电影在线观看完整版| 亚洲精品视频二区| 欧美日韩国产精品一区二区亚洲 | 看欧美日韩国产| 久久婷婷丁香| 日韩视频一区二区三区| 欧美午夜国产| 久久国产精品久久国产精品| 亚洲二区在线观看| 中文网丁香综合网| 狠狠色综合网站久久久久久久| 免费人成精品欧美精品| 中日韩美女免费视频网址在线观看| 午夜视黄欧洲亚洲| 又紧又大又爽精品一区二区| 欧美精品久久久久久久免费观看| 日韩午夜激情av| 欧美jizzhd精品欧美巨大免费| 日韩特黄影片| 在线精品亚洲| 国产精品揄拍一区二区| 欧美高清成人| 久久综合九色综合欧美狠狠| 亚洲欧美精品在线观看| 91久久精品美女高潮| 美女啪啪无遮挡免费久久网站| 亚洲一品av免费观看| 亚洲国产精品一区二区第四页av| 国产日韩欧美亚洲| 国产精品av久久久久久麻豆网| 欧美刺激性大交免费视频| 香蕉久久夜色精品| 正在播放亚洲一区| 亚洲一卡久久| 午夜国产精品视频| 午夜精品一区二区三区在线视| 亚洲少妇在线| 亚洲免费视频一区二区| 午夜免费在线观看精品视频| 午夜在线a亚洲v天堂网2018| 亚洲一区二区毛片| 亚洲欧美中文日韩在线| 欧美在线免费看| 女生裸体视频一区二区三区| 欧美精品v日韩精品v国产精品| 欧美精品福利在线|