[SP]系統程式筆記3

3.1 Introduction

loader四大功能

Linkage Editor

行為

obj and library -> linkage Editor -> Linked Program (disk file)

載入程式

Linked Program -> Relocation Loader -> Memory

Linking Loader

連結載入器直接連結obj file並載入記憶體執行

obj and library -> linking Loader  -> Memory

3.2 absolute Loader

載入程式時,會將程式擺放到固定的主記憶體絕對位置

四大功能分配

absolute loader只做loading不做linking與relocation

啟動載入器(Bootstrap Loader)

載入kernal載入到絕對記憶體位置,如BIOS

流程

  1. 開機產生啟動中斷
  2. PC指向Bootstrap Loader的起始位置
  3. Bootstrap Loader將kernal載入到主記憶體
  4. 轉交控制權給os
  5. 轉交command Interpreter, shell

3.3 program linking

連結

連結用於處理外部參考,修改紀錄當中採用&的外部參考必須進行連結。

如果有做relocation時記憶體,連結的obj會擺在前一個obj之後,並且對每個修改紀錄進行修改,而連結的部份則會填上連結obj的symbol位置

重定位relocation

處理程式起始位置的變化

備註,現代電腦原則上同時採用修改紀錄基底暫存器進行relocation

連結檔案

relocation

address constant

重點分析

如何判斷修改紀錄中是在進行linking或relocation的行為?透過是否使用外部參考進行判斷。

何得出原始程式碼的modification record?

如何知道絕對定址、連結與重定位、重定位? 通常牽涉到外部參考的修改資料,大多都是連結與重定位,透過自生程式結尾下去計算的可以算出絕對位置。

3.4 Design Linking Loader

two passes Linking loader

資料結構

  1. object program
  2. external symbol table (ESTAB)
  3. program Load address (PROGADDR):
  4. Function address (FADDR): function應該要安排的位置

輸入資料

轉譯器(language translator)必須提供

可以去除紀錄

external symbol table

在pass1的時候產生external symbol table,內容為function與function內的D紀錄的地址找出。

pseudo code

pass1

void pass1() {
  faddr = progAddr = os.getProgAddr() // 從作業系統獲取分配的地址
  while (!eof) {
    func = file.headerRecord()
    flth = func.length
    
    find func.name in ESTAB then
      throw duplicate "External symbol"
    unfounded
      ESTAB[func.name] = func.addr

    while (recode.type != 'E') {
      file.nextRecord()
      if (record.type == 'D') {
        for (symbol in record) {
            find func.name in ESTAB then
              throw duplicate "External symbol"
            unfounded
               ESTAB[func.name] = func.addr + record.D.address
        }
      }      
    }
  }
}

pass2, loading, reloaction, linking,後兩者要從modification records找

void pass2() {
  faddr = execaddr = progAddr
  while (!eof) {
    func = file.headerRecord()
    flth = func.length

    while (recode.type != 'E') {
      file.nextRecord()
      if (record.type == 'T') {
        faddr[specified addr] =  file.objectCode()
      } else if (record.type == 'M') {
        // relocation and linking
        find modifyName in ESTAB then
          if ('+' or '-') {
            faddr[specified addr] =  + or -            
          } else {
            get offset of symbol location            
          }
        unfounded
          throw duplicate "External symbol"
      }
    }
  }
}

3.5 The other Loaders

The Other Loaders

  1. Linking Loader: allocation, linking, relocation, loading
  2. Linkage Editor: Allocation, linking, relocation(透過修改紀錄進行L&R)
  3. Relocating Loader: allocation, relocation, loading

Linkage Editor備註: start address是透過allocation分配, 如com檔案的起始位置0100,而relocation是在處理修改資料與起始位置所進行的工作。

現代系統大多採用Linkage Editor與Relocating Loader處理程式載入,

linkage Editor已經確定個別obj載入的位置

若電腦有relocation register(bash register, segment register), 是否能夠去除M紀錄?依然不可能完全去除

Dynamic Linker

直接執行main function,在執行時(run time)需要使用時在進行連結。 (binder 為 linker 的意思,也因此會有 lazy binding 這類的術語)

動態連結會浪費時間,降低程式執行效率, 程式無法連結時會導致程式崩潰。

Overlay

早期電腦因為記憶體空間不夠因此需要overlay, 共用兩個不會同時呼叫的function記憶體


System Program