Linux2.6学习笔记
- 格式:doc
- 大小:14.50 KB
- 文档页数:2
显示当前所在路径pwd设置新用户adduser ……设置密码passwd ……显示文件详细信息ls (列出文件和目录)ls -l(显示长列表格式)ls -a(显示隐藏文件)路径切换cd /(cd /home )linux运行级别7个{0-关机1-单用户2-多用户状态无网络服务3-多用户状态有网络服务4-系统未使用保留给用户5-图形界面6-重启}修改运行级别(运行vi /etc/inittab,进入目录后进行相应选项的修改。
常用3,5)解决修改错误配置1.在进入grub引导界面时,按e2.选第二行,再按e3.输入“空格1”(进入单用户级别【单用户选项启动时linux系统不读,而且不用密码】)4.进行相应的修改添加文件夹(mkdir ……)删除文件夹(rmdir ……)建立空文件夹(touch)复制命令(cp)递归复制命令(复制子目录信息)(cp -r dir1 dir2)移动文件和改文件名(mv)删除所有内容(rm -rf)建立符号连接(ln)分页显示(more)eg:more install.log{shift+pageup上翻页shift+pagedown下翻页}linux 管道命令(|)注释:把上一个命令的结果交给|的后面的命令处理查找命令grep “查找的内容”内容所在文件夹eg:grep "lihui" 123.cpp(显示到具体某一行“grep -n“lihui”123.cpp”)linux管道定向命令{ls -l > a.txt列表的内容写入文件a.txt中(覆盖写)ls -l >> aa.txt列表的内容追加到文件aa.txt的末尾(追加写)}文件的扩展名的改变不影响文件的内容如何添加组{groupadd policeman}查看linux中所有组的信息{vi /etc/groupcat /etc/group}创建用户,并指定将该用户分配到哪个组useradd -g 组名用户名查看linux中所有用户信息vi /etc/passwdcat /etc/passwd}abc:x:502:502:: /home/abc/“x代表密码”“502”{第一个代表用户的ID第二个代表组的ID}/home/abc/代表用户主目录:bin/bash shell解释器“1”代表的是{1,后面如果是文件那就是12,后面如果是文件夹那就是文件夹下的文件数修改文件权限{Chmod 777 用户777:第一个7代表对所有者权限修改第二个7代表对用户所在的组权限修改第三个7代表对其他的用户的权限进行修改Init 3 进入命令行编辑模式关闭命令(必须是root用户){Shutdown –h 1 “一分钟后关闭系统”Shutdown –h now“立即关闭系统”Shutdown –h 15:30“在15:30关闭系统”Shutdown –r 2 “2分钟后重启系统”Poweroff “立即关闭系统”Halt “挂起系统”Reboot “重启系统”}用init命令关闭系统Init 0 “立即关闭系统”Init 6 “立即重启系统”Usermod –g lh abc“将该用户移动至该组下”Bat 批处理文件查看shell ls –l /bin/*sh查看当前使用的shell:env[显示当前操作系统的环境变量] 更改shell:chsh –s /bin/**shMan 相当于windows下的helpMan mkdir查看mkdir的功能查看最近使用的命令History 不加参数的话,显示最近使用的所有命令History 5显示最近使用的5条命令History !5显示历史编号为5的命令History !ls 显示最后一次以ls开头的命令Linux下查看ip:ifconfig命令补全功能Eg:v [tab][tab]修改IP的第1种方法配置系统:setup配置完网络之后必须重启网络,重启命令:/etc/rc.d/init.d/network restart查看网络信息ifconfig修改IP的第2种方法修改网络配置立马生效的方法(临时生效,重启或关机会失效)在linux中所有设备都是文件修改IP的第三种方法利用VI编辑器直接修改(永久修改)运行:vi /etc/sysconfig/network-scripts/ifcfg-eth0修改完后需要重启网卡:/etc/rc.d/init.d/network restart查询linux下安装了多少RPM包:rpm –qa(rpm –qa | more)查看具体软件:(rpm –q gcc)安装rpm包rpm –i rpm包全称查看是否安装了samba服务器rpm –q samba添加用户youyou给youyou添加samba密码Cat /etc/passwd | mksmbpasswd.sh > /etc/samba/smbpasswd Smbpasswd youyou启动samba服务器Service smb start任务调度Crontab –e(必须是root用户才可执行)终止任务调度crontab -r 每隔一定时间执行date > /home/mydata1 (覆盖写)每隔一分钟执行date > /home/mydata1计算机概论计算机硬件五大单元输入设备、输出设备、内存、运算器(算数、逻辑)、控制器CPU种类{1.RISC(精简指令集)2.CISC(复杂指令集)主要有AMD INTEL VIA}X86架构CPU被大量试用于个人计算机,个人计算机就常被称为X86计算机接口设备:存储、显示、网络计算机上的常用计算单位P=1024T、T=1024G、G=1024M、M=1024K、K=1024B、B=8bit芯片组南桥:负责连接速度较慢的的周边接口,硬盘、USB、网卡等,系统总线北桥:负责连接速度较快的周边接口,CPU、内存、显卡等,I/O总线AMD 将内存控件集成到了CPU当中,理论上加速CPU与内存之间的传输速度主频=外频*倍频超频:指的是超外频。
关于Linux操作系统学习的笔记⽬录⼀、环境搭建安装CentOs7(在本地安装)下载vmware官⽹地址:下载CentOS7官⽹地址:⼆、基本操作1.开机与关机关机命令:shutdown同步数据:sync重启:reboot2.⽬录结构各⽬录功能如下:⽬录/bin(不要动)存放⼆进制可执⾏⽂件(ls,cat,等),常⽤命令⼀般都在这⾥。
/etc存放系统管理和配置⽂件/home存放所有⽤户⽂件的根⽬录,是⽤户主⽬录的基点,⽐如⽤户user的主⽬录就是/home/user,可以⽤~user表⽰/usr ⽤于存放系统应⽤程序,⽐较重要的⽬录/usr/local 本地系统管理员软件安装⽬录(安装系统级的应⽤)。
这是最庞⼤的⽬录,要⽤到的应⽤程序和⽂件⼏乎都在这个⽬录。
/usr/x11r6 存放x window的⽬录/usr/bin 众多的应⽤程序 /usr/sbin 超级⽤户的⼀些管理程序 /usr/doc ⽂档 /usr/include linux下开发和编译应⽤程序所需要的头⽂件 /usr/lib 常⽤的动态链接库和软件包的配置⽂件 /usr/man 帮助⽂档 /usr/src 源代码,linux内核的源代码就放在/usr/src/linux⾥ /usr/local/bin 本地增加的命令/usr/local/lib 本地增加的库/opt额外安装的可选应⽤程序包所放置的位置。
⼀般情况下,我们可以把tomcat等都安装到这⾥。
/proc虚拟⽂件系统⽬录,是系统内存的映射。
可直接访问这个⽬录来获取系统信息。
/root超级⽤户(系统管理员)的主⽬录(特权阶级o)/sbin存放⼆进制可执⾏⽂件,只有root才能访问。
这⾥存放的是系统管理员使⽤的系统级别的管理命令和程序。
如ifconfig等。
/dev⽤于存放设备⽂件。
/mnt系统管理员安装临时⽂件系统的安装点,系统提供这个⽬录是让⽤户临时挂载其他的⽂件系统。
/boot(不要动)存放⽤于系统引导时使⽤的各种⽂件/lib存放跟⽂件系统中的程序运⾏所需要的共享库及内核模块。
1. Linux操作系统是一个多任务网络操作系统,要求用户按照各自的身份登录上机,而不是把他们一视同仁;分配给某个用户的安全级别是在建立他或她的帐户时就设置好了的。
2. Linux操作系统目录使用正斜杠(/)而不是DOS或者windows中的反斜杠(\)。
举例来说,Linux 操作系统中的一个合法目录的写法是/usr/bin。
另外,Linux操作系统中大写字母和小写字母其含义将是完全不同,输入字母"Vi"与输入字母"vi"是不一样的。
Linux操作系统可以接受的文件或者目录名的长度最多为256个字符。
除了字母和数字之外,可以用在文件名中又不引起问题的字符还有句号(.)、下划线( _)和连字号(-)3.文件存取权限和所有权限文件的存取权限是使用长格式化文件列表命令( ls -l)列文件清单时出现在最左边的第一数据段。
这个数据段又可以被分解为10个标志位。
A. 类型标志位存取权限数据段的第一位,或者第一个字母表示的是这个项目的类型。
许多不同的项目会用到这个标志位:" -—表示该项目是一个普通文件" d—表示该项目是一个目录" l—表示该项目是一个符号链接" s—表示该项目是一个可执行文件,不论谁都可以像它的所有者那样调用它运行" c—表示该项目是一个字符设备驱动程序" b—表示该项目是一个块设备驱动程序B. 存取权限三位组存取权限的其余部分每三位一组,分为三组。
类型位后面的第1个三位组定义了其所有者的存取权限。
第2个三位组定义了其所在分组的存取权限;第3个三位组则说明了系统上任何人的存取权限。
每一个三位组是由3个不同的数据位组成的:" 读标志位( r)" 写标志位(w)" 执行标志位(x)这些标志位永远都按照同一个顺序显示为r w x的形式。
区别某个标志位是处于允许还是禁止的状态就要看该标志位是显示为一个字母还是一个连字符(-)。
linux系统管理学习笔记linux的进程和服务服务是很长的进程,因此服务都是后台运行的。
从系统开始到系统结束的服务,叫做系统服务,执行这些服务的进程叫做守护进程。
服务想要把它调用则需要守护服务调起来。
.d代表着就是守护进程绿色的图标表示当前是一个可执行文件.service结尾的是一个服务.target的是一组服务的集合cenos7 的网络服务重启为systemct Ires tartnetwork centos7 中替代了networknanager 这个替代了network敲一个setup发现交互工具哪些服务应该自动启动?0:系统停机1:禁止远程登录,做相关权限更改类似于window的安全模式,进行系统级别的更改,根分区只能读不能写,代表不用root本身的密码可以直接进去,可以忘记密码的时候黑进去,重设置密码。
但是不能远程操作。
2:多用户状态,没有nfs,网络文件系统,允许多个用户登录但是没网络3:完全的多用户状态,服务器直接操控的完全体状态。
4:没懂5:图形界面的多用户模式6:以现在重启,就是无限循环不能重启不同级别的区别其实就在启动的时候该支持哪些服务?平时用到的级别就是235,最关键平时用到的级别就是3, 5,所以cenos的级别就直接设置成两个关键字:1:多用户有望,无图形界面2多用户有网,有图形界面ctrl+altf2:进行到大黑屏界面ctrl+altf1init系统单一启动,systemd可以并行启动,但是使用命令也可以查看自己服务级别状态。
也可以针对级别关闭或者开启chkconfig,系统管理systemctl-list-files:可以查看所有开机自启动的项目比如socket等。
关闭防火墙开启防火墙等,关闭防火墙开启防火开机自启动。
shutdown关机但是默认一分钟之后关机shutdown-c撤销关机shutdowns三分钟之后关机linux在关机之前进行一个同步的操作sync:把数据从内存到硬盘里,因为写入硬盘效率很慢,因此要设置一个缓冲区,等缓冲区满了之后再写入硬盘hit:停机cpu功能停止了但不断电,数据还存着reboot:重启。
一、linux文件系统linux使用标准的目录结构,在安装的时候,安装程序就已经为用户创建了文件系统和完整而固定的目录组成形式,并指定了每个目录的作用和其中的文件类型。
文件系统树状结构如下:/ 根目录┏━━━┳━━━┳━━━┳━━┳━━━┳━━┳━━┳━━┳━━━┳━━━━━┳━━┓bin home dev etc lib sbin tmp usr var lost+found rootlinux采用的是树型结构。
最上层是根目录,其他的所有目录都是从根目录出发而生成的。
微软的DOS和windows也是采用树型结构,但是在DOS和windows中这样的树型结构的根是磁盘分区的盘符,有几个分区就有几个树型结构,他们之间的关系是并列的。
但是在linux中,无论操作系统管理几个磁盘分区,这样的目录树只有一个。
从结构上讲,各个磁盘分区上的树型目录不一定是并列的。
下面列出linux的一些主要目录的功用/bin:存放用户命令文件。
/home:存放用户主目录文件。
/dev:存放设备特殊文件。
/etc:存放系统管理和配置文件。
/etc/rc.d:存放启动的配置文件和脚本/lib:存放标准程序设计库,又叫动态链接共享库。
类似windows里的.dll文件/sbin:存放系统管理命令。
/tmp:存放公用的临时文件存储点。
/root:存放系统管理员的用户文件。
/mnt:存放让用户临时挂载其他的文件系统。
/lost+found:用于存放系统非正常关机产生的零散文件。
/proc:存放虚拟的目录,是系统内存的映射。
/var:存放某些大文件的溢出区,比方说各种服务的日志文件。
/usr:存放最庞大的目录,要用到的应用程序和文件几乎都在这个目录。
Linux内核支持十多种不同类型的文件系统,对于Red Hat Linux,系统默认使用ext2或ext3和swap文件系统,下面对Linux常用的文件系统作一个简单介绍。
ext2、ext3与swap文件系统介绍:ext是第一个专门为Linux设计的文件系统类型,称为扩展文件系统,在Linux发展的早期,起过重要的作用。
Linux 2.6内核标准教程前言前言写作背景自由、开放的Linux操作系统正在蓬勃发展,得到了广泛的应用,Linux操作系统的用户数量迅速增长,很多Linux爱好者希望能够学习、掌握Linux内核的原理、机制,能够阅读Linux内核代码,并能够加以应用,但在实际的学习过程中常遇到以下问题。
"Linux内核学习门槛较高,初学者总想迅速读懂内核源代码,往往在不清楚内核运行机制和内核代码结构的情况下就开始阅读Linux内核代码,会遇到很大障碍。
"随着Linux内核的发展,内核的代码量日益增加,系统规模不断扩大,复杂度不断提高。
如何在纷繁芜杂的代码中找到自己所需的信息,是一个亟待解决的问题。
"研究、学习过程中不仅需要掌握C语言、操作系统方面的知识,而且还要需要掌握汇编语言、内联汇编、编译器、链接器、链接脚本等各方面的知识。
因此,读者亟需这样一本书。
"能够在需要的地方深入浅出地讲解研究、学习Linux内核所需的知识点。
"能够对内核的核心框架进行全面剖析,引导读者走出由错综复杂的函数和数据结构组成的迷宫,使读者可以在较短的时间内掌握Linux内核的精髓。
本书特点(1)基于Linux 2.6版本内核进行讲解。
相对于早期版本,本书讨论的Linux 2.6版本内核已经非常成熟,具有O(1)调度算法、改进的NPTL线程模型、内核态抢占等新的特性,具有良好的响应能力(软实时)。
这些重要特性保证了Linux 2.6版本内核具有非常广泛的实际应用价值,更适用于实际产品的开发。
(2)专注于Linux内核核心模块,使读者在较短的时间内掌握Linux的精髓。
对于Linux 2.6版本内核这一"庞然大物",本书选取了内核的核心关键模块,在有限的篇幅内对Linux内核的工作原理进行深入、透彻的讲解。
(3)分析和讲解细致、透彻。
本书对每个内核核心模块,都深入剖析其数据结构、访问接口、工作机制和内核实现。
越来越多的Linuxer开始对尚处在测试中的2.6内核产生了兴趣,确实它非常具有吸引力,众多的特性让人眼花潦乱。
我也从2.4全面转到了2.6内核之下,享受着新特性带来的新鲜体验。
不过不少兄弟在编译新内核时或多或少的遇到了一些问题,看来新娘的盖头也不是那么容易揭开的:)因此我打算写一些文章来介绍编译新内核时的一些应该注意的地方,以减少兄弟们在编译新内核时的麻烦。
由于我的水平十分有限,写这样的文章实在是勉为其难。
文中肯定有错误疏失之处,还请兄弟们多多包涵:)第一部分,准备:要使用新的内核首先当然要取得新内核的源码,内核的官方网站是 在上面可以得到最新的内核。
2.6的更新是相当快的,你可以在命令行下使用finger @命令来快速得到当前最新的内核列表。
在这篇文章中我将以2.6.0-test6为准。
下载了内核源码之后,我们要使用tar jxvf linux-2.6.0-test6.tar.bz2来提取源码,如果你下载的是以tgz结尾的压缩包就使用zxvf参数来解压。
我强烈建议你不要使用/usr/src/linux这个目录来存放源码,因为使用这个目录你需要手工在/usr/include目录下作一些符号链接,这实在不是一个好主意。
所以我建议你为源码单独建一个目录,这里我们的目录是/src/linux-2.6.0-test6。
要编译与正常运行新的内核你需要升级一些软件包,这些信息在源码目录下的Documentation/Changes 文件中,请根据你的实际情况选择升级。
这其中我强调一下你应该升级Module-Init-Tools,不要被你当前系统中depmod -V输出的版本号迷惑(在RH9中它的输出是2.4.22,感觉好象要比Changes中所要求的要高,实际上它们使用不同的版本规则)。
新的Module-Init-Tools在下面的网址中取得:/pub/linux/kernel/people/rusty/modules/我使用的是0.9.14。
Linux2.6启动3--start_kernel篇Linux2.6启动3--start_kernel篇当内核与体系架构相关的汇编代码执行完毕,即跳入start_kernel。
这个函数在kernel/init/main.c中。
由于这部分涉及linux众多数据结构的初始化,包括内核命令行解析,内存缓冲区建立初始化,页面分配和初始化,虚拟文件系统建立,根文件系统挂载,驱动文件挂载,二进制程序文件的执行等,限于篇幅和理解水平,只能流程上的大致梳理,以上提及方面后期再做详细分析。
为保证准确性,参考了一部分书籍和网上技术文档,如有疑问请及时提出,共同学习探讨。
asmlinkage void __init start_kernel(void){char * command_line;extern struct kernel_param __start___param[], __stop___param[];//这里引用两个符号,是内核编译脚本定位的内核参数起始地址smp_setup_processor_id();//多CPU架构的初始化,目前我们的高通linux侧是单核的,此多核不做分析unwind_init();//本架构中没有用lockdep_init();//本架构为空debug_objects_early_init();cgroup_init_early();local_irq_disable();early_boot_irqs_off();early_init_irq_lock_class();lock_kernel();//本架构为空函数tick_init();//时钟中断初始化函数,调用clockevents_register_notifier 函数向clockevents_chain 时钟事件链注册时钟控制函数tick_notifier。
这是个回调函数,指明了当时钟事件发生变化时应该执行的哪些操作,比如时钟的挂起操作等boot_cpu_init();//用于多核CPU的初始化page_address_init();//用于高地址内存,我们都用32位CPU,此函数为空printk(KERN_NOTICE);printk(linux_banner);setup_arch(&command_line);//具体看一下这个架构初始化函数完成哪些功能void __init setup_arch(char **cmdline_p){struct tag *tags = (struct tag *)&init_tags;//定义了一个默认的内核参数列表struct machine_desc *mdesc;char *from = default_command_line;setup_processor();//汇编的CPU初始化部分已讲过,不再讨论mdesc = setup_machine(machine_arch_type);machine_name = mdesc->name;if (mdesc->soft_reboot)reboot_setup("s");if (__atags_pointer)tags = phys_to_virt(__atags_pointer);else if (mdesc->boot_params)tags = phys_to_virt(mdesc->boot_params);//由于MMU单元已打开,此处需要而boot_params是物理地址,需要转换成虚拟地址才能访问,因为此时CPU访问的都是虚拟地址/** If we have the old style parameters, convert them to* a tag list.*///内核参数列表第一项必须是ATAG_CORE类型if (tags->hdr.tag != ATAG_CORE)//如果不是,则需要转换成新的内核参数类型,新的内核参数类型用下面struct tag结构表示convert_to_tag_list(tags);//此函数完成新旧参数结构转换struct tag {struct tag_header hdr;union {struct tag_core core;struct tag_mem32 mem;struct tag_videotext videotext;struct tag_ramdisk ramdisk;struct tag_initrd initrd;struct tag_serialnr serialnr;struct tag_revision revision;struct tag_videolfb videolfb;struct tag_cmdline cmdline;} u;};//旧的内核参数列表用下面结构表示struct param_struct {union {struct {unsigned long page_size; /* 0 */unsigned long nr_pages; /* 4 */unsigned long ramdisk_size; /* 8 */unsigned long flags; /* 12 */。
Linux学习笔记
LINUX常用操作命令和命令行编辑快捷键学习笔记总结
Ctrl+a/Home切换到命令行开始;
Ctrl+e/End切换到命令行末尾;
Ctrl+1清除屏幕内容,效果等同于clear;
Ctrl+u清除剪切光标之前的内容;
Ctrl+k剪切清除光标之后的内容;
Ctrl+y粘贴刚才所删除的字符;
Ctrl+r在历史命令中查找(这个非常好用,输入关键字就调出以前的命令了);
Ctrl+c终止命令;
Ctrl+o重复执行命令;
Ctrl+d退出shell,logout;
Ctrl+z转入后台运行,但在当前用户退出后就会终止;
Ctrl+t颠倒光标所在处及其之前的字符位置,并将光标移动到下一个字符;
Alt+t交换当前与以前单词的位置;
Alt+d剪切光标之后的词;
Ctrl+w剪切光标所在处之前的一个词(以空格、标点等为分隔符);
Ctrl+(xu)按住Ctrl的同时再先后按x和u,撒销刚才的操作;
Ctrl+s锁住终端;
Ctrl+q解锁终端。
linux操作系统原理篇笔记Linux是一种开源的、类UNIX操作系统,被广泛应用于服务器、嵌入式系统以及个人电脑等领域。
它具有稳定、安全、可靠、可定制性强的特点。
下面是关于Linux操作系统原理的一些笔记:1. 内核:Linux操作系统的核心是内核,它负责管理系统硬件资源、进程管理、内存管理、文件系统和设备驱动等。
内核是操作系统的核心部分,也是与硬件交互的关键组件。
2. 进程管理:Linux使用多任务机制,在同一时间可以运行多个进程。
进程管理包括创建、调度、终止进程,以及进程间通信和同步等。
Linux采用了时间片轮转和优先级调度算法来实现进程调度。
3. 内存管理:Linux使用虚拟内存管理机制,将物理内存划分为多个虚拟内存页,可以管理更大的内存空间。
它使用页面置换算法(如LRU)来管理内存中的页,并通过分页机制实现了内存的动态分配和回收。
4. 文件系统:Linux支持多种文件系统,如Ext4、XFS和Btrfs等。
文件系统负责文件的组织、存储和访问,提供了文件和目录的命名、权限管理和数据恢复等功能。
5. 设备驱动:Linux通过设备驱动程序实现与硬件设备的交互。
它提供了通用设备驱动框架,以及特定设备类型的驱动程序接口,如网络设备驱动、存储设备驱动等。
6. 用户界面:Linux提供了多种用户界面,包括命令行界面(Shell),图形用户界面(如X Window),以及Web界面等。
用户可以通过不同的界面与系统进行交互和操作。
7. 网络支持:Linux内置了网络协议栈,支持TCP/IP协议,可以实现网络通信和互联网连接。
它可以作为客户端或服务器端与其他计算机进行数据传输和网络服务。
8. 安全性:Linux提供了强大的安全性功能,包括用户身份验证和授权、访问控制、加密和防火墙等。
它具有较高的抗攻击性能和安全性可靠性。
这些是关于Linux操作系统原理的一些基本内容,Linux操作系统非常庞大和复杂,有很多细节和深入的原理可以学习和探索。
Linux2.6-ARM学习笔记
一、存储管理
1、Linux的内存映射机制设计成三层,页目录表,中间目录表、页面表:PGD、PMD、PT
2、三层映射机制将线性地址分成四个位段,其中:
最高位段作为下标在PGD中找到包含PMD地址的表项;
第二个位段作为下标在PMD中找到包含PTE地址的表项;
第三个位段作为下标在PTE中找到包含所需页面(根据ARM手册,大页:64K/小页4K/极小页
1K)物理地址的表项;
第四个位段(页内地址偏移(16BIT/12BIT/10BIT))作为下标在物理页面中找到最终的物理地址;
思考:根据ARM手册,ARM的页保护包含多种方式,其中由粗、细粒度之分,大、小、极小页之分,
以及段映射共六种,Linux中使用的是粗粒度小页映射方式,程序和硬件如何对应呢?
ARM页式映射解释:
关键名词:页目录表也叫一级页表PDG,页目录也叫页目录、二级页表PTE,页面也叫页page
最小的存储单元;
一级页表(PGD)在ARM中固定为1M即使用线性地址的最高位段31:20来定位,所以PGD占
地4KB,共1024的表项,每项4字节。
粒度决定的是PTE的占地大小,粗粒度表示PTE占地1K,也即PTE的地址是1KB对齐的,而PTE
的地址是由PGD表项内容决定,所以粗粒度情况下,PGD表项的31:10(包括一些不用的位)表示
PTE的地址,9:0表示PTE属性,所以PTE占地1KB,包含256个表项,每个表项当然也是四个字
节。、
细粒度则表示PTE占地4KB,包含1024个表项(分得更细了),每个表项4字节。
PTE中的项是使用线性地址的第二位段来决定其在PTE中的偏移位置的,第二位段的位数由线性地
址的第三位段来决定:
如果页面为大页即16KB,15:0,第二位段则使用剩下的19:16位共8项来确定PTE中的表项;
如果页面为小页即4KB,11:0,第二位段则使用剩下的19:12位共256项来确定PTE中的表
项;
如果页面为极小页1KB,9:0,第二位位段则使用剩下的19:10位共1024项来确定PTE中的表
项;
所以页面的大小页决定了PTE中表项内容中有多稍微用来表示页面地址。也最终确定了ARM页映
射的组合方式粗粒度(大、小页),细粒度(大、小、极小)。粗粒度和极小页不能配合,为什么呢,
理解上面说的就知道了,因为极小页要求PTE有1024项,而粗粒度一共才只有256项。
所以:ARM在Linux中使用的是粗粒度小页的映射方式,则在Linux中,线性地址分为三个位段,
31:20用于PGD中定位PTE,19:12用于PTE中定位页面,11:0用于页面中地位最终物理地址。
考虑到Linux采用三层映射方式,所以将上面的叙述修正:线性地址分为四个位段,31:20用于PGD
中定位PMD,第二个位段为不存在,即PMD中只有一项,其内容指向PTE的位置,所以PGD中的每
一项在物理上指向的都是一个PTE,逻辑上倒是指向了PMD,实现了Linux的三层映射机制,19:12
用于PTE中定位页面,11:0用于页面中地位最终物理地址。这里每个PMD仅相当于是PGD的一个
表项的真实版本,而PGD中的表项仅是为了找到这个真实版本表项的一个伪表项。(上述内容的实际情
况要根据具体的内核代码来鉴别)
3、arch/arm/include/asm/pgtable.h页表参数定义的头文件
arch/arm/include/asm/pgtable-hwdef.h
前一个文件中在物理内存与虚拟内存之间设置一个8M的缓冲区,防止操作物理内存是意外过界。
That means that any out-of-bounds memory accesses will hopefully be caught.