关闭

linux内核阅读记录

727人阅读 评论(0) 收藏 举报

目录:
1概述 (ok)
2内核体系结构(ok)
3引导启动(ok)
4初始化程序(ok)
5内核代码   (ok)
6块设备驱动代码
7字符设备驱动代码
8数学协处理器 (ok)
9文件系统(ok)
10内存管理(reading) P443 (ok)
11头文件
12.库文件
13. 建造工具P573
14. 实验环境建造P580
书后附录:
1. 内核主要参数P602--604
2. 内核数据结构 P605—612
3. 80X86保护运行模式  613—623
4. ASCii 表  --624
索引

tips:
中断用于处理cpu外部的异步事件
异常用于处理cpu执行过程中自身检测的问题

posix(portable operating system interface for computing systems)
GDT 全局段描述符表
LDT 局部段描述符表
IDT 中断描述符表
page 35 开机引导过程描述

page 55  启动部分
:开机后,cpu进入实模式,从0xffff0执行,这里通常是rom-bios的地址,执行系统
检测,从物理0初始化中断向量.此后将第一扇区(boot/bootsect.s)读入绝对地址0x7c00(31kb),当它执行时,把自己移到绝对地址0x90000,并把启动设备中后2kb代码(boot/setup.s)读入0x90200处,内核的其他部分(system模块)被读入0x10000,后面setup程序会把system模块移到0x00000处,此时system代码的地址就是实际的物理地址

保护模式使用段描述符索引,实模式使用段基址.

Head.s没看完,AT&T的汇编有些难懂!

Main函数调用了很多函数,需要跟踪阅读!

内存管理 阅读 P459
Linux系统内存管理仅使用一个页目录表(4字节1K个),索引1024个页表,每个页表索引1024个内存页.每个内存页4K
32位线性地址:页目录项10 页表项10  页内偏移12

页目录和页表项结构
页框地址(32-12)   修改位1 已访问位1 用户/超级用户位1 读写位1 存在位1

内存分布
内核模块 高速缓冲(4M) 虚拟盘 主内存区
head.s程序在物理地址0处放置一个页目录表,其后4个页表用于任务0

写时复制:fork建立新进程时,子进程与父进程共享内存区,只有当其中一个进程进行写操作时,系统才为其另外分配内存.

被动写时复制操作:写操作->页面异常中断->处理写保护异常->重新执行写操作

 

内核代码 阅读

把内存地址调整为4K的边界。也就是让他的低12位为零!
START&=OXFFFFF000

80386任务状态段tss
cpu进行任务切换时,tss的字段分为两类
1. CPU
通用寄存器(EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI);

段寄存器(ES, CS, SS, DS, FS, GS);

标志寄存器(EFLAGS);

指令指针(EIP);
 
前一个执行任务的TSS的选择符(仅当返回时才更新)。
 
2.CPU读取但不会更改的静态信息集。这些字段有:
 
任务的LDT的选择符;
 
含有任务页目录基地址的寄存器(PDBR);
 
特权级0-2的堆栈指针;
 
当任务进行切换时导致CPU 产生一个调试(debug)异常的T-比特位(调试跟踪位);
 
I/O比特位图基地址(其长度上限就是TSS的长度上限,在TSS描述符中说明)。

  tss由tr寄存器指示,ltr,str存取段选择符

  在Linux 0.11中,图中SS0:ESP0用于存放任务在内核态运行时的堆栈指针。
  SS1:ESP1 和SS2:ESP2分别对应运行于特权级 1 和 2 时使用的堆栈指针,
  这两个特权级在 Linux 中没有使用。
用户态时堆栈指针则保存在SS:ESP 寄存器中

rid实际id
eid有效id
suid超级用户id
uid 用户id
gid组id
pid进程id

p183 块设备

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:32765次
    • 积分:610
    • 等级:
    • 排名:千里之外
    • 原创:28篇
    • 转载:6篇
    • 译文:0篇
    • 评论:6条
    最新评论