U盘实现《自己动手写操作系统》

来源:互联网 发布:淘宝客服快捷短语设置 编辑:程序博客网 时间:2024/06/05 10:14

原文地址:http://blog.csdn.net/zhanglei8893/article/details/5912903


看了《自己动手写操作系统》后,也想自己打造一个迷你操作系统,但是书中使用的软盘现在基本已经绝迹了,而U盘成为一种喜闻乐见的工具。因此想将操作系统写入U盘中,而读写U盘的引导扇区成为成功的关键。

       将U盘格式化为FAT32文件系统,要读写U盘的引导扇区,需要首先了解FAT32的格式。它包含四个部分:

保留扇区 | FAT1 | FAT2 | 数据区。需要注意的是:保留扇区的第一个扇区是引导扇区(DBR)。

其中引导扇区的数据结构为:

数据区的开始为主目录区,主目录区包含了文件的熟悉,数据结构如下:

根据每个文件起始的簇号,就可以找到文件内容的绝对扇区起始位置

文件的簇号在FAT表中安装链表的形式存放,文件的属性在主目录区安装数组的形式存放。

文件内容的绝对扇区起始位置 = 保留扇区 + FAT1 + FAT2 + (起始簇号 -2)*每簇的扇区数

然后编写引导程序,读入U盘引导扇区,选择从U盘启动,就可以看到自己打造的U盘操作系统了

引导程序的汇编代码如下:

[c-sharp] view plaincopy
  1. org 07c00h  
  2. jmp short LABEL_START  
  3. nop  
  4.   
  5. OEM                   db  'Dirichet'            ;//8Bytes  
  6. Bytes_per_sector      dw   512  
  7. Sectors_per_cluster   db   8  
  8. Reserved_sectors      dw   584  
  9. Number_of_FATs        db   2  
  10. Root_entries          dw   0  
  11. Sectors_small         dw   0  
  12. Media_descriptor      db   0f8h  
  13. Sectors_per_FAT_small dw   0  
  14. Sectors_per_track     dw   63  
  15. Heads                 dw   255  
  16. Hidden_sectors        dd   63  
  17. Sectors               dd   3902913  
  18.   
  19. Sectors_per_FAT       dd   3804  
  20. Extended_flags        dw   0  
  21. Version               dw   0  
  22. Root_dir_1st_cluster  dd   2  
  23. FSInfo_sector         dw   1  
  24. Backup_boot_sector    dw   6  
  25. times 12 db 0  
  26.   
  27. BIOS_drive            db   80h  
  28. db 0  
  29. Ext_boot_signature    db   29h  
  30. Volume_serial_number  dd   15329558  
  31. Volume_label          db   'Dirichlet09'       ;//11个字节  
  32. File_system           db   'FAT32   '          ;//8个字节             
  33.   
  34. LABEL_START:  
  35.   mov  ax,cs  
  36.   mov  ds,ax   
  37.   mov  es,ax  
  38.   call DispStr  
  39.   jmp  $  
  40.   
  41. DispStr:  
  42.   mov ax,BootMessage  
  43.   mov bp,ax  
  44.   mov cx,15  
  45.   mov ax,01301h  
  46.   mov bx,000ch  
  47.   mov dl,0  
  48.   int 10h  
  49.    
  50.   BootMessage:  db  'hello, kitty!', 13, 10, '$'   
  51.   times 510-($-$$) db 0  
  52.   dw 0xaa55  
0 0
原创粉丝点击