linux 内核 空间,Linux内核空间和用户空间

你已经掌握了大致正确的想法,但是做出这样的调整:整个机器只有一个“内核空间”,所有进程都共享它.

当进程处于活动状态时,它可以在“用户模式”或“内核模式”下运行.

在用户模式中,CPU执行的指令位于存储器映射的用户空间侧.该程序正在运行自己的代码或来自用户空间库的代码.在用户模式下,进程的能力有限. CPU中有一个标志,告诉它不允许使用特权指令,内核内存虽然存在于进程的内存映射中,但是不可访问. (您不希望让任何程序只读取和写入内核的内存 – 所有安全性都将消失.)

当一个进程想要做一些事情而不是在自己的(用户空间)虚拟内存中移动数据时,比如打开一个文件,它就必须进行系统调用.每个CPU架构都有自己独特的制作系统调用的古怪方法,但它们都归结为:执行魔术指令,CPU打开“特权模式”标志,并跳转到内核空间中的特殊地址,即“系统调用”入口点”.

现在该进程正在内核模式下运行.正在执行的指令位于内核内存中,它们可以读写任何想要的内存.内核检查进程刚刚发出的请求,并决定如何处理它.

在open示例中,内核接收与int open(const char * filename,int flags [,int mode])的参数对应的2或3个参数.第一个参数提供了内核空间何时需要访问用户空间的示例.你说open(“foo”,O_RDONLY)所以字符串“foo”是用户空间中程序的一部分. syscall机制只传递一个指针,而不是一个字符串,因此内核必须从用户内存中读取字符串.

要查找所请求的文件,内核可以查询文件系统驱动程序(以确定文件的位置)和阻止设备驱动程序(从磁盘加载必要的块)或网络设备驱动程序和协议(从远程源加载文件) ).所有这些都是内核的一部分,即在内核空间中,无论它们是内置的还是作为模块加载的.

如果无法立即满足请求,则内核可能会使进程进入休眠状态.这意味着该过程将从CPU中取出,直到从磁盘或网络收到响应.另一个过程可能有机会立即运行.稍后,当响应进入时,您的进程将再次开始运行(仍处于内核模式).现在它找到了文件,open syscall可以完成(检查权限,创建文件描述符)并返回用户空间.

返回用户空间是一个简单的问题,即将CPU恢复到非特权模式,并将寄存器恢复到用户 – >内核转换之前的状态,指令指针指向魔术系统调用指令之后的指令.

除了系统调用之外,还有其他一些可能导致从用户模式转换到内核模式的事情,包括:

>页面错误 – 如果您的进程访问的虚拟内存地址没有分配给它的物理地址,则CPU进入内核模式并跳转到页面错误处理程序.然后,内核决定虚拟地址是否有效,并创建物理页面并在其停止的用户空间中恢复进程,或发送SIGSEGV.

>中断 – 某些硬件(网络,磁盘,串行端口等)通知CPU需要注意. CPU进入内核模式并跳转到处理程序,内核响应它,然后恢复在中断之前运行的用户空间进程.

使用系统调用来加载模块,系统调用要求内核将模块的代码和数据复制到内核空间并在内核模式下运行其初始化代码.

这很长,所以我停下来了.我希望专注于用户内核转换的演练提供了足够的例子来巩固这个想法.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值