linux 分段?linux版软件网站
大家好,关于linux 分段很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于linux版软件网站的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
linux中运行一个脚本,用户不需要什么样的权限
linux中运行一个脚本,用户不需要W权限。
执行:1。
写入:2。
读取:4。
其他权限分别是
-rw-------(600)--只有读写权限。
-rw-r--r--(644)--只有有读写权限;而属组用户和其他用户只有读权限。
-rwx------(700)--只有有读、写、执行权限。
-rwxr-xr-x(755)--有读、写、执行权限;而属组用户和其他用户只有读、执行权限。
-rwx--x--x(711)--有读、写、执行权限;而属组用户和其他用户只有执行权限。
扩展资料:
sed= filename| sed'N;s/\n/\t/'
#对文件中的所有行编号(行号在左,文字右端对齐)。
sed= filename| sed'N; s/^//; s/*\(.\{6,\}\)\n/\1/'
#对文件中的所有行编号,但只显示非空白行的行号。
sed'/./=' filename| sed'/./N; s/\n//'
#计算行数(模拟"wc-l")
参考资料来源:百度百科-SED
为什么linux巧妙绕过了x86的分段机制
原因有兼容性考虑、逻辑空间地址。
1、Intel的x86架构引入了段机制,以解决CPU内部16位地址到20位实地址的转换。然而,为了保持兼容性,386仍然使用了段机制。随着硬件平台的发展,绝大多数不再支持段机制,只支持分页机制。为了使Linux具有更好的可移植性,需要去掉段机制而只使用分页机制。
2、在80x86系列CPU中,必须使用段机制来给出线性地址空间地址。然而,Linux通过将段的基地址设为0,将段界限设为4G,使得在32位系统下,段机制形同虚设。这样,Linux就可以直接使用逻辑地址,而不需要通过段机制进行转换。
详解linux内核-缺页中断处理
现代处理器大部分都配备MMU,除一些小型嵌入式设备。MMU实现虚拟地址与物理地址间的转换,利用它我们能利用更多内存空间,得益于程序的局部性原理,暂时不用的数据存放磁盘。当访问到时会触发缺页中断,将所需数据从磁盘加载至内存。由此,我们得以运行程序大小超过内存容量的程序和打开超过内存容量的文件。现代处理器通过分段分页机制完成虚拟地址至物理地址的转换,一般支持二级页表或四级页表。
缺页中断处理的流程如下:
1.硬件中断内核,保存程序计数器及其他指令状态信息至特殊CPU寄存器。
2.启动汇编程序,保存通用寄存器及其他易丢失信息,防止操作系统破坏。
3.操作系统发现缺页中断,识别需要的虚拟页面。通常硬件寄存器包含信息,若无则检索程序计数器,分析当前指令,确定操作。
4.确定缺页虚拟地址,检查地址有效性与权限一致性。若不一致,向进程发送信号或终止进程。若有效且无保护错误,系统检查空闲页框。若无,则执行页面置换算法淘汰页面。
5.若选中的页框脏,则将该页写回磁盘,进行上下文切换,挂起产生缺页中断的进程,直到写入磁盘完成。写入的页框标记为忙,避免其他进程占用。
6.一旦页框干净,操作系统获取页面在磁盘的地址,通过磁盘操作将其装入。此时,产生缺页中断的进程仍挂起,如果有其他可运行的用户进程,选择该进程运行。
7.当磁盘中断发生,表示页面已加载至内存,页表更新,页框标记为正常状态。
8.恢复缺页中断前的状态,程序计数器指向中断前指令。
9.调度产生缺页中断的进程,操作系统返回调用汇编例程。
10.汇编例程恢复寄存器状态,返回用户空间,仿佛缺页中断未发生。
Linux内核对缺页异常处理复杂,基本思想与上述流程相似。首先关注struct vm_area_struct,虚拟内存区域,如.text段、数据段,每个都对应vma,在加载二进制文件时创建这些vma。
页面分类为:
匿名页:数据段、堆、栈、mmap匿名映射的页。
文件页:可执行文件代码段映射的页、普通文件映射的页。
缺页异常分类:内核态缺页异常与用户态缺页异常。内核态异常包括vmalloc区异常,vmalloc出现异常易于处理,只需同步页表即可,内核引用用户空间地址引发的异常,如用户态地址非法或页面已交换至磁盘。内核bug也是内核态缺页异常之一。内核态缺页异常频率低,因为内核态数据不会交换至磁盘。用户态缺页异常频繁,因用户态数据频繁写入交换区与文件,且进程创建时伴随着大量缺页异常。
Linux基本处理流程如下:
内核处理缺页异常的主要函数为do_page_fault。do_page_fault流程图如下。
在do_page_fault内调用的关键函数为find_vma,查找缺页地址对应的vma,vma在进程创建时分配。内核通过链表与红黑树对vma排序。
在栈增长方向向下时,若缺页地址不在任何vma闭区间内,需要扩展栈所属vma起始地址,expand_stack函数如下。
当发生正常用户空间的缺页异常,需要调用handle_mm_fault处理页表。获取缺页地址对应的页表项指针后,进入handle_pte_fault,根据条件调用不同的页框交换函数,具体代码如下。
用户态缺页页框经过以上处理,将从磁盘加载至内存,重新建立映射。
内核态缺页异常处理涉及函数,内核态分为页表未更新至最新,需要进行页表同步,调用vmalloc_fault。内核态缺页异常还有一情况,内核访问用户空间地址,若用户空间页表对应的页框已被交换至磁盘,或为错误地址,则使用fixup_exception处理。内核编译时会预留异常表空间。i386链接脚本内存布局包含以下内容:
__start__ex_table和 __stop__ex_table指定__ex_table段的起始与结束地址。*(__ex_table)将所有输入目标文件的__ex_table段组合成一个__ex_table。在内核调用copy_from_user时发生缺页异常的处理过程如下。
经过以上分析,深入理解了Linux内核的缺页异常处理。当然,还有未分析的细枝末节,但整体处理逻辑已清晰。