鱼C论坛

 找回密码
 立即注册

操作系统自学笔记 20130912 —— 进入32位模式并导入C语言 2

已有 1044 次阅读2013-9-12 17:06

            接着昨天的开始看:
            作者接下来提到的是制作磁盘映像。先编写一个小程序然后要保存到磁盘映像里面。然后用二进制编辑器打开,我们就会发现向一个空的软盘保存文件的时候,文件名是写在0x00 2600以后的地方。文件的内容则会写在0x00 4200以后的地方。
            知道了上面作者提到的这个关于软盘存储的规律,下面要做的事情就是将 .sys(这个.sys是之前由二进制编辑器保存为.nas之后再由NASK作者自己的编译器编译成.sys得到的) 保存到磁盘映像里,然后从磁盘的启动区执行程序就可以了。
           OK~目的我们知道了,下面要做的就是从启动区执行操作系统。
           内容自然是写在0x00 4200之后的,但是要把c磁盘的内容装载到内存的0x8000去,那么磁盘文件的内容在内存的地址就应该是:0x8000+0x4200=0xc200   .   (???这是什么,对了。。我记混了。。之前表示地址的是寄存器之间的计算。   段X16+偏移。和这个混起来了。清楚了就好)
              OK,既然在内存里的地址我们知道了,那么下面我们就在.nas(之前编辑程序的文件)加上ORG 0xc200
         我想想ORG的全拼:origin~,不会说成organization了。嘿嘿~
         下面还要在ipl.nas的结尾加上JMP 0xc200.得到的结果在光盘文件里可查,我去查一下。看到了所有的操作了。下面就是怎么知道我们有没有实现执行.sys这个行动呢?这就是下面的一小节——确认操作系统的执行情况。
         这次作者不玩HELLO~OS~了,作者要切换画面模式~(好期待啊好期待啊~呵呵呵额呵呵)
         AH=0x00之后,调用显卡的BIOS函数就可以实现切换画面。
         这里提到的前几天的日志一直没做笔记的就是查看BIOS函数。在支持网页AT里查看,作者这里有插好的直接结果,我就直接看了。前面的这个结论0x00也是在看了AT之后才知道的。
   里面的什么0x03啦,0x12啦都是各种画面模式。
          其实这次的haribote.nas就是我们所说的“操作系统”,实现的目标已经明确。
                         haribote-os
                         TAB=4
                                    ORG  0xc200   
                                    MOV  AL,0x13   
                                    MOV  AH,0x00
                                    INT  0x10
                         fin:
                            HLT             ; (之前我们看过这个部分,就是让CPU暂时待机)
                          JMP  fin
            这里还有另外一个部分就是ipl10.nas,里面改了数据,这里就是说这个程序只能读入10个柱面。
            想要把磁盘装载内容的结束地址告诉.sys就在JMP 0xc200之前加上将CYLS的值写进内存地址0x0ff0中。。
 
            继续下面的内容就是32位模式的前期准备。
           作者准备了一个C语言的编译器,可以将C语言编程32位模式的机器语言。
            提醒:因为进入了32位之后就不可以调用BIOS函数了,所以要用的话要在进入32位模式之前全部准备好。
   
   之前做的是画面模式,现在要做的是键盘了。       
   
   解释书本上的那段程序:VRAM的含义就是Video RAM 就是显卡内存。每一个地址都是对应的显示器上的像素点。
          但是不同的画面模式的话像素点的信息也是不一样的,所以要预先把不同像素点的信息保存在BOOT_INFO 也就是Boot information.启动时候的信息。这就是之前在程序前边要保存的东西。
          之后还需要把像素数啊颜色数,取得的键盘的信息保存起来。就像之前的BOOT_INFO一样。
    重要的是要看在保存之后查找下内存分布图,看看是不是冲突。
   
    下面就是开始导入C语言。行为是切换到32位模式。 
          这里面的.sys文件前部分是汇编后边是C。所以涉及到后面调用C的问题,作者想推倒后面讲。
    直接进入正题:每次我们想启动操作系统的时候都需要写其他的各种处理,那么我们要把处理打成一个包,pack。
             核心部分这里:
             void HariMain(void)
{
fin:
 
 goto fin;
}
             这个bootpack.c是个C语言程序,那么该如何变成机器语言?一共5步。
             1.用ccl.exe从.c变成.gas
             2.用gas2nask.exe从.gas变成.nas
             3.用nask.exe从.nas生成.obj
             4.之后就是用.exe将.obj变成.bim
             5.bim变成hrb
             就结束了,。。。这就是机器语言了最后使用copy指令将.bin和hrb单纯结合起来得到了.sys(就是个写映像的过程)
             注释:ccl 是GCC的作者改版。是C编译器。输出的是gas用的源程序。gas2nask的含义就是gas to nask。
            下面说道了娃娃今儿在留言板和我说的那个链接的问题了~
            目标文件是一种特殊的机器语言文件。.obj. 必须与其他的文件link 之后才可以使用。这就是有些东西必须用汇编语言来写然后链接到C语言的程序上。
            以后都要考虑这个链接的问题了。
            为了将一个文件盒其他的文件链接,那么除了机器语言部分之外,还有一部分是用来交换信息的了。为了做成完整的机器语言文件就要将必要的目标文件全部连接上。
            作者使用的是obj2bim。bim就是binary image,作者自创的文件格式。后面还有个exe是实现为了实际使用针对每一个操作系统进行加工的程序。作者后面介绍。
            最后作者还是要实现HLT,但是实际这个例子是用来讲解如何链接的吧~
            为了链接,将输出的文件格式表示为WCOFF模式。
 naskfunc
TAB=4
[FORMAT "WCOFF"]   
[BITS 32]      

[FILE "naskfunc.nas"]   
  GLOBAL _io_hlt   
[SECTION .text]  
_io_hlt:                     ; void io_hlt(void);
  HLT
  RET                        ;return
            下面在.c里面使用的话就直接io_hlt就可以了。
           上面就是实现C 链接的过程。
                   
            OKOK~今儿的结束了,还是觉得在学习这部分的内容的时候要不听想着我想要干什么,我只是想学习这操作系统怎么编写的。本质是什么,然后自己编一个就为了娱乐+让脑子清醒~~~这很明晰的目标可以让我不会对长时间的工作产生厌倦,不能迷失在这个浩瀚的海洋里面~
            
       
        

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-13 07:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部