Write Your Own Operating System Tutorial(6)

Lesson 6: Boot Loader

Everything we’ve done so far has been placed entirely inside the boot sector.  We can’t make our operating system very big at all if it is to fit in one sector.  We need a way of expanding.  We will do this by making a boot program that simply loads an executable file off the disk and begins executing it.  This is called a boot loader.  This file loaded off the disk can be as big as we want, since it will not be constrained to one sector.

This is more difficult than anything else we’ve done so far.  It might be a good idea, now, to locate a reference on the FAT file system (or the file system of your choice, but I will be assuming the use of the FAT system).  I will give a brief overview of the boot loading process.

A floppy disk contains, in this order, the DOS Boot Record (the first sector we have been working with), the File Allocation Table (FAT), the Root Directory, and then the data contained in the files on the disk.  (A hard disk is more complicated.  It has a Master Boot Record and multiple partitions.)  Suppose we write an operating system, compile/assemble it to a file named LOADER.BIN, and place it on the disk.  The boot loader will load it as follows.

  1. The DOS Boot Record (DBR) is read to determine the size of the DBR, FAT, and Root Directory.  The location of each on the disk is then determined.
  2. The Root Directory is read in to memory.
  3. The Root Directory is searched for the file name LOADER.BIN.  If found, we can look in the directory entry to find out which is the file’s first cluster (file allocation unit).  If not found, we give an error message.
  4. The File Allocation Table is read off the disk in to memory.
  5. Starting with the file’s first cluster, we use the FAT to locate all the clusters belonging to the file.  We read them all off the disk into memory at a specific location.
  6. We jump to that location to begin execution of the operating system.

All of the reading from the disk will be done using calls to BIOS.  If you feel adventurous, use a reference of BIOS functions to learn how to read sectors from the disk and try writing your own boot loader.  Otherwise, I have provided a slightly modified version of John S. Fine’s FAT12 bootstrap loader.  If you can find a copy of his utility “partcopy,” then use his compiling and installing instructions (and let me know where to find it).  Otherwise, copy the boot loader to the floppy disk using the same method we have used in the previous lessons.

There are many user-adjustable settings in John Fine’s bootstrap loader.  His loader assumes the use of a FAT12 file system (the system that is used on floppy disks).  For another system, you will need to use a different loader.  Things you can adjust are the locations where the operating system and various FAT data structures will be loaded into memory.  You can also adjust the filename (of the operating system) that the loader loads.

By default, the loader loads a file named LOADER.BIN in the root directory (if one exists) into memory starting at address 0x1000:0000.  (This is adjustable by the %define IMAGE_SEG).  Thus you can compile/assemble an operating system and copy it to the floppy disk as a file named LOADER.BIN.

As an example, we will take the Hello, World operating system from Lesson 4 and run it with our boot loader.  We cannot use the exact same source file from Lesson 4, however.  We need to make a few changes.  First, we need to take into account that this file will now be loaded into a different location in memory (0x1000:0000 instead of 0000:7C00), and, secondly, we can get rid of the DOS Boot Record data.

We can start the code by setting up the data and stack segments and the stack pointer.  We will do this as shown below.  The current code segment is in the CS register, and the static data assembled into the executable is here, so we will use this as the data segment as well.  For now, we will use this as the stack segment, but we will likely want to change this in the future.

       mov    ax, cs        ; Get the current segment

       mov    ds, ax        ; The data is in this segment

       cli                  ; disable interrupts while changing stack

       mov    ss, ax        ; We'll use this segment for the stack too

       mov    sp, 0xfffe    ; Start the stack at the top of the segment

       sti                  ; Reenable interrupts


Finally, we can get rid of some lines at the bottom of the source code that adds the boot sector signature and the check to make sure the file is exactly 1 sector long.  All of the other code should look familiar.  The resulting file can be downloaded here: lesson6.asm.

Assemble this file and copy it to your disk using the following commands.

nasmw lesson6.asm –o lesson6.bin

copy lesson6.bin a:/LOADER.BIN


Then, assuming you have already installed the boot loader, you can go ahead and boot with the disk.  Once you have this working, feel free to modify any other programs you have written in previous lessons, so that you can try loading them with this boot loader.  Most of the following lessons will assume that you will be using this boot loader (or other boot loader of your choice) to load your operating system file(s).

Now we can make our operating system larger than a single sector.

  • 0
  • 1
    觉得还不错? 一键收藏
  • 0
TensorFlow是一个开源的机器学习框架,用于构建和训练各种机器学习模型。TensorFlow提供了丰富的编程接口和工具,使得开发者能够轻松地创建、训练和部署自己的模型。 TensorFlow Tutorial是TensorFlow官方提供的学习资源,旨在帮助新手快速入门。该教程详细介绍了TensorFlow的基本概念、常用操作和各种模型的构建方法。 在TensorFlow Tutorial中,首先会介绍TensorFlow的基本工作原理和数据流图的概念。通过理解数据流图的结构和运行过程,可以更好地理解TensorFlow的工作方式。 接下来,教程会详细介绍TensorFlow的核心组件,例如张量(Tensor)、变量(Variable)和操作(Operation)。这些组件是构建和处理模型的基本元素,通过使用它们可以创建复杂的神经网络和其他机器学习模型。 在教程的后半部分,会介绍如何使用TensorFlow构建不同类型的模型,例如深度神经网络(DNN)、卷积神经网络(CNN)和递归神经网络(RNN)。每个模型都会有详细的代码示例和实践任务,帮助学习者掌握相关知识和技能。 此外,教程还包含了关于模型的训练、评估和优化的内容,以及如何使用TensorBoard进行可视化和调试。 总结来说,TensorFlow Tutorial提供了全面而详细的学习资源,通过学习该教程,可以快速入门TensorFlow,并且掌握构建和训练机器学习模型的方法。无论是初学者还是有一定经验的开发者,都可以从中受益并扩展自己的机器学习技能。


  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助




当前余额3.43前往充值 >
领取后你会自动成为博主和红包主的粉丝 规则
钱包余额 0