荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: jjk (Welcome to InstallBBS,Linux!), 信区: Linux
标  题: Kernel Hacking Guide(1)
发信站: 荔园晨风BBS站 (Thu Dec 13 19:52:11 2001), 转信

【 以下文字转载自 jjk 的信箱 】
【 原文由 jjksam@smth.org 所发表 】
发信人: gracewind (和风), 信区: FreeBSD
标  题: Kernel Hacking Guide(1)
发信站: BBS 水木清华站 (Wed Dec 12 09:35:16 2001)

i386/i386/locore.s

當 boot loader load kernel 之後, i386/i386/locore.s
為 kernel 的進入點. 第一個被執行的 code 為 label btext 所標
示的 assembly code.

boot manager (bootstrap) 會從 stack 傳入. 最主要的的參數是
bootinfo, 開機時使用者所下的參數和 bios 資料. 248 行 call
recover_bootinfo, recover_bootinfo 即從 stack 取得 bootinfo,
即之存入變數 _bootinfo, 讓以後的 C code 可以直接以 global
變數(bootinfo)讀使.

256 行, 設立之一個新的 stack 供之後的 instruction 使用. stack
之所以在此設立, 是因為我們必需先從舊的 stack 取得 bootinfo 的
內容, 然後才可以設立新的 stack, 丟棄舊的 stack.
258 行, call identify_cpu 以辨別 CPU 的型號. identify_cpu 會設
定幾個 global 變數.
        _cpu    CPU 的種類, 為 32 bits 的整數, 所有的 constant
                都定義在 i386/include/cputypes.h, 45行-60行.
                相對應的文字和 CPU 分類, 定義在 i386/i386/identcpu.c
                , 89行, i386_cpus.
        _cpu_vendor     CPU 製造商.
        _cpu_id         CPU 的 ID. 也許就是 Intel 所提的序號.
        _cpu_feature    unknow ???

303-309 行, 清除 bss.

311 行, call create_pagetable. 設定進行入 protected mode 之後,
enable paging 所需的 page table. create_pagetable 的說明請見
後面的說明.

316-336行, enable paging mechanical. 在此, IP register 的 value
        為 kernel 的 physical address, 因此會使用到 create_pagetable
        920-923行, 重複 mapping 的 page table.

347-348行, 以 ret 的方式跳到 begin 執行. 在執行完 ret 後, IP register
        將指到我們所期望的 KERNBASE virtual address.

353-359行, 重新設立 stack 和 PCB.

363行, call _init386, i386/i386/machdep.c, 1802行, function init386.
        傳入 physfree, 尚未使用的 free memory. init386 設定各種
        cpu 會使用到的 table, 如 gdt, ldt, idt, tss. 並進行 proc0
        的資料設定. init386 所進行的工作愔為複雜, 主要是進行初始化
        的動作, 以讓機器(CPU+內部裝置)可以順利的在 protected mode 運作.
        詳細動作, 請見專篇報導.

377行, call _mi_startup, 執行 mi_startup 函數, kern/init_main.c, 171行.
        從此開始, 正式進入 kernel 的核心部分.

create_pagetable: 744行,

746-778行, 計算出 kernel 結束的位址, 並設立兩個 global 變數,
        _KERNend        kernel 的結束位址.
        physfree        尚未使用的記憶体. 在初使階段, physical
                        address 的配置是從 kernel 之後的空間,
                        依序配置. 在此設立此變數, 以記錄目前
                        可用空間的開始位置.
781-814行, 為各種系統資料配置記憶空間.
        _KPTphys        kernel 所使用的 page table. 共 NKPT 個
                        page. (physical address)
        _IdlePTD        page table directory. 有關 page table
                        架構, 請參考 Intel 所出的 programming
                        guide. (physical address)
        p0upa           UPAGE (physical address)
        _proc0paddr     (virtual address)
        vm86phystk
        _vm86pa
        _vm86paddr      (virtual address)

831-935行, 設定 page table. 將所有上面配置的空間和 kernel 所佔之間空
        依 physical addr 順序, map 到 virtual address 的 KERNBASE 位址.
        831-834行, 將 kernel 的 text section map 成為 read only page.
        837-851行, 將 kernel 的 data, bss 和symbols map 成為 read-write
                page.
        ..........
920-923行, 將第一個 page table map 到 page directory 的第一個
         entry. 這一個 page table 將會"暫時"在 page directory
         map 兩次. 主要是因為目前的指令實際執行的 address
         為 physical address, 當一開始 enable paging 時, 將會
         產生一個模糊地帶, 使的我們 address 依然是以 physcial
         address 的值進行 map, 而不是我們所希望的 KERNBASE
         為其 base. 因此, 我們做此 map, 以便在 enable paging
         之後, 可以順利的執行正確的 code.

926-929行, 將 _KPTphys 安裝在 page table directory(PDE) 正確的位置,
          使 kernel map 到 KERNBASE.

932-935行, 將 PDE 安裝在 PDE 上, 這是一個 recursive 的做法, 如
          此會使的 PDE 在第二層 mapping 時, 轉而成為 page table,
          使的原本 PDE 所 mapping 的 page table 反而成為最後的
          destination memory. 我們可以直接透過 mapping 直接讀每
          一個 page table.


--
             《金陵酒肆留别》

       风吹柳花满店香,吴姬压酒唤客尝。
          金陵子弟来相送,欲行不行各尽觞。
          请君试问东流水,别意与之谁短长。


※ 来源:·BBS 水木清华站 smth.org·[FROM: 210.28.216.9]
--
※ 转载:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.146]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店