动态网站制作指南
[  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 操作系统 > FreeBSD教程
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ FreeBSD教程 ]的信息

本月文章推荐
.FreeBSD handbook中文版 11 打印.
.时间不对了....要怎样改呢?.
.BSD家族大观 --2. OpenBSD.
.在FREEBSD 5.2中使用Pureftpd + .
.idled 介绍 (二)设定说明.
.FreeBSD中/etc下的文件简介.
.FreeBSD 4.0 Kernel Hacking Gui.
.FreeBSD下有关分区和mount的一些.
.FreeBSD中Telnet最大连接用户数的.
.Ports & Package.
.sysctl命令.
.ports 装不起来的几种状况.
.Console中使用鼠标进行Copy-Paste.
.FreeBSD忘记root密码的一次修复.
.FreeBSD handbook中文版 11 打印.
.FreeBSD下Apache2.0运行模型分析.
.Zhcon的安装和使用(2).
.FreeBSD 5-CURRENT 的内核配置与.
.FreeBSD handbook中文版 6 配置与.
.FREEBSD升级及优化全攻略.

FreeBSD 4.0 Kernel Hacking Guide--i386/i386/l

文章类别:FreeBSD教程 | 发表日期:2005-3-28 |



这介绍 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.

上一篇:FreeBSD如何保存和使用内核更改信息? 人气:6419
下一篇:FreeBSD 4.0 Kernel Hacking Guide--i386/i386/m 人气:5823
点击此处浏览全部FreeBSD的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-5-16 乘风多用户PHP统计系统 v3.4
2008-5-16 轩溪下载系统 v3.78 build 0515
2008-5-16 普沙B2B 浙江省商贸网 v2.0
2008-5-16 asp抓蜘蛛的小程序 v1.0
2008-5-16 齐齐乐网私服发布站 仿haosf新版
2008-5-16 IssTech信息反馈系统 v1.0
2008-5-16 自由领域大头贴(js接口版) 修正版
2008-5-16 医院网站系统
2008-5-16 智拓-分类信息管理系统 v5.0
2008-5-7 Windows XP SP3 官方英文版
2008-5-7 Windows XP SP3 官方香港中文版
2008-5-7 Windows XP SP3 官方繁体中文版
2008-5-7 Windows XP SP3 官方简体中文版
2008-4-30 Multiple Unzip Wizard 1.02
2008-4-30 Multiple Unrar Wizard 1.0.0
2008-4-30 WinZip Install/Try/Uninstall a
2008-4-30 ZIP压缩文件修复器WzipFix 2.0
2008-4-30 Pentazip 6.01 Build 189 For Wi
  发表评论
姓 名: 验证码: [ 全部贴吧 ] [ 浏览评论 ]
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報