分享
 
 
 

FreeBSD 4.0 Kernel Hacking Guide--i386/i386/locore.s

王朝system·作者佚名  2006-11-23
窄屏简体版  字體: |||超大  

这介绍 FreeBSD 的 kernel, 目前暂不包含 SMP 的部分. 我是以我个人的想法去记录下, 当我看到 code 时脑中的想法. 如果你有什麽建议, 能让你更容易看懂, 请 mail 给我. 谢谢!

i386/i386/locore.s

boot loader 将 kernel binary 读入 memory 後, kernel 的进入点.

i386/i386/machdep.c

和机器相关之 function.

i386/i386/pmap.c

physcial mapping module.

kern/init_main.c

执行 sub-system 的初始.

vm/vm_init.c

vm sub-system 初始.

vm/vm_page.c

vm_page module.

vm/vm_object.c

vm_object module.

-----------------------------------------------

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.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有