加载程序(器)的工作流程
1 初始化和决定加载位置
加载器要加载一个用户程序大致要做两件事情。第一件事是看内存中的什么地方是空闲的,加载器将用户程序加载到这个空闲的内存中;第二件事是用户程序位于硬盘中的什么位置,它的起始扇区号是多少。
nasm汇编知识
声明一个常数:
app_lab_start equ 100
常数是用equ声明的,它的意思是“等于”。用标号app_lab_start来代表数值100,之后要用到100的地方就可以使用app_lab_start。
加载用户程序需要确定一个内存物理地址。在书的配套程序中是这样写的:
phy_base dd 0x10000
这个内存物理地址不是必须是0x10000,可以使任意空闲的内存空间。但要求最低4位必须是0,换句话说,加载的起始地址是16字节对齐的,这样才能形成一个有效的段地址。
根据上面的语句我们就决定了用户程序的加载位置。
2 准备加载用户程序
和之前看的简单的主引导扇区程序不同,这里将主引导扇区程序定义成一个段。例:
SECTION mbr align=16 vstart=0x7c00
nasm汇编知识
NASM编译器定义一个段:SECTION 段名称 或者 SECMENT 段名称
每个段要有自己的段名称,它的作用是引用一个段,可以使任意名字,但不要重复或容易混淆。
段声明语句,例:
SECTION code align=16 vstart=0
align=16,表示16字节对齐。
vstart=0,当引用段内的某个标号时,该标号的汇编地址是从它所处段的起始位置开始计算的,这一点十分重要。如果没有这条语句,标号的汇编地址则是从程序开头处开始计算的。
3 外围设备及其接口
加载器确定加载位置之后,就要从硬盘中读取用户程序。处理器要访问的不止是硬盘,还有各个硬件。
所有和计算机主机连接的设备,都围绕在主机周围,争着跟计算机说话,叫做外围设配。一般来说,这些设备分为两种,一种是输入设备,一种是输出设备。
每个设备都有自己的工作方式,不用的设备连接数量、传送的信号都不一样,这然处理器该如何是好?
这时就需要一个信号转换器和变速齿轮,这就是I/O接口。比如麦克风和扬声器余姚一个I/O接口,即声卡;显示器需要显卡;USB需要USB接口。
现在又出现了问题:
①有这么多的接口,不可能多有都和处理器连接,或者还有为发现的接口怎么办,我们怎么预留出接口?
②每个接口都要跟处理对话,处理器怎样避免冲突?
对于第一个问题,采用总线技术。
对于第二个问题,使用输入输出控制设备集中器(I/O Controller Hub,ICH)芯片。该芯片的作用是连接不同的总线,并协调各个I/O接口对处理器的访问。子个人计算机上,这块芯片就是所谓的南桥。