继续蹂躏linux

简介:

话说linux的内核空间不能访问用户空间,这是真的吗?前面说过很多次,没有什么是绝对不能的,一定要区分清楚什么是不允许什么是不可能,用户空间不能访问内核空间是硬件规定和实现的,但是反过来,内核空间不能访问用户空间却只是linux的一种约定,一种规定或者多多少少有点设计上的约定,内核空间拥有至高无上的权力为何要限制它呢?其实不是限制而是这样规定使得实现起来更加方便和有条理,仔细想想,内核空间被所有的进程共享,你让内核访问用户空间, 那么访问谁的用户空间呢?所以要想实现内核访问用户空间,必须在访问时指明访问哪个进程的用户空间,而且还会涉及缺页处理的问题,毕竟内核访问的用户空间对应的进程可能不是当前进程,之后的复杂性就不用多说了吧。另外的原因就是设计上的规定了,设计上有个“流”的概念,要想使设计灵活,模块化,或者说低耦 合,那就得使对应的流单向化,就是所谓的单向依赖,tcp/ip模型和osi模型就是这么设计的,上层使用下层的服务,下层绝对不依赖上层,就是不会“调 用”上层,在操作系统的设计中当然也是这样,内核为用户空间服务并且不依赖用户空间,就是不调用用户空间。 
事实上就真的不能调用用户空间吗?肯定不是的,就像内核不允许在中断中睡眠,但是你真的在中断处理函数里面调用了个schedule并不会使得内核马上崩 溃,只是内核后面的行为变得不能保证了。我们还是用内核模块来实现一个内核访问用户空间的例子,访问用户空间的数据在《char *和char数组的区别(深拷贝和浅拷贝的观点)以及内核访问用户空间》里面已经说过了,现在要谈的的是内核调用用户空间的函数,这个理解起来要明白两个 东西,一个是程序的text段,一个程序的栈,一个函 
数的执行关联到了text段和栈,所谓text段其实也是一种数据,内核调用用户空间的函数实际上就是访问了用户空间的数据,内核从用户空间的text段取到被调函数的指令,这就访问了用户空间数据,然后执行的场所呢?当然是栈了,有函数调用就需要栈,可是这个栈不是那个栈,内核调用用户空间的函数时所用的栈是内核栈,其实也是当前进程的当前栈。这就是说,一个函数执行要弄明白两点,一是到哪里 取指令(一般为text段,当然在缓冲区溢出攻击中可能是栈),二是在哪里执行(一般是 
栈)。因此内核调用用户空间的函数就是到用户空间的text段取指令,在内核栈执行,如此而已,还有一个问题,就是如何得到用户空间的函数地址,当然可以通过特征扫,也可以硬赋值,我这里为了简单采用了后者,先看看用户空间程序:

void userfunc( int i )

{

 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1273433


相关文章
|
7月前
|
安全 Unix 中间件
Linux介绍
Linux介绍
57 0
|
5月前
|
Linux 调度 开发工具
初识Linux
Linux 和 操作系统简介
|
6月前
|
监控 Linux 数据库
Linux下的epf 是什么?
由于 EPF 是一个底层的内核功能,实际涉及到 EPF 的代码可能需要在内核层面进行编写和调试。下面给出在应用程序中使用 EPF 巨型页面的示例代码:
55 0
|
消息中间件 Linux
linux 有名管道使用 mkfifo
linux 有名管道使用 mkfifo
123 0
linux 有名管道使用 mkfifo
|
Unix Linux 程序员
1.2 Linux是什么,有哪些特点?
Linux 是一款免费的操作系统,这意味着在任何需要的时间和需要的地点它都要比其他操作系统更容易安装。不用担心购买网站授权并受到数字版权管理(Digital Rights Management)的制约,这对所有类型的组装机器以及服务器配置的测试变得更加直接。
121 0
1.2 Linux是什么,有哪些特点?
|
安全 Linux 程序员
Linux 下如何知道是否有人在使坏?
Linux 下如何知道是否有人在使坏?
110 0
|
运维 Kubernetes 机器人
|
Unix Linux
bpftrace (DTrace 2.0) for Linux 2018
文章翻译自: [原文链接](http://www.brendangregg.com/blog/2018-10-08/dtrace-for-linux-2018.html) 译者: 姜弋 译者注: 原作者是大名鼎鼎的性能分析专家:Brendan Gregg,现在工作在Netflix,之前工作在Sun,在Sun公司的时候,他就做了大量的性能分析和tracing相关的工作,在Sun的Solari
1465 0
|
Linux 网络架构
linux内核数据结构之kfifo【转】
转自:http://www.cnblogs.com/Anker/p/3481373.html 1、前言   最近项目中用到一个环形缓冲区(ring buffer),代码是由linux内核的kfifo改过来的。
1082 0
|
Linux Perl 关系型数据库