- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
首先,我这样做是为了好玩所以不要评判我。
我所做的是将函数指针从用户空间传递到内核,使用 copy_from_user 将函数体复制到内核中的静态数组,然后开始跳转到该数组中执行。
在内核中:
static char handler_text[PAGE_SIZE] __page_aligned_data;
copy_from_user((void *)handler_text , (const void __user *)my_handler , PAGE_SIZE);
((void (*)())(handler_text))();
在用户空间,这个函数做的事情很简单如下
void my_handler(){
volatile unsigned long * p = (volatile unsigned long *)0xF0000c10;
*p = 0x0000000;
}
10000938 <my_handler>:
10000938: 3d 20 f0 00 lis r9,-4096
1000093c: 39 40 00 00 li r10,0
10000940: 61 29 0c 10 ori r9,r9,3088
10000944: 91 49 00 00 stw r10,0(r9)
10000948: 4e 80 00 20 blr
1000094c: 00 01 88 08 .long 0x18808
问题是我第一次这样做时总是会产生糟糕的消息。但是我第二次这样做和之后,问题就消失了,再也没有Oops了。我可以通过读取内存清楚地看到该函数是由内核执行的。我正在运行一个 PowerPc 目标,所以 Oops 显示异常是 700,这是程序异常。从 Oops 中,我可以看到指令转储,其中 nip(之后)与 my_handler 完全相同。
Instruction dump:
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 <3d20f000> 39400000 61290c10 91490000
我想不出有什么意义。任何人都可以吗?谢谢
最佳答案
我不想打消一个令人钦佩的想法,但如果没有一些严肃的额外工作,你想要做的事情即使不是不可能也是困难的。
您的函数链接在 用户 空间中的 F
位置。您正在将它复制到静态数组位置的内核空间:A
。 A
可能位于内核的数据部分,因此可能无法执行。此外,您的函数链接到错误位置(例如 F != A
)。
此外,即使您的函数可以链接到正确的位置 A
,您如何处理其中符号的重定位(例如,如果它调用 printk
,如何您重新链接函数内的地址以匹配实际的 printk
地址)?
创建内核模块并加载它(通过 modprobe
)要容易得多,您可以做任何您想做的事。
旁注:这是一个巨大安全漏洞。 “Stuxnet”蠕虫使用类似的一个来渗透 Windows。
更新:
转储发生在异常事件发生后 [及时] 很长时间。到那个时候,它有正确的数据,所以转储显示当前状态,可以这么说,但不是在有问题的确切周期发生了什么[由于这种“自修改”代码的性质]。
但是,当最初执行时,它可能有垃圾(即 700)。我不确定 PPC,但其他拱门有单独的 inst 和数据缓存。乱序执行。数据将在数据缓存中,但不一定在 inst 缓存 [或队列] 中。而且,它们倾向于独立运行以提高速度 [“哈佛”架构]。
(例如)在 x86 上,设置静态区域后,您必须刷新/同步以便执行单元重新获取该区域。否则,它可能已经推测性地预取了指令数据(例如,它不期望它是“自修改的”),其中的数据不是预期的[可能是 0x00000000]。
考虑:在 copy_from_user
之后,所需的数据位于数据缓存中,但尚未被刷新到 RAM。执行单元[和 inst 缓存],没有来自静态区域的任何数据,将从 RAM 中获取。因为自修改代码很少见,所以 inst 和数据缓存不会互相窥探[这会减慢速度]。
因此,执行单元从 RAM(例如 0x00000000)而不是加载的数据[数据缓存中仅]获取数据。
第二次成功是因为执行单元获取的数据来自第一次尝试时的数据[有时间刷新到RAM]。也就是说,静态区域现已填充,第二个 copy_from_user
实际上是一个 NOP。
[如前所述]该区域的“验尸”转储将无法显示这种差异。
关于将函数从用户空间复制到内核并执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34935452/
运行 Tomcat 失败并出现 java.lang.OutOfMemoryError - 与缺少 PermGen 空间相关的错误。 我最近将 Tomcat 更改为以自己的用户(而非 root)运行。
我们有一个表,其中包含数百万行,其中包含 PostGIS 几何图形。我们要执行的查询是:落在边界几何内的最新条目是什么?这个查询的问题是我们经常会有大量的项目匹配边界框(半径大约为 5 公里),然后
我有一个Elasticsearch设置,它将允许用户搜索通配符作为索引。 array:3 [ "index" => "users" "type" => "user" "body" => arra
我创建了一个表,其中每行包含两个按钮,并且两个按钮连接在一起,我想将两个按钮分开。我用过 不起作用,css 也是,这是他们的另一种方式。 我有另一个问题,因为我不想在表格边框内显示操作按钮,而是在靠近
我试图在 jQuery Mobile 中的两个按钮之间留出空白。现实中的布局是这样的: Button 1 Button 2 (Hidden w/ display: none)
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
您好,我对图表应用程序还很陌生。现在我为我的应用程序创建了条形图。当我运行 create bar chart as separate project 时,输出如下所示。 然后当我将条形图与我的应用程序
我在使用 H2 和 GeoDB(内存中,junit)时遇到问题。 另外,使用 Hibernate 5(每个包的最新版本,包括 hibernate-spatial)和 Spring 4。 通过 id 实
我想画一张澳大利亚的 map ,并将每个城市表示为一个点。 然后突出显示人口众多(> 1M)的城市 library(sp) library(maps) data(canada.cities) head
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 提供事实和引用来回答它. 6年前关闭。 Improve this
如何保持.txt文件中存在的空格?在.txt文件中,它表示: text :text text1 :text1 text23 :text2 text345 :text3 如果我写这段
以下哪个键最大? 选项 1:16 个数字 [0,9] 选项 2:30 个元音 选项 3:字母表中的 16 个字母 选项 4:32 位 有人可以帮助我,告诉我哪一个是正确的答案以及我们如何计算它吗?我知
在 Unity 3d 中使用 Azure 空间 anchor 来实现在 iOS 和 Android 上部署的室内和室外增强现实体验是否有益? 最佳答案 是的,对于 Azure Spatial Anch
我有一个绝对定位的圆形图像。图像只需占据屏幕宽度的 17%,并且距离顶部 5 个像素。 问题是,当我调整图像大小以占据屏幕宽度的 17% 时,它会这样做,但同时容器会变长。图像本身不会拉伸(stret
我在 Ubuntu 14.04 上使用 Cassandra。从文档中,我可以看到运行命令: nodetool snapshot 创建我的 key 空间的快照。 命令的输出是: nodetool sn
Heroku引入了“私有(private)空间”,是否可以将现有应用迁移到私有(private)空间? https://blog.heroku.com/archives/2015/9/10/herok
是否允许在语义记录中使用非绑定(bind)空格 或其他 HTML 编码字符?我遇到的问题是 ; 字符被软件视为记录的结尾。 例如:假设我有一份婚姻记录,其中包含 2 个结婚者的姓氏、结婚年份以及结
我正在研究“智能 parking ”项目,偶然发现了包含我们真正需要的YouTube视频。我们已经实现了第一部分,即从视频源进行实时透视变换,下一步是将其定义为一组矩形 我基本上需要知道他是如何做到的
我有两个类:Engine 和 Trainset(多个单元),这两个类共享其 ID 空间,其中包含名称和系列 id=- . 这是我的Engine类(它是抽象的,因为有引擎的子类型(DieselEngin
如果有人能帮助我,那就太好了。 我正在尝试使用Java的Split命令,使用空格分割字符串,但问题是,字符串可能没有空格,这意味着它将只是一个简单的顺序(而不是“输入2”将是“退出”) Scanner
我是一名优秀的程序员,十分优秀!