bootsect.S(ブートセクタプログラムは)何をしましたか?
ハードディスクにOSプログラム(setup.S)メモリへ
何かをやっsetup.s後の今日の外観。
なぜ書き込みに組み立て、使用するオペレーティング・システム・プログラムが開始しますか?我々は、厳密には、プログラムの実行場所を制御したいので。コンパイルは行うことができますが、それらはコンパイルするために必要なことができる前に、C言語では、実行して、私たちが制御することはできませんどこ。
なぜそれが(拡張、捕捉メモリのサイズ)それを行うかどうか?
後でメモリを管理するためには、まずメモリのサイズを知っている必要があります。
しかし、また、他のパラメータを取得する。このようなカーソル位置、ようにグラフィックスパラメータとして。
データテーブルは、後に得られた構造体を形成します。背中を管理するために。
オペレーティング・システムのすべてのコードは、アドレス0に移動した後、それはメモリ内に固定されています。その上に、オペレーティング・システムの上に塗布した後!(メモリのパス4Gは、オペレーティングシステムメモリの一部としての十分なメモリ4ギガバイトを見つけた友人によって占有されている理由です)
(Linux0.11ソースコード解析から取られた)すべてのコードのこのコースはすべて理解していれば、あなたは、オペレーティングシステムの基本的な外観になるまで持っています。読んで行くには余力がある「Linux0.11ソースコード解析が。」
この後、基本的な作業を完了するためにsetup.s。
行うには最後の事はsetup.sです。
JMPI 0,8この命令は、私たちのカリキュラムでは非常に重要な役割を果たしています。それは一定レベルのオペレーティングシステムの知識とすることができます理解することができます。
0,8 JMPIの意味は次のとおりです。0 CSに割り当てられたIP、8を割り当てること。
これは、00080 Aにジャンプします。それは80でジャンプした場合でも、クラッシュします。この命令は、実際には0番地にジャンプ。
唯一の20のメモリアクセス容量、最大1メガバイトだけが、今のコンピュータのメモリアクセス容量は4ギガバイトに達しているので、それはフェッチ方法を変更するにはどのように?
機械のような32ビットマシンに16ビットから切り替えます。(1M-> 4 GB)。
32ビット・モードでは、また、保護モードと呼ばれます。あなたはリアルモードから仕事のプロテクトモードに切り替える必要があります。
最後setup.sは、保護モードに切り替えることであるので、
16ビットおよび32ビットモードがモードである間に本質的な違いは何ですか?CPUは同じインタプリタではありません。
その前にCSは、IPの後、CSは4プラスIPを残しました。しかし、今これを説明することはできません。
他の回路に切り替えるには。
CR0レジスタが0の場合は、あること、プロテクトモードにリアルモードは1です。
これら2つの命令が終了した後、一つの回路のCPUはさらに行きます。
这条解释执行的电路要怎样解释执行呢?
CS这时变成了选择子(selector)
这时查找指令的地址的方式就变成了:CS的作用为选择表中的一个项,在这个项中取出基地址,再和IP偏移地址加在一起产生32位地址。
如果要想32位的寻址方式好使,那么就需要著名的gdt(global discription table)表
setup.s初始化gdt的部分:
切换到32位寻址方式后,CS和IP都变成了32位的寄存器。
此时中断函数也要去gdt表项里去查找。
其实是跳到了0地址去执行。
编写操作系统,除了编写操作系统的源代码以外,还要编写操作系统的控制代码,比如system是由一大堆子文件集合起来的,那么就需要你控制谁先执行。
这就是著名的makefile
学完了这个课程后,makefile必须会用!
像编辑器,直接用快捷键就能把源代码文件编译好,是因为内部帮你实现了makefile。
system是由许多子文件像bootsect,setup,head,init等组合而成,最后生成一个镜像文件Image。
最后LD,链接,生成了tools/system。
第一个模块是bootsect,接着是setup,接着是head,接着是main
head.s做了些什么事情?
又一次初始化了idt表和gdt表
刚才为啥要初始化gdt表?只是为了跳到jmpi 08这个地方去。所以临时建立gdt表。
这一次建立的表,是使操作系统真正开始工作。
还有一个要注意的是:现在的汇编代码和之前的不一样了。变成了32位的汇编代码。
操作系统特别复杂,使用了3种汇编语言:16位汇编,32位汇编,和内嵌汇编。
head.s(汇编)会跳转到main函数部分,main是一段C函数。
可以看到这是压栈操作,下图配和理解,压完main函数后,返回L6,L6将继续执行L6,这时就会死机。所以操作系统是永远不会死机的。
进入了main函数:
可以看出,main函数用于不会退出(因为没有返回L6的语句)。
可以看到,这里的函数大部分作用都是初始化。
这里只说一个,明白了它,其他的作用大概也就明白了
内存的初始化。
每4K进行一次初始化,初始化为0。4K称为一页,我们在内存管理的时候再详细说明。
end_mem就是你的机器的内存大小,这个参数是之前setup.s程序读取内存的时候获取的。
到此,系统启动基本完成。其实上就是干了两件事:1.把操作系统读入内存 2.初始化