关于操作系统的几个常被问的问题

在32位x86体系 32位linux内核下

1.地址映射由谁来完成?
内核(GDT LDT PD PT)-硬件(MMU)
MMU完成从线性地址到物理地址的映射
这里写图片描述
这里写图片描述

2.为什么说32位的Linux 的逻辑地址和虚拟地址是一样的?
逻辑地址 + 段基址 = 虚拟地址
如果一样的话,那就说明基地址为0.那么为什么基地址会为0?原因是在进行地址映射的时候,分页的效率明显高于分段,但是由于继承x86体系,进行假分段,所以需要保存之前的分段,但实质对分段只是进行了从0地址开辟了4G的空间,实质并未完成什么任务。只要cpu跟内存交互就会进行地址映射。

3.什么是进程?(进程有什么?具备了就是进程)
1.进程得有代码指令(正在运行的程序)
2.PCB(进程控制块)
3.独立的用户空间(占用资源)
4.独立的内核栈(调用系统API进行用户态和内核态的切换时,就是切换的指针,也就是切换内核栈,内核栈不是共享的,内核空间是独立的)

4.什么叫做线程?
这里写图片描述
Windows下,线程是进程的执行流,一个进程有一个或多个线程。
没有内核线程,windows的最小单位是进程。
Linux下,线程和进程之间并无明显区别,最小单位是任务(task_strut)。线程和进程都各自有独立的进程控制块和内核栈。线程没有独立的用户空间则为内核态线程,如果有独立的用户空间,共享别的进程,则是用户态线程。没有内核进程,只有内核线程。

5.加速地址映射的方式?
TLB存放最近使用的页目录,页表(深入理解计算机第9章)
离MMU越近,映射速度越快

6.地址映射的方式只有一种?
内核空间的映射方式:虚拟地址 – offset (0x1000)=物理地址
用户空间的映射方式是页目录,页表的映射
用户空间和内核空间的地址映射不同

7.32位Linux是如何管理内存的?
每一个页面 struct _page
页表中存放物理页面的序号
页表中的第0位(present)判断页面是活动的还是在swap分区中
这里写图片描述
页表中的高20位存放物理页面,低12位均为0,物理页面是从0地址开始,物理页面的地址刚好是页框号。0 1 2 3 4

6.换页算法:
LRU (交换的用户空间)最近最久未使用
脏页需要被交换,在切换的过程中会产生页面抖动,但是概率不大,很少有一段代码占用两页,为延缓页面抖动需要建立缓存,
这里写图片描述
所以Linux 中最多有4090个进程

7.进程切换:
这里写图片描述

8.内核中开辟堆内存:kmalloc 和 vmalloc有什么区别?
1)kmalloc和vmalloc分配的是内核的内存,malloc分配的是用户的内存
2)kmalloc保证分配的内存在物理上是连续的, kmalloc()分配的内存在0xBFFFFFFF-0xFFFFFFFF以上的内存中,driver一般是用它来完成对DS的分配,更适合于类似设备驱动的程序来使用;
vmalloc保证的是在虚拟地址空间上的连续,vmalloc()则是位于物理地址非连续,虚地址连续区,起始位置由VMALLOL_START来决定,一般作为交换区、模块的分配。
3)kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大(因为vmalloc还可以处理交换空间)。
4)内存只有在要被DMA访问的时候才需要物理上连续,vmalloc比kmalloc要慢
5)vmalloc使用的正确场合是分配一大块,连续的,只在软件中存在的,用于缓冲的内存区域。不能在微处理器之外使用。
6.vmalloc 中调用了 kmalloc (GFP—KERNEL),因此也不能应用于原子上下文。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章