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

隨筆-80  評論-24  文章-0  trackbacks-0
      上篇文章已經(jīng)將難加載的ELF文件轉(zhuǎn)化成容易被loader加載的map文件,已經(jīng)是一個進(jìn)步,可是仔細(xì)想想可能還存在如下問題:boot文件的大小以及在軟盤中的位置是固定的,在軟盤的第一個扇區(qū),大小為512字節(jié),而且boot由BIOS自動加載,但是loader該放到哪呢?內(nèi)核map文件又該放到哪呢?
按照linux0.11的思路:將bootsect、setup、head、system壓縮一下,其中bootsect位于整個壓縮后的文件中的前512字節(jié),之后的文件按序排放,然后放入軟盤中。這個方法真的很簡潔。
      我加載WinixJ的方法同樣借鑒linux,將boot文件放在image文件的最前面512字節(jié),之后是loader文件,再之后是內(nèi)核map文件。這樣讓boot一次性完成加載loader和內(nèi)核map文件入內(nèi)存的工作。其中boot位于軟盤的第一扇區(qū),loader從第二扇區(qū)開始延伸,之后是map文件。不過還需要知道的是loader文件和map文件到底有多大,這兩個數(shù)字我選擇放到boot文件的尾部,位于boot標(biāo)志0xaa55的前面。loader和map文件的長度都是以扇區(qū)為單位,假設(shè)loader文件有1000字節(jié)長,則laoder_len = 1000 >> 9 + (1000 % 512 ? 1 : 0);map_len的含義類似。所以image中可能會含有一些空域,這些空域是由于loader或map文件并非正好占用若干扇區(qū)而造成的。
build.c文件代碼如下:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 #include <unistd.h>
  5 #include <sys/stat.h>
  6 
  7 #define BUF_LEN 520
  8 #define BOOT_BUF_LEN BUF_LEN
  9 #define FILE_NAME_LEN 50
 10 
 11 unsigned char boot_buf[BOOT_BUF_LEN]; //緩存boot文件內(nèi)容
 12 unsigned char buffer[BOOT_BUF_LEN];
 13 
 14 char boot[FILE_NAME_LEN]; //存儲boot文件名
 15 char loader[FILE_NAME_LEN]; //存儲loader文件名
 16 char kernel[FILE_NAME_LEN]; //存儲kernel文件名
 17 char image[FILE_NAME_LEN]; //存儲輸出文件的文件名
 18 
 19 FILE *bootp = NULL; //boot文件的文件操作句柄
 20 FILE *loaderp = NULL; //loader文件的文件操作句柄
 21 FILE *kernelp = NULL; //kernel文件的文件操作句柄
 22 FILE *imagep = NULL; //image文件的文件操作句柄
 23 
 24 static void usage()
 25 {
 26     fprintf(stderr, "Usage: build [-b ../boot/boot] ");
 27     fprintf(stderr, "[-l ../boot/loader] [-k ../kernel/kernel.map] [-w ../Image]\n");
 28 }
 29 
 30 static void init()
 31 {
 32     //指定默認(rèn)的boot、loader、kernel和輸出文件的文件名
 33     strcpy(boot, "../boot/boot"); //默認(rèn)情況下boot文件在頂層目錄的boot子目錄中
 34     strcpy(loader, "../boot/loader"); //默認(rèn)情況下loader文件在頂層目錄的loader子目錄中
 35     strcpy(kernel, "../kernel/kernel.map"); //默認(rèn)情況下kernel文件在頂層目錄的kernel子目錄中
 36     strcpy(image, "../System.Image"); //默認(rèn)在頂層目錄生成系統(tǒng)映像
 37 }
 38 
 39 static void proc_opt(int argc, char * const *argv)
 40 {
 41     int ch;
 42     opterr = 0//不顯示錯誤信息
 43 
 44     while ((ch = getopt(argc, argv, "b:l:k:w:h")) != -1)
 45     {
 46         switch (ch)
 47         {
 48             case 'b'//指定boot文件名
 49                 strcpy(boot, optarg);
 50                 break;
 51             case 'l'//指定loader文件名
 52                 strcpy(loader, optarg);
 53                 break;
 54             case 'k'//指定kernel文件名
 55                 strcpy(kernel, optarg);
 56                 break;
 57             case 'w'//指定輸出的系統(tǒng)映像文件名
 58                 strcpy(image, optarg);
 59                 break;
 60             case 'h':
 61                 usage();
 62                 exit(1);
 63         }
 64     }
 65 }
 66 
 67 static void open_file()
 68 {
 69     //如果指定的boot文件不存在,則退出
 70     if (0 != access(boot, F_OK))
 71     {
 72         fprintf(stderr, "\"%s\": No such file.\n", boot);
 73         exit(1);
 74     }
 75     
 76     //如果指定的loader文件不存在,則退出
 77     if (0 != access(loader, F_OK))
 78     {
 79         fprintf(stderr, "\"%s\": No such file.\n", loader);
 80         exit(1);
 81     }
 82     
 83     //如果指定的kernel文件不存在,則退出
 84     if (0 != access(kernel, F_OK))
 85     {
 86         fprintf(stderr, "\"%s\": No such file.\n", kernel);
 87         exit(1);
 88     }
 89 
 90     //如果指定的image文件存在,則給出warning
 91     if (0 == access(image, F_OK))
 92     {
 93         fprintf(stderr, "Warning: The file \"%s\" exists.\n", image);
 94         fprintf(stderr, "But we will go on \n");
 95     }
 96 
 97     bootp = fopen(boot, "r+");
 98     //如果不能打開boot文件
 99     if (NULL == bootp)
100     {
101         fprintf(stderr, "cannot open the file \"%s\".\n", boot);
102         exit(1);
103     }
104 
105     loaderp = fopen(loader, "r+");
106     //如果不能打開loader文件
107     if (NULL == loaderp)
108     {
109         fprintf(stderr, "cannot open the file \"%s\".\n", loader);
110         exit(1);
111     }
112 
113     kernelp = fopen(kernel, "r+");
114     //如果不能打開kernel文件
115     if (NULL == kernelp)
116     {
117         fprintf(stderr, "cannot open the file \"%s\".\n", kernel);
118         exit(1);
119     }
120 
121     imagep = fopen(image, "w+");
122     //如果不能創(chuàng)建image文件
123     if (NULL == imagep)
124     {
125         fprintf(stderr, "cannot create the file \"%s\".\n", image);
126         exit(1);
127     }
128 }
129 
130 int main(int argc, char * const *argv)
131 {
132     int n;
133     struct stat loader_stat, kernel_stat;
134     int loader_len = 0, kernel_len = 0;
135 
136     init(); //初始化
137 
138     proc_opt(argc, argv); //處理命令行參數(shù)
139 
140     open_file(); //打開boot、loader、kernel和image文件
141 
142     //將boot文件的512字節(jié)讀入boot_buf緩沖區(qū)
143     n = fread(boot_buf, 5121, bootp);
144 
145     if (1 != n)
146     {
147         fprintf(stderr, "cannot read 512 bytes from %s.\n", boot);
148         exit(1);
149     }
150 
151     //檢查boot文件的末尾兩個字節(jié),如果為0xaa55,則認(rèn)為是合法的boot文件
152     if (0xaa55 != *(unsigned short *)(boot_buf + 510))
153     {
154         fprintf(stderr, "%s is not bootable file.\n", boot);
155         exit(1);
156     }
157 
158     //獲取loader文件的信息
159     n = stat(loader, &loader_stat);
160     
161     if (-1 == n)
162     {
163         fprintf(stderr, "cannot get %s's status.\n", loader);
164         exit(1);
165     }
166 
167     //獲取loader文件的長度,按字節(jié)計算
168     loader_len = loader_stat.st_size;
169 
170     //獲取kernel文件的信息
171     n = stat(kernel, &kernel_stat);
172 
173     if (-1 == n)
174     {
175         fprintf(stderr, "cannot get %s's status.\n", kernel);
176         exit(1);
177     }
178 
179     //獲取kernel文件的長度,按字節(jié)計算
180     kernel_len = kernel_stat.st_size;
181 
182     //修改boot中LOADER_LEN和KERNEL_LEN字段,詳細(xì)請查看boot.asm源碼最后10行
183     boot_buf[507= (0 == (loader_len & 0x1ff)) ? (loader_len >> 9) : (loader_len >> 9+ 1;
184     *(unsigned short *)(boot_buf + 508= (0 == (kernel_len & 0x1ff)) ? (kernel_len >> 9) : (kernel_len >> 9+ 1;
185 
186     //將boot文件內(nèi)容寫入image文件中
187     n = fwrite(boot_buf, 5121, imagep);
188 
189     if (1 != n)
190     {
191         fprintf(stderr, "cannot write into %s.\n", image);
192         exit(1);
193     }
194 
195     //將loader文件寫入image中,按扇區(qū)數(shù)來寫入,最后一扇區(qū)不夠的用0補(bǔ)足
196     while (loader_len > 0)
197     {
198         memset(buffer, 0sizeof(buffer));
199         n = fread(buffer, loader_len > 512 ? 512 : loader_len, 1, loaderp);
200 
201         if (1 != n)
202         {
203             fprintf(stderr, "cannot read %d bytes from %s.\n"
204                     loader_len > 512 ? 512 : loader_len, boot);
205             exit(1);
206         }
207 
208         n = fwrite(buffer, 5121, imagep);
209         
210         if (1 != n)
211         {
212             fprintf(stderr, "cannot write into %s.\n", image);
213             exit(1);
214         }
215 
216         loader_len -= 512;
217     }
218 
219     //將kernel文件寫入image中,按扇區(qū)數(shù)來寫入,最后一扇區(qū)不夠的用0補(bǔ)足
220     while (kernel_len > 0)
221     {
222         memset(buffer, 0sizeof(buffer));
223         n = fread(buffer, kernel_len > 512 ? 512 : kernel_len, 1, kernelp);
224 
225         if (1 != n)
226         {
227             fprintf(stderr, "cannot read %d bytes from %s.\n"
228                     kernel_len > 512 ? 512 : kernel_len, boot);
229             exit(1);
230         }
231 
232         n = fwrite(buffer, 5121, imagep);
233         
234         if (1 != n)
235         {
236             fprintf(stderr, "cannot write into %s.\n", image);
237             exit(1);
238         }
239 
240         kernel_len -= 512;
241     }
242 
243     fclose(bootp);
244     fclose(loaderp);
245     fclose(kernelp);
246     fclose(imagep);
247 
248     return 0;
249 }

程序還是比較好理解的,大體思想正如上面所說。最后生成的System.Image是最終的系統(tǒng)映像文件。它的大體組織前述已經(jīng)比較清晰,不過畫圖更加容易理解:
posted on 2011-11-20 14:59 myjfm 閱讀(448) 評論(0)  編輯 收藏 引用 所屬分類: 操作系統(tǒng)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲国产欧美在线| 久久av一区| 欧美夜福利tv在线| 亚洲午夜视频在线观看| 亚洲欧洲日产国产综合网| 亚洲大胆人体视频| 99re热这里只有精品免费视频| 亚洲伦理在线免费看| 亚洲欧美另类在线| 久久一区二区三区av| 亚洲国产精品成人综合| 亚洲人成在线观看| 亚洲欧美日本国产有色| 久久午夜精品一区二区| 欧美精品一区二区在线播放| 国产精品美女在线观看| 精品动漫3d一区二区三区免费| 99国产精品久久久久老师| 久久国产精品第一页| 樱桃视频在线观看一区| 亚洲精品乱码| 欧美中文字幕精品| 亚洲欧洲日韩女同| 欧美一区二区啪啪| 欧美日韩久久不卡| 在线不卡视频| 亚洲在线一区| 欧美激情一区二区三级高清视频| 这里只有精品电影| 欧美成人在线网站| 国产精品二区在线| 激情五月婷婷综合| 在线亚洲欧美专区二区| 欧美一区二区三区四区夜夜大片 | 亚洲一区二区三区午夜| 亚洲国产精品欧美一二99| 国产亚洲欧美一区在线观看 | 欧美中在线观看| 久久久五月婷婷| 老牛影视一区二区三区| 91久久在线播放| 欧美一区二区三区在线观看 | 欧美一区二区三区另类| 久久一二三四| 99精品福利视频| 久久久亚洲高清| 欧美三区在线视频| 在线成人h网| 亚洲欧美区自拍先锋| 欧美高清视频一区二区| 亚洲手机成人高清视频| 免费国产自线拍一欧美视频| 国产精品qvod| 在线国产精品播放| 欧美一级一区| 日韩亚洲欧美综合| 美女尤物久久精品| 欧美日韩国产精品一区二区亚洲| 在线视频日韩| 欧美精品久久一区| 美女国产精品| 久久久精品国产免大香伊| 国产欧美 在线欧美| 一本色道久久综合亚洲91| 久久亚洲精选| 亚洲综合精品| 国产精品乱人伦中文| 艳女tv在线观看国产一区| 欧美成人小视频| 久久狠狠久久综合桃花| 国产精品一区亚洲| 蜜臀a∨国产成人精品| 欧美成人精品1314www| 国内在线观看一区二区三区| 亚洲欧美一区二区精品久久久| 亚洲精品视频在线看| 欧美激情在线| 亚洲天堂av综合网| 在线综合视频| 国产拍揄自揄精品视频麻豆| 香蕉久久国产| 欧美一区2区视频在线观看| 国产欧美一区二区三区另类精品 | 亚洲国产片色| 亚久久调教视频| 国产资源精品在线观看| 久久综合一区二区三区| 久久中文精品| 日韩系列在线| 亚洲毛片网站| 欧美视频中文一区二区三区在线观看| 亚洲免费福利视频| 亚洲精品色图| 国产精品久久久久久福利一牛影视 | 欧美肉体xxxx裸体137大胆| 中文在线不卡视频| 99成人在线| 国产亚洲欧美日韩美女| 欧美激情精品久久久久久蜜臀| 亚洲尤物在线| 在线观看欧美精品| 亚洲精品日产精品乱码不卡| 午夜在线视频一区二区区别| 国产日韩欧美麻豆| 欧美成人精品高清在线播放| 欧美激情一区二区久久久| 亚洲免费一级电影| 欧美一区二区三区精品| 亚洲国产成人一区| 日韩视频在线观看| 激情久久五月| av成人动漫| 国产综合精品一区| 亚洲精品国产拍免费91在线| 国产欧美日韩精品在线| 欧美一区二区精品在线| 亚洲国产一区二区a毛片| 欧美日韩午夜激情| 久久在线免费观看视频| 欧美日韩国产二区| 久久综合中文色婷婷| 久久精品国产久精国产思思| 国产亚洲视频在线| 农夫在线精品视频免费观看| 欧美午夜一区二区福利视频| 国内外成人免费视频| 欧美国产三区| 国产视频一区二区三区在线观看| 国产午夜精品美女视频明星a级| 欧美一区成人| 欧美成年人视频网站| 久久精品一区二区国产| 国产精品v欧美精品∨日韩| 欧美www视频| 国产日韩在线播放| 在线亚洲欧美| 99视频在线观看一区三区| 久久精品理论片| 亚洲欧美日韩成人高清在线一区| 亚洲欧美日韩国产综合| 亚洲免费观看视频| 久久综合五月天婷婷伊人| 久久久久成人精品免费播放动漫| 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 久久久人成影片一区二区三区| 亚洲国产日韩美| 亚洲女同性videos| 国产精品日韩精品欧美在线| 亚洲人永久免费| 亚洲欧洲日产国产网站| 久久综合成人精品亚洲另类欧美| 久久久久久久精| 国产日韩欧美二区| 亚洲欧美韩国| 香蕉久久久久久久av网站| 欧美亚男人的天堂| 一本色道久久综合亚洲精品不 | 你懂的视频一区二区| 久久婷婷麻豆| 国语自产精品视频在线看| 性欧美videos另类喷潮| 亚洲一区二区三区四区在线观看| 欧美精选午夜久久久乱码6080| 亚洲国产精品一区在线观看不卡| 悠悠资源网亚洲青| 老司机凹凸av亚洲导航| 亚洲高清资源| 99pao成人国产永久免费视频| 欧美一区二区高清| 欧美成人午夜剧场免费观看| 亚洲精品久久久久久久久久久久| 欧美高清日韩| 亚洲深夜福利网站| 久久成人免费| 亚洲国产美国国产综合一区二区| 美女尤物久久精品| 一道本一区二区| 亚洲精品一区中文| 久久综合狠狠综合久久激情| 欧美激情中文字幕一区二区| 亚洲精选在线| 免费成人你懂的| 亚洲国产精品嫩草影院| 亚洲一区免费网站| 欧美在线91| 亚洲国产精彩中文乱码av在线播放| 久久久久久久久久看片| 欧美激情导航| 在线性视频日韩欧美| 国产精品老牛| 欧美r片在线| 亚洲国产美女精品久久久久∴| 欧美一二三视频| 亚洲精品久久久蜜桃| 欧美视频在线观看一区| 久久精品国产91精品亚洲| 亚洲欧洲一区| 老司机久久99久久精品播放免费| 一区二区免费在线观看| 国产综合亚洲精品一区二|