大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
页表用来把虚拟页映射到物理页,并且存放页的保护位(即访问权限)。
创新互联-专业网站定制、快速模板网站建设、高性价比大悟网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式大悟网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖大悟地区。费用合理售后完善,10余年实体公司更值得信赖。
在Linux4.11版本以前,Linux内核把页表分为4级:
页全局目录表(PGD)、页上层目录(PUD)、页中间目录(PMD)、直接页表(PT) 。
4.11版本把页表扩展到5级,在页全局目录和页上层目录之间增加了 页四级目录(P4D) 。
各处处理器架构可以选择使用5级,4级,3级或者2级页表,同一种处理器在页长度不同的情况可能选择不同的页表级数。可以使用配置宏CONFIG_PGTABLE_LEVELS配置页表的级数,一般使用默认值。
如果选择4级页表,那么使用PGD,PUD,PMD,PT;如果使用3级页表,那么使用PGD,PMD,PT;如果选择2级页表,那么使用PGD和PT。 如果不使用页中间目录 ,那么内核模拟页中间目录,调用函数pmd_offset 根据页上层目录表项和虚拟地址获取页中间目录表项时 , 直接把页上层目录表项指针强制转换成页中间目录表项 。
每个进程有独立的页表,进程的mm_struct实例的成员pgd指向页全局目录,前面四级页表的表项存放下一级页表的起始地址,直接页表的页表项存放页帧号(PFN) 。
内核也有一个页表, 0号内核线程的进程描述符init_task的成员active_mm指向内存描述符init_mm,内存描述符init_mm的成员pgd指向内核的页全局目录swapper_pg_dir 。
ARM64处理器把页表称为转换表,最多4级。ARM64处理器支持三种页长度:4KB,16KB,64KB。页长度和虚拟地址的宽度决定了转换表的级数,在虚拟地址的宽度为48位的条件下,页长度和转换表级数的关系如下所示:
ARM64处理器把表项称为描述符,使用64位的长描述符格式。描述符的0bit指示描述符是不是有效的:0表示无效,1表示有效。第1位指定描述符类型。
在块描述符和页描述符中,内存属性被拆分为一个高属性和一个低属性块。
处理器的MMU负责把虚拟地址转换成物理地址,为了改进虚拟地址到物理地址的转换速度,避免每次转换都需要查询内存中的页表,处理器厂商在管理单元里加了称为TLB的高速缓存,TLB直译为转换后备缓冲区,意译为页表缓存。
页表缓存用来缓存最近使用过的页表项, 有些处理器使用两级页表缓存 : 第一级TLB分为指令TLB和数据TLB,好处是取指令和取数据可以并行;第二级TLB是统一TLB,即指令和数据共用的TLB 。
不同处理器架构的TLB表项的格式不同。ARM64处理器的每条TLB表项不仅包含虚拟地址和物理地址,也包含属性:内存类型、缓存策略、访问权限、地址空间标识符(ASID)和虚拟机标识符(VMID)。 地址空间标识符区分不同进程的页表项 , 虚拟机标识符区分不同虚拟机的页表项 。
如果内核修改了可能缓存在TLB里面的页表项,那么内核必须负责使旧的TLB表项失效,内核定义了每种处理器架构必须实现的函数。
当TLB没有命中的时候,ARM64处理器的MMU自动遍历内存中的页表,把页表项复制到TLB,不需要软件把页表项写到TLB,所以ARM64架构没有提供写TLB的指令。
为了减少在进程切换时清空页表缓存的需要,ARM64处理器的页表缓存使用非全局位区分内核和进程的页表项(nG位为0表示内核的页表项), 使用地址空间标识符(ASID)区分不同进程的页表项 。
ARM64处理器的ASID长度是由具体实现定义的,可以选择8位或者16位。寄存器TTBR0_EL1或者TTBR1_EL1都可以用来存放当前进程的ASID,通常使用寄存器TCR_EL1的A1位决定使用哪个寄存器存放当前进程的ASID,通常使用寄存器 TTBR0_EL1 。寄存器TTBR0_EL1的位[63:48]或者[63:56]存放当前进程的ASID,位[47:1]存放当前进程的页全局目录的物理地址。
在SMP系统中,ARM64架构要求ASID在处理器的所有核是唯一的。假设ASID为8位,ASID只有256个值,其中0是保留值,可分配的ASID范围1~255,进程的数量可能超过255,两个进程的ASID可能相同,内核引入ASID版本号解决这个问题。
(1)每个进程有一个64位的软件ASID, 低8位存放硬件ASID,高56位存放ASID版本号 。
(2) 64位全局变量asid_generation的高56位保存全局ASID版本号 。
(3) 当进程被调度时,比较进程的ASID版本号和全局版本号 。如果版本号相同,那么直接使用上次分配的ASID,否则需要给进程重新分配硬件ASID。
存在空闲ASID,那么选择一个分配给进程。不存在空闲ASID时,把全局ASID版本号加1,重新从1开始分配硬件ASID,即硬件ASID从255回绕到1。因为刚分配的硬件ASID可能和某个进程的ASID相同,只是ASID版本号不同,页表缓存可能包含了这个进程的页表项,所以必须把所有处理器的页表缓存清空。
引入ASID版本号的好处是:避免每次进程切换都需要清空页表缓存,只需要在硬件ASID回环时把处理器的页表缓存清空 。
虚拟机里面运行的客户操作系统的虚拟地址转物理地址分两个阶段:
(1) 把虚拟地址转换成中间物理地址,由客户操作系统的内核控制 ,和非虚拟化的转换过程相同。
(2) 把中间物理地址转换成物理地址,由虚拟机监控器控制 ,虚拟机监控器为每个虚拟机维护一个转换表,分配一个虚拟机标识符,寄存器 VTTBR_EL2 存放当前虚拟机的阶段2转换表的物理地址。
每个虚拟机有独立的ASID空间 ,页表缓存使用 虚拟机标识符 区分不同虚拟机的转换表项,避免每次虚拟机切换都要清空页表缓存,在虚拟机标识符回绕时把处理器的页表缓存清空。
根据pid获取pcb,根据pcb获取vm,之后就可以了埃 下面是一个样本代码: pcb=find_task_by_pid(pid); pgd=pgd_offset(pcb-mm,va); pud=pud_offset(pgd,va); pmd=pmd_offset(pud,va); pte=pte_offset_kernel(pmd,va)
按打包方式划分
基于Dpkg (Debian系)
Debian GNU / Linux是一种强调使用自由软件的发行版。它支持多种硬件平台。Debian及其派生发行版使用deb软件包格式,并使用dpkg及其前端作为包管理器。
• Adamantix:基于Debian,特别关注安全。
• Amber Linux:基于Debian,针对拉脱维亚用户作了一些定制。
• ASLinux Desktop:西班牙语,基于Debian与KDE,针对各种桌面用途,包括家用、办公、教育、游戏、科学、软件开发,最大的卖点在于其丰富的可用性。
• Anthon GNU/Linux: 即安同OS,是直接从源码构建的开源Linux操作系统,但采用Dpkg包管理系统,遵循LGPL授权协议,使用KDE桌面环境,由安同开源操作系统社区社区成员共同开发。
• B2D Linux:基于Debian,希望可以由“做中学”来产生一个小而美的中文Linux包的计划。
• Debian GNU/Linux:由大批社区志愿者收集的包。Debian拥有庞大的软件包可供选择(29000个以上),支持大量的硬件平台(12个计算机系统结构)。以前该包因为安装困难受到责难,但最新的版本具备了简单易用的文本式安装环境。非自由软件不会包含在Debian的主要软件包中。
• Grml:进行系统救援的Live CD。
• Guadalinex:由西班牙的安达卢西亚地方政府推动,基于Debian,针对西班牙语的家庭用户以及学校。
• Knoppix:第一张Debian的自启动运行光盘。包含的软件非常多,启动时会自动进行硬件监测。从4.0起,用DVD作光盘。
o 以下基于Knoppix:
Gnoppix:Knoppix的GNOME版,该包发行周期较长,未来会跟Ubuntu进行集成。
Kanotix:自启动运行光盘,基于Knoppix,也可以安装到硬盘上。有很好的硬件支持,桌面与笔记本电脑的集成也很出色。
Kurumin:针对巴西用户的Knoppix。
• LinEx:由西班牙的埃斯特雷马杜拉地方政府推动的包。
• Loco Linux:基于Debian的阿根廷Linux。
• MEPIS: 基于Debian的桌面和服务器。
• Rays Linux(华镭):基于Debian,针对亚洲市场,由新华科技(南京)系统软件有限公司开发。
• Skolelinux:在挪威发起,旨在打造适合于学校的轻便包。
• Symphony OS:基于Debian,与众不同地采用Mezzo桌面。
• Ubuntu:对初学者而言最易用的Linux包。由Canonical有限公司赞助,基于Debian,使用自己的软件包库,与Debian的有所不同,旨在开发出更加友好的桌面,已经获取了良好的声誉。
o 以下基于Ubuntu:
Linux Mint:基于Ubuntu的发行版,人气很高,是目前排行榜上第三名的发行版。
Edubuntu:是Ubuntu的教育发行版。
Elementary OS:基于Ubuntu,使用基于GNOME名为Pantheon的桌面环境。
Linux Deepin:基于Ubuntu,使用Gnome 3桌面环境的中文发行版(初期使用的是Xfce)。0.x版基于Debian。
Kubuntu:使用KDE桌面环境的Ubuntu包。
Lubuntu:使用LXDE桌面环境的Ubuntu包。
PUD GNU/Linux:基于Ubuntu的小型Linux,可安装于光盘或256 MB以上的USB U盘。
Ubuntu Kylin:添加了少量中国化定制的 Ubuntu 发行版。
Xubuntu:使用Xfce桌面环境的Ubuntu包。
Ylmf OS: 基于Ubuntu发行版(现已更名为Start OS且基于linux内核独立制作)。
Ubuntu GNOME: 基于Ubuntu是Linux发行版,但使用的是桌面环境是Gnome。
Zorin OS:基于Ubuntu的Linux发行版,目的是尽可能的模拟Windows及操作习惯。
基于RPM (Red Hat系)
Red Hat Linux和SUSE Linux是最早使用RPM格式软件包的发行版,如今RPM格式已广泛运用于众多的发行版。这两种发行版后来都分为商业版本和社区支持版本。Red Hat Linux的社区支持版本现称为Fedora,商业版本则称为Red Hat Enterprise Linux。
• aLinux:原名Peanut Linux,针对家庭用户。
• ALT Linux:东欧版本。
• Ark Linux:强调易学易用。
• ASPLinux:提供俄语等东欧语言的支持。
• Asianux Server:由中国红旗、日本Miracle、韩国Hannsoft三家联合开发,主要市场针对亚洲地区,对中文、日文、韩文的支持比较好。
• Blag Linux:体积小,但功能较多。
• Caixa Mágica:葡萄牙语的Linux。
• cAos Linux:由社区创建的包,功能通用、培植简单。
• CentOS:由社区支持的包,旨在100%地与Red Hat Linux企业版兼容,但不包含Red Hat 的商业软件。
• Cobind:桌面。
• Conectiva:一个巴西包,曾经是United Linux的创建成员,现在该公司已经并入到Mandriva Linux。
• EduLinux:用于教育的包。
• Fedora:可用作工作站、桌面以及服务器,由红帽公司及其社区开发。
• Linux Mobile System:基于Fedora Core的包,设计成从USB存储设备启动,比如U盘。
• Linpus Linux:来自台湾厂商发行的Linux版本。是一套通过LSB 3.1认证、GB18030-2000编码检验测试及支持CNS11643中文标准交换码全字库的Linux桌面型系统。在中文支持能力上较为完善。
• Magic Linux:一个易用的中文包,基于Fedora和KDE桌面环境。
• Mandriva Linux:最初是红帽的一个变种,针对奔腾级CPU作了优化,后来在保持兼容性的同时,派生成为更友好的包。Mandriva中所有的软件仍然免费,还有活跃的社区支持,另外通过注册以及销售盒装产品,Mandriva还提供企业级的支持与服务,还有针对付费用户的俱乐部。
• Novell Linux Desktop:由于Novell收购了SUSE,他们的Linux产品对原来的包有所继承。
• PCLinuxOS:一个易用的自启动运行光盘,以良好的观感著称;硬盘安装也同样轻而易举。最初基于Mandrake 9.2,而后PCLinuxOS针对桌面用户,开始自己的开发道路。在保留基于RPM包的同时,PCLinuxOS别出心裁地使用自己的APT包管理工具(受Debian影响),但图形前端仍然用的是Synaptic。
• PCQLinux2004:由印度的PCQuest杂志生产,基于Fedora Core。
• PLD Linux:来自波兰的包,针对较高级别的用户,比Slackware、Gentoo更加易用。
• QiLinux:意大利生产,包括桌面版、光盘自启动版,还有服务器版、高级服务器版。
• Qomo Linux:以Linux人社区作为依托开发,目标是提供一款最新、最酷、最快,轻量级、模块化的Linux操作系统。
• Red Flag Linux:即红旗Linux,由北京中科红旗软件技术有限公司开发,主要针对中国市场。
• Red Hat Enterprise Linux:红帽Linux家族中唯一的商业分支。
• Scientific Linux:由红帽Linux企业版,将遵循GPL的软件重新编译而成。
• SUSE/openSUSE:来自德国,是欧洲最流行的包之一。跟红帽一样,也包括大量的软件,需要7张以上的CD,现在则用双DVD。这个包有独特的配置工具YaST。也是United Linux的创立者之一,已经被Novell公司收购。openSUSE是一个新的版本,基于社区,完全开源。
• Tinfoil Hat Linux:对安全格外关注的包。
• Trustix:专注于安全与稳定性的包。
• Turbo Linux:在亚洲较流行的一个包,基于Red Hat,是United Linux的成员。
• Vine Linux:基于Red Hat的一个日本包。
• White Box Enterprise Linux:意在兼容Red Hat企业版第三版。
• Yellow Dog:基于Red Hat,针对PowerPC平台。
• YOPER:"Your Operating System"(你的操作系统),来自新西兰的桌面包。
Slackware系
Slackware 走了一条同其他的发行版本(Red Hat、Debian、Gentoo、SuSE、 Mandriva、Ubuntu等)不同的道路,它力图成为“UNIX风格”的Linux发行版本。它的方针是只吸收稳定版本的应用程序,并且缺少其他 linux版本中那些为发行版本定制的配置工具。
• Kate OS:基于Slackware的设计理念,一个轻便的波兰语包。
• Zenwalk Linux(以前是MiniSlack):基于Slackware作了优化,注重简便、快捷。
• Plamo Linux:基于Slackware的日语包。
• Slackware:一个老牌包,由Patrick Volkerding维护,特别注重简洁与安全。
• Ultima Linux:基于Slackware,由Martin Ultima作了优化。
• SLAX:一个基于Slackware的自启动运行光盘,由Tomas Matejicek维护。
• Frugalware:通用Linux包,面向中级用户。
其他打包方式的包
• ArchLinux:基于KISS原则,针对i686和x86-64的CPU做了优化,以.pkg.tar.xz格式打包并由包管理器进行跟踪维护,特别适合动手能力强的Linux用户。
• Chakra GNU/Linux:原先基于ArchLinux,后来独立成有自己特色的发行版,如:官方包库不含依赖GTK+的软件包、只使用KDE桌面环境等。
• Calculate Linux:基于Gentoo,来自俄罗斯。
• CRUX:采用类BSD Port包管理系统,针对i686的CPU做了最优化,适合狂热爱好者以及专业人士使用。
• Foresight Linux:采用Conary包管理系统,引入了GNOME中的许多最新技术,比如beagle、f-spot、howl以及最新的hal等,这个包在保持易用的同时,更注重革新。
• Gentoo:这个包采用自己独特的Portage包管理系统,吸引了许多狂热爱好者以及专业人士,由于能自己编译及调整源码依赖等选项,而获得至高的自定义性及优化的软件,在源码包也有相当多新旧版本的选择,是个强调能自由选择的发行版。
• GoboLinux:构建了新的目录结构,比如GCC放在/Programs/GCC/这样的目录,为了让系统能找到这些文件,在/System/Links/Executables这样的目录下归组,这样就包含了/Programs目录下所有可执行文件的符号链接。
• Heretix:以前叫做RubyX,包的管理,包括包管理,都是通过由Ruby写的脚本来完成,所有的包都安装在/pkg目录下。
• ImpiLinux,来自南非的包,主要针对非洲用户。
• Jedi GNU/Linux:使用force-get包管理器,允许源码、二进制软件包共存。
• Linux From Scratch:这是一份文档,介绍如何自己动手,如何白手起家编译打造自己独一无二的Linux系统。
• Lunar Linux,基于源码,由Sorcerer GNU/Linux所派生。
• MkLinux:"Microkernel Linux"的缩写,旨在将Linux移植到跑Mach微核的PowerPC机器上。
• Onebase Linux:采用OLM包管理器,对二进制、源码进行管理。
• Sabayon Linux:基于Gentoo,来自意大利。
• Sorcerer GNU/Linux:基于源码。
• Source Mage GNU/Linux:也是基于源码,由Sorcerer GNU/Linux所派生。
• Ututo:基于Gentoo,来自阿根廷。
• Open Client:基于Red Hat Enterprise Linux,来自IBM,提供有Fedora、Ubuntu、SLED的Layer。
给老机器订制的小型包
一般的迷你包,除了可以硬盘安装,也可以安装在U盘上。
• Austrumi:拉脱维亚的自启动CD包,支持英语,功能比较丰富,基于Slackware。
• cAos Linux:有社区维护,功能通用。
• Damn Small Linux(DSL): 这是小型包的老祖宗,放在迷你CD上,原先设计是想看看一张50M的CD可以放多少桌面程序,原来是作为个人玩具,但不久Damn Small Linux周围就聚成了一个社区,不少人加入进来,参与改进,包括一个远程、本地的程序安装系统,多功能的备份、还原系统,另外还加入了Knoppix的硬件检测,使用自己的*.dsl软件包系统,默认的窗口管理器是Fluxbox。可以在微软虚拟机软件里运行,无须关闭WINDOWS系统专门进入LINUX系统,特别适合初学者。
• Feather Linux:类似于Damn Small Linux,但总容量是115MB,兼容Debian的软件包。
• Flonix USB版:放在USB设备上的可移动桌面包,这是个商业版,只能给购买的U盘作预装。
• Knopperdisk:为U盘设计的包,基于Gentoo。
• Puppy Linux:启动特别地快,在配置较低的PC上(内存小于48M),也可以运行自如。包含的工具都是特别精简的,使用Fvwm95作为窗口管理器(现在是JWM)。
• Kuppy Linux:基于Puppy发展的发行版,拥有启动特别地快,在配置较低的PC上等特点外,将桌面置换为XFCE4,更适合习惯windows操作的用户。
• Tiny Core Linux:是一个仅有10MB的桌面操作系统,甚至可以在486上运行,但它并不是一个完整的桌面,而且只支持有限局域网。
• Stem桌面:一个混合产品,使用标准的Debian来编译桌面(Fvwm95)。针对老机器(CPU小于等于266Mhz,内存小于等于64M)设计,从Debian软件仓库种选择的包都是最轻巧的。与众不同的是,该包没有自己的安装光盘,用户得先安装Debian,然后运行文本界面的安装脚本,然后通过网络连接,编译剩余的软件。这个包100%跟Debian兼容。
• SPBLinux:用于软盘、U盘的迷你版本。
• Vector Linux:中小型包,针对新老机器,采用小而快的应用程序,以及简化的安装程序。该包有多个版本,包括大小为2G的SOHO(Small Office, Home Office)版,以及800M的"Dynamite"版。SOHO版提供KDE/IceWM窗口管理器,外观很专业;Dynamite版只采用IceWM,以及部分工具。该包包括了简单的升级包管理程序,基于Slackware。
• eMoviX:小型包,专门用作媒体播放用途。
按发行方式划分
部分或全部的商业版
• BlueCat Linux:Linux嵌入式系统,可用于小型客户定制的设备,乃至大规模多CPU的系统。
• Libranet:基于Debian的桌面包,与Debian保持100%的兼容。安装过程有硬件自动检测,桌面有一个管理员菜单(文字模式与图形模式),这样简化了硬件与软件的配置。
• Linspire:另一个桌面包,以前叫Lindows,基于Debian。可以通过Linspire或者Debian的apt命令,添加额外的软件,但不保证跟Debian的兼容性。该包包含不少的专属软件。
• Mandriva Linux:Mandrakesoft跟Conectiva合并以后,更名为Mandriva Linux。对于菜鸟来说,该包的各种产品,包括服务器、工作站、小型商用以及个人版,是最容易维护的Linux包之一。原来是Red Hat的一个变种,针对奔腾级CPU作了优化,进而发展出了更加方便的包。在保留完全自由软件的同时,Mandriva商业模式,通过捐献,以及对非会员延迟发布政策,增加了企业级的支持与服务。
• MEPIS:一个基于Debian的包,也可以作为自启动光盘来运行,这样可以在决定硬盘安装前,尝尝鲜。
• Nitix:第一个基于Linux服务器的自治操作系统,具有自管理、自恢复、自配置和自优化的能力。
• Novell Linux 桌面:Novell收购SUSE后,两家的包就互相融合了。
• Progeny Debian:由Progeny开发,基于Debian,使用从Red Hat移植过来的Anaconda安装器,该包又称为Progeny Componentized Linux。
• Red Hat Enterprise Linux:从Red Hat Linux派生出的纯商业版。
• SUSE:基于德国的纽伦堡,以前叫SuSE,是欧洲最流行的Linux包,由自己独特的配置工具YaST,用户可以下载到体验版(跟专业版类似)。该公司是United Linux的创建者,最近被Novell收购。
• Xandros:来自加拿大,基于过去的Corel Linux,专注于桌面市场,以及跟Windows的兼容性。该包包含一些专属软件,跟Debian的dpkg包管理系统兼容。
• YES Linux:针对小型公司,提供建议的网络环境。
专用包
• Mobilinux:针对手机,由MontaVista出品。
• Android:来自Google,以apk格式打包,采用Dalvik虚拟机提供类似Java (编程语言)的应用程序接口,目前已成为用户最多的智能手机系统之一。
• Maemo:来自诺基亚,基于Debian,目前专用于诺基亚的N770、N800、N810网络终端,以及N900手机。
• Moblin︰来自英特尔,现已捐给Linux基金会,用于Eee PC或其他上网本,支持快速启动。
• MeeGo:Maemo与Moblin计划结合的产物。
• Bada (操作系统):针对手机,由三星电子出品。
• LiMo 平台:由LiMo基金会主导开发的移动电话发行版。
• Tizen:MeeGo、LiMo 平台与bada计划结合的产物。
• Meltemi:MeeGo的另一个后继者,面向低端智能手机。
• webOS:针对手机和平板电脑,由Palm公司出品,后被惠普公司开源。
其它平台
iPodLinux基于修改版uClinux内核,并编写有所谓的“podzilla”简单用户界面。目前仅支持第四代之前的iPod。
implicit declaration of function ***
查查英语也应该晓得了阿....
隐式的函数声明,就是说你使用了kmap_atomic、kmap_atomic但是没有声明,一般是因为没有包含头文件,或者是内核的API发生了些许变化。
这两个函数包含在linux/highmem.h中,你在程序中添加一句:#include linux/highmem.h试试。
PS :这个是在2.6.38的内核中的,你在lxr.linux.no搜下对应版本的kernel,我没有细细查。
/*
*伪代码,示例
*32位地址,三级映射(没有pud_t),页面大小4KB
*/
unsigned long addr = 0x12345678;//要找的虚拟地址,用户空间所访问的地址
unsigned long real_addr = 0x00;//要输出的地址
struct task_struct *cur_task = get_current();//获取当前进程控制块
struct mm_struct *mm = cur_task - mm;//进程虚拟空间
pgd_t *pgd;//描述页全局目录项
pmd_t *pmd;//描述页中间项
pte_t *pte;//页表项
pgd = pgd_offset(mm, addr);//找出所在目录
if (pgd_none(*pgd)){
goto out;
}
pmd = pmd_offset(pgd, addr);//找出所在中间项
if (pmd_none(*pmd)){
goto out;
}
pte = pte_offset(pmd, addr);//找出所在页面
if (pte_none(*pte)) {
goto out;
}
//假设每页4KB
real_addr = addr 0x00003fff; //取出页面偏移量
real_addr += pte;//内核空间访问的地址
real_addr -= PAGE_OFFSET;//真正物理地址()
printk("物理地址是 %x\n",real_addr);
return;
out:
printk("没有内存映射",real_addr);