ttxs 发表于 2009-2-11 20:49

页表基址寄存器是什么?

我是刚接触虚拟存储器,mmu等概念.<br />拿普通的二级页表的系统来说,每一个进程有自己的一个页表目录(第一级页表)<br />但是要区分进程的运行,应该有一个页表基址寄存器吧?<br />这是什么呢?&nbsp;<br />里面存的是当前运行的进程的页表地址吗?<br />它是mmu自带的一个reg&nbsp;abc吗,还是属于内存的一部分?<br />对它的读写是:给它个地址然后让CPU读写?或直接mmu&nbsp;自己弄的?<br />操作系统是不是与之关系紧密啊?<br />请高手们帮我解解惑.谢谢了.<br />

computer00 发表于 2009-2-13 08:59

晕...都给了你具体的书名了,还不去看呀...

在X86里,那个寄存器叫做CR3(属于CPU的一个寄存器),每个进程在调度准备运行时,都要先设置好它的CR3,这样就访问到了对应的物理内存。<br /><br /><br />如下图:<img src="https://bbs.21ic.com/upfiles/img/20092/200921385510864.gif">

computer00 发表于 2009-2-11 21:25

建议看看《Linux内核情景分析(上).pdf》这个电子书

ttxs 发表于 2009-2-11 22:57

谢谢

我是硬件电路方面的本科生,被分到一个涉及计算机体系结构的soc毕业课题.<br />主要是用verilog语言搭电路,对操作系统几乎不了解,暂时也没有精力在软件方面研究太深,所以大侠们能否迁就我一下,简单地把硬件实现说一说.

ttxs 发表于 2009-2-12 19:28

这样想对不对

操作系统的事交给软件高手.我cpu和ram的字长为32,页大小4k.<br />以单级页表为例:<br />假设我的这个最小系统最多同时允许2个进程(分时站用cpu),我就设计一个页表基址寄存器(?位),软件高手的os通过向它不断的写入新值来指向os建好的两个进程的页表.?+20=32,其中20是虚页号的位数.<br />但cpu是如何寻址页表基址寄存器?他如何编址,且位数应该是32啊?

high 发表于 2009-2-12 19:57

我说一种情况

TLB安排在内存,&nbsp;cpu有一个寄存器,&nbsp;写内存地址到这个寄存器就设置好页表首地址。

ttxs 发表于 2009-2-12 22:10

谢谢high,你可真是个好人啊!

TLB是快表啊,他是内存前一级的一个缓存部分页表项的高速缓存,有使2次访问内存简化为1次的作用.我在想是不是设计2个tlb(FIFO实现),分给两个进程?<br />您说&quot;TLB安排在内存&quot;是什么意思?<br />我若用cpu里的寄存器当页表基址寄存器,load&nbsp;r1,baddr;之后cpu&nbsp;addressbus就发出虚拟地址A了,难道在同一个周期也让cpu&nbsp;databus&nbsp;输出寄存器r1的值?我有些乱了.

high 发表于 2009-2-13 02:45

sorry,我说错了。

TLB安排在内存&nbsp;--&gt&nbsp;页表内容,页表项保存在内存<br /><br />TLB是一个cache,加速对页表的访问。

ttxs 发表于 2009-2-13 11:58

非常感谢computer00

实在是不好意思,我的理解力实在很差的。那本电子书我下载了,看到第一章预备知识后,感觉很有启发。谢谢了。<br />但是我特别关心硬件连线verilog写法(我表达能力有限,现在才说)。<br /><br />我有几点理解,您如果觉得问得挺弱智,回答“对”,“错”就行。<br />1,从用load指令改写CR,到产生最后的物理页面地址整个过程,是由mmu完成的,cpu不占数据总线,换句话,不考虑流水线,则cpu只是执行了刚才的load&nbsp;CR.两次对Ram的读操作以及相加拼接操作,没有CPU的事(它只需保证READ=1就行)<br />2,CR的32位的值如何从CPU里跑出来?CPU不会自动把它放在databus上,我就想到改写手头的CPU&nbsp;module,给他加上个端口,用32位导线把CR的值倒出来:assign&nbsp;line=CR;<br /><br />

computer00 发表于 2009-2-13 12:08

1. 是的。2. 你可以把它做成一个属于MMU的REG,CPU可以访问它

对于HDL,俺不熟,也没做过。只知道CPU里面有这么一个东西,具体在哪,怎么实现的俺不清楚。

db10 发表于 2009-2-14 11:26

00

&nbsp;是否已经研究出MMU自己的程序?

computer00 发表于 2009-2-17 00:33

研究个鬼呀...没有深入,只是平时看资料时积累的零碎东西

thw 发表于 2009-2-18 02:24

...

lz不要闭门造车了。找一个PPC或ARM的手册看看MMU是怎么回事,操作MMU/TLB的相关指令再决定你怎么做吧。<br />如PPC604系列,TLB&nbsp;MISS是由硬件逻辑处理的。e500核的CPU&nbsp;TLB&nbsp;MISS时只报一个中断,TLB&nbsp;miss由软件处理。<br />搞清楚了MMU是做什么的,为什么这么做。设计一个你自己的MMU吧。<br />完全参考X86或其他成熟的MMU只会让你自己更糊涂。一个全功能的MMU岂止是几十万行HDL搞的完的。

ttxs 发表于 2009-2-18 09:19

谢谢啊。

我手里只有一个sparc&nbsp;V8的IU。我没有找到mmu,TLB的特殊指令,是不是就得硬件电路实现了?

niuyi 发表于 2009-2-18 15:33

CR3

luhuajiong 发表于 2009-4-23 16:37

路过

平常人 发表于 2009-4-24 21:45

从操作的性质上看,寄存器是CPU能够快速访问的存储单元

硬件上有多种实现方式:专用指令访问、存储器映射、专用的I/O设备总线(如8080)等。

flanker 发表于 2009-4-28 00:21

有一点不到位。补充一下。

TLB其实是分两部分。一部分是内存里面的页表,另一部分是最近用到的,放在MMU的全相连Entry里面。当访问到MMU没有mapped的tlb&nbsp;entry,会触发系统的exception或trap。在OS提供的exception&nbsp;handler中,会在内存TLB中查找相关entry并置入MMU中。如果内存TLB中,logic&nbsp;address&nbsp;是mapped&nbsp;到virtual&nbsp;memory的,则执行换页操作,将硬盘上的数据导入内存。如果是没有mapped的address,则报page&nbsp;fault,做coredump,杀掉process。在kernel中会引起panic。
页: [1]
查看完整版本: 页表基址寄存器是什么?