《Linux 内核0.00版完全注释详解》由会员分享,可在线阅读,更多相关《Linux 内核0.00版完全注释详解(19页珍藏版)》请在金锄头文库上搜索。
1、LinuxLinux 内核内核 0 000 00 版版 完全注释完全注释 作者 大脸猫 版权 无版权 版本 v1 0 January 2009 审核 顽皮鼠 QQ 81952961 邮箱 hellin zhang 本文档主要对 linux 内核 0 00 版进行代码注释 本文大量参考了网络资源和赵炯博士的 著作 特此感谢 本文内容为学习网络上的资源和赵炯博士的著作后写的心得体会 如有技 术上错误 不承担任何责任 希望您发现错误后 及时联系本人 特此感谢 作者序 虽然我很穷 也没有什么作为 但是我要把我知道的和大家分享 这是我最大的快 乐 也算是对社会的一点贡献吧 由于本人能力有限 如果发现错误
2、之处 请大家一定要通 知我 在此 感谢大家支持 大脸猫 于沈阳 大连 二零零九年农历一月二十 001 002 boot s 003 004 boot s is loaded at 0 x7c00 by the bios startup routines and moves itself 005 out of the way to address 0 x90000 and jumps there 006 007 It then loads the system at 0 x10000 using BIOS interrupts Thereafter 008 it disables all int
3、errupts changes to protected mode and calls the 009 start of system System then must RE initialize the protected mode in 010 it s own tables and enable interrupts as needed 011 012 Boot s 代码被 BIOS 启动例程加载到内存地址为 0 x7C00 处 然后把它自己移动到一 个偏远的内存地址 0 x90000 处 跳转到 0 x90000 处继续往下执行 然后它使用 BIOS 中断将系统装载到内存地址为 0 x
4、10000 处 随之其后 关闭系统所 有的中断 使计算机系统又实模式转变到保护模式下 最后使系统开始运行 然而系 统必须对它自己的描述符表项进行重新初始化保护模式 最后开启必要的中断 013 1 44Mb disks 1 44 兆软盘 014 sectors 18 扇区数为 18 015 016 globl begtext begdata begbss endtext enddata endbss 017 text 018 begtext 019 data 020 begdata 021 bss 022 begbss 023 text 024 BOOTSEG 0 x07c0 BIOS 将此引导
5、程序加载到内存为 0 x07C00 处 31K 处 025 SYSSEG 0 x1000 system loaded at 0 x10000 65536 系统被装载到内存地址为 0 x10000 处 64K 处 为什么由 0 x07c0 0 x07C00 0 x1000 0 x10000 呢 因为在实模 式下内存的物理地址计算方法为 段地址向左移动一位 偏移地址 此时偏移地址为零 故有上述计算结果 026 SYSLEN 17 sectors occupied 系统占用 17 个扇区空间 027 028 entry start 声明程序入口点 即此程序从 start 标号处作为整个代码的 第一句
6、 计算机从此句开始执行程序 029 start 030 jmpigo BOOTSEG 以 0 x07C0 为代码段 CS 地址 以 go 标号处地址为偏移地址 进行跳转 它的作用 就是即可以达到跳转的功能 又可以对代码段 CS 寄存器赋值 此后代码段 CS 寄存器中的内容为 0 x07C0 031 go 032 mov ax cs 将代码段 CS 寄存器值 0 x07C0 赋给通用寄存器 AX 033 mov ds ax 使数据段 DS 寄存器值也为 0 x07C0 034 mov es ax 还有附件段 ES 寄存器 035 mov ss ax 堆栈段 SS 寄存器值均为 0 x07C0 0
7、36 mov sp 0 x400 arbitrary value 512 任意远大于 512 字节的栈顶值 对栈顶寄存器 SP 赋值 使它的值远离开引导程序所在的内存区域 当开始压栈时 数据进栈 随之它的值也自动向高地址变动 037 038 ok we ve written the message now 039 we want to load the system at 0 x10000 好了 现在我们已经在屏幕上打印了 Loading system 信息 接下来我们想要把系 统装载到地址为 0 x10000 64K 处了 040 load system 041 mov dx 0 x0000
8、 驱动器为 0 磁头号为 0 042 mov cx 0 x0002 开始扇区为 2 磁道号为 0 043 mov ax SYSSEG 将 0 x1000 系统内存地址赋值给通用寄存器 AX 044 mov es ax 附加段 ES 寄存器为 0 x1000 045 mov bx 0 x0000 目标内存地址为 ES BX 即 0 x10000 0 x0000 046 mov ax 0 x200 SYSLEN AH 为 0 x02 代表从硬盘读取数据到内存中 AL 为读扇区数目 047 int0 x13 BIOS 硬盘操作中断 048 jnc ok load Jump on Not Carry
9、若不发生进位 则代表磁盘读取正常 跳到读取硬盘数据成功 ok load 标号处 否则复位硬盘 重新读取数据 049 mov dx 0 x0000 050 mov ax 0 x0000 051 int0 x13 AX DX 寄存器均置零 发 BIOS 硬盘中断 代表硬盘进 行复位操作 052 jmp load system 跳到读取硬盘数据开始 load system 标号处 053 054 ok load 055 056 now we want to move to protected mode 现在我们想使系统进入到保护模式中去 057 cli no interrupts allowed 禁
10、止任何中断进入 058 059 then we load the segment descriptors 接下来 我们装载段描述符信息 060 061 mov ax cs right forgot this at first didn t work 好了 忽略了这条命令 不能工作噢 062 mov ds ax 使数据段 DS 寄存器和代码段 CS 寄存器均为 0 x07C0 063 lidt idt 48 load idt with 0 0 装载中断描述符表为 0 0 064 lgdt gdt 48 load gdt with whatever appropriate 加载全局描述表地址到全局
11、描述表寄存器中 全局描述表信息 凡是适当的情况均可以 065 066 well that went ok I hope Now we have to reprogram the interrupts 067 we put them right after the intel reserved hardware interrupts at 068 int 0 x20 0 x2F There they won t mess up anything Sadly IBM really 069 messed this up with the original PC and they haven t be
12、en able to 070 rectify it afterwards Thus the bios puts interrupts at 0 x08 0 x0f 071 which is used for the internal hardware interrupts as well Wejust 072 have to reprogram the 8259 s and it isn t fun 好了 我希望一切正常 现在我们应该重新编写中断 我们在英特尔硬件保留中断之后 编写中断号 在中断 0 x2 0 x2F 之间进行 这样不能 搞乱其它有用信息 不幸的是 对于原始的 PC 计算机 I
13、BM 把这一点给弄乱了 后来 他们并没有对中断号进行调整 因此 BIOS 把中断号放在了 0 x08 0 x0F 之间了 这也一 直使用在硬件内部的中断中 我们就是对 8259 芯片重新编程 它没多大意思 073 074 mov al 0 x11 initialization sequence 初始化序列字 B00010001 为边沿触发 有级联方式 写入 ICW4 075 out 0 x20 al send it to 8259A 1 076 out 0 xA0 al and to 8259A 2 向 8259A 1 8259A 2 的 ICW1 写入初始化序列字 077 mov al 0
14、x20 start of hardware int s 0 x20 078 out 0 x21 al 启动 8259A 1 硬件中断 0 x20 号 079 mov al 0 x28 start of hardware int s 2 0 x28 080 out 0 xA1 al 启动 8259A 2 硬件中断 0 x28 号 081 mov al 0 x04 8259 1 is master 082 out 0 x21 al 设置 8259A 1 为主中断芯片 中断请求分二级联处理 083 mov al 0 x02 8259 2 is slave 084 out 0 xA1 al 设置 82
15、59A 2 为从中断芯片 IR2 对应的级联处理芯片 085 mov al 0 x01 8086 mode for both 086 out 0 x21 al 087 out 0 xA1 al 设置两块芯片均工作在 8086 模式下 088 mov al 0 xFF mask off all interrupts for now 现在用屏蔽码方式 屏蔽所有中断进入 089 out 0 x21 al 090 out 0 xA1 al 091 092 well that certainly wasn t fun Hopefully it works and we don t 093 need no
16、 steenking BIOS anyway except for the initial loading 094 The BIOS routine wants lots of unnecessary data and it s less 095 interesting anyway This is how REAL programmers do it 096 097 Well now s the time to actually move into protected mode Tomake 098 things as simple as possible we do no register set up or anything 099 we let the gnu compiled 32 bit programs do that Wejust jump to 100 absolute address 0 x00000 in 32 bit protected mode 101 呵 那一定没啥意思 希望它能工作正常 我们不必任意地废弃 BIOS预设程序 除 非初始化装载 BIOS 例程