2009年(49)
分类: LINUX
2009-05-25 11:52:06
CHAPTER 2 MEMORY ADDRESSING
一
logical address à linear address à physical address (MMU 参与工作)
二
保护模式与实模式的区别。(保护模式的优点有哪些?)x86启动的时候是从实模式开始的。
三 SEGMENTATION
段选择符和段寄存器
段选择符(16bit)和offset 32bit,用来得到linear address
段寄存器可以快速的找回段选择符 cs ,,,ss,,,,ds
Cs里面,有2bit域,表示CPL Current privilege level,0 表示kernel mode。3表示 user mode。
段描述符segment descriptors 描述符都是8个BYTEs
GDT,LDT包含段描述符。
段描述符有 1code segment descriptor 2.data segment descriptor 3.task state segment descriptor.4 local descriptor table descriptor(LDTD)
TSSD 用来refers to TSS tr register存放TSSD selector,GDT里面存放TSSD
80x86里面有特殊的,程序员不能修改的寄存器,用来保存段描述符,这样可以加快访问,而不用计算得到段。
GDT存在gdtr register, LDT存在ldtr register。
Linux里面,在用户态里数据段和代码段用一个段。在内核态里面数据段和代码段用一个段。
Linux里面USERMODE不用LDT。
三 PAGING
Linear address –》 1directory 2table 3offset
这样分层可以减小pagetable的使用量。
Cr3用来存page directory。
Page directory 和 page table 有一样的数据结构。里面有一些控制字控制是否可写入等信息。
扩展分页:4MB,没有TABLE。
在64BIT ARCHITEC 中,LINEAR ADDRESS分了更多的层来表示。
高速缓冲器。
四 paging in linux
Page global directory
Page upper directory
Page middle directory
Page table
这样分可以更好的支持所有的处理器
支持分页有两个好处。?
1 每隔进程有自己的物理地址空间,并受到保护
2 区分开了page 和 page frame,这样不同的page可以对应同样的page frame,可以很方便的实现虚拟内存机制。
每个进程有自己的page global directory,在CR3中,所以每次进程切换的时候就要存入和读取出CR3中的值。
五 物理内存布局
在初始化的时候,内核必须建立物理地址映射,来指定哪些物理地址范围可以被内核使用,哪些不能(或者说哪些被用来映射为I/Oshared memory 或者page frame被用来存储 BIOS data),所以这些被保留的page frames 永远不能被换出或者被用来分配。(这是否说明物理内存其实比实际内存大?因为还加入了I/O shared memory)(FLASH 被映射在哪里?RAM被映射在哪里?I/O被映射在哪里?这些东西在什么时候被指定?)
Kernel在RAM的1MB 0x00100000的地方被启动,因为前1mb的内容被用来存储BIOS的信息。
进程的page tables:0x00000000 to 0xbfffffff both user mode and kernel mode
内核进程的 page tables:在这里面有很多东西都没有理解。