我知道所有关于为什么不应该从内核读/写文件的讨论,而是如何使用/ proc或netlink来做到这一点.无论如何我想读/写.我也读过" 驾驶我的坚果 - 你应该在内核中做的事情".
但问题是2.6.30不能导出sys_read()
.相反,它包含在内SYSCALL_DEFINE3
.因此,如果我在我的模块中使用它,我会收到以下警告:
WARNING: "sys_read" [xxx.ko] undefined!
WARNING: "sys_open" [xxx.ko] undefined!
Run Code Online (Sandbox Code Playgroud)
显然insmod
无法加载模块,因为链接没有正确发生.
问题:
sys_read()
/ sys_open()
不导出)?SYSCALL_DEFINEn()
内核中包含宏的系统调用?我正在阅读Robert Love的以下文章
http://www.linuxjournal.com/article/6916
说的是
"...让我们讨论工作队列在进程上下文中运行的事实.这与其他下半部机制形成对比,后者都在中断上下文中运行.在中断上下文中运行的代码无法休眠或阻塞,因为中断上下文没有重新安排的后台进程.因此,由于中断处理程序与进程没有关联,调度程序没有任何东西可以进入休眠状态,更重要的是,调度程序无需唤醒..."
我不明白.AFAIK,内核中的调度程序是O(1),它是通过位图实现的.那么什么阻止了scehduler将中断上下文置于睡眠状态并采取下一个可调度进程并将其传递给控件?
我有一个C库,需要注册回调函数来定制一些处理.回调函数的类型是int a(int *, int *)
.
我正在编写类似于以下内容的C++代码,并尝试将C++类函数注册为回调函数:
class A {
public:
A();
~A();
int e(int *k, int *j);
};
A::A()
{
register_with_library(e)
}
int
A::e(int *k, int *e)
{
return 0;
}
A::~A()
{
}
Run Code Online (Sandbox Code Playgroud)
编译器抛出以下错误:
In constructor 'A::A()',
error:
argument of type ‘int (A::)(int*, int*)’ does not match ‘int (*)(int*, int*)’.
Run Code Online (Sandbox Code Playgroud)
我的问题:
我正在使用Linux安全模块挂钩为recv()系统调用添加一些自定义功能.与pristine recv()相比,我想测量此功能的开销.我编写了一个简单的tcp服务器,我运行和没有我的模块.此tcp服务器调用recv()函数'N'次.它通过以下方式测量每个recv所花费的时间:
clock_gettime(before);
recv()
clock_gettime(after);
global_time += after - before.
Run Code Online (Sandbox Code Playgroud)
最后,我使用"global_time/N"打印单个recv()的平均时间.让我们把这次称为"user_space_avg_recv"时间.
在我的模块中,我想放置时间测量函数来计算我的钩子的确切执行时间.我尝试了3种方法.
我用jiffies如下:
sj = jiffies;
my_hook();
ej = jiffies;
current->total_oh = ej - sj;
Run Code Online (Sandbox Code Playgroud)
但我发现sj和ej值之间没有区别.因此total_oh没有变化.
我使用current_kernel_time(),因为我认为它以纳秒为单位返回时间.但是,再一次,之前和之后没有差别.
我用了get_cycles.我打印进程退出时的总循环数.但是,当我将总周期值转换为毫秒时,它会比"user_space_avg_recv"值大得多.这没有意义,因为内核中的测量值总是小于从用户空间测量的时间值.这可能意味着我要么使用正确的API进行测量,要么在将值从周期转换为毫秒时出错.
我基本上使用以下公式将周期转换为毫秒:
avg overhead of my hook in milliseconds =
(((cycles / 2.99) / 10^6) / N)
Run Code Online (Sandbox Code Playgroud)
2.99因为我的时钟频率是2.99Ghz
一些要点:
我的用户空间程序使用set affinity绑定到单个核心.
我正在使用内核2.6.22.14
为了阻止内核在我的钩子内切换上下文,我使用preempt_disable()和preempt_enable().因此,它不会计算其他内核线程的执行时间.即便如此,由于我的钩子使用了一些I/O,我的线程可能会自动释放控制,或者可能会发生一些可能会增加总周期数的中断.
问题:如何在内核中准确测量函数执行时间?
我对C和编译过程的基本知识最近变得生疏.我试图找出以下问题的答案,但我无法连接编译,链接和预处理阶段基础知识.快速搜索谷歌也没什么帮助.所以,我决定来到最终的知识来源:)
我知道:不应该在.h文件中定义变量.可以在那里宣布它们.
原因:因为头文件可能包含在多个位置,因此重新定义变量多次(链接器给出错误).
可能的解决方法:在头文件中使用header-guard并在其中定义变量.
它真的是一个解决方案:不.因为标题保护是用于预处理阶段.那就是告诉编译器这部分已经包含在内并且不再包含它.但是我们的多重定义错误来自链接器部分 - 在编译之后很久.
整件事让我对预处理和链接的工作方式感到困惑.如果已经定义了头部保护符号,我认为预处理将不包括代码.在那种情况下,不应该解决变量问题的多重定义吗?
这些预处理指令会在标题保护下重新定义编码过程,但是链接器仍会获得符号的多个定义,会发生什么?
在我的Chrome扩展程序的内容脚本中,我点击了某些网站上网页上的某些链接/按钮.为此,我在内容脚本中使用以下代码(我在内容脚本中嵌入了jQuery):
$(css_selector).trigger("click")
Run Code Online (Sandbox Code Playgroud)
这适用于大多数网站.
但是,在delta.com,match.com和paypal.com等某些网站上,这种触发元素点击的方式不起作用.在delta.com上,当我尝试在内容脚本中触发时,我得到以下抛出的异常:
Error: An attempt was made to reference a Node in a context where it does not exist.
Error: NotFoundError: DOM Exception 8
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果我打开javascript consoleon delta.com,包含一个jQuery并尝试相同的点击触发代码片段,它就可以了.
在match.com和paypal.com上,触发只是在内容脚本中不起作用并且没有错误.我甚至无法通过javascript控制台触发"click"事件,就像我在delta.com上所做的那样.
如果我手动使用鼠标单击,所有三个网站上的一切正常.因此我也尝试使用mousedown(),mouseup()模拟它,但这也不起作用.
这似乎是个问题,因为来自这些网站的javascripts正在劫持和忽略事件.我试图从这些网站读取代码,看看发生了什么,但代码太多了.
有没有人知道这里发生了什么以及如何解决它?
我知道通过内核和用户空间程序之间的以下接口可以实现信息交换
系统调用
读写控制
/ proc&/ sys
网络链路
我想知道
如果我错过了任何其他界面?
哪一种是交换大量数据的最快方式?(如果有任何文件/邮件/解释支持我可以参考的这种声明)
推荐哪种方式进行沟通?(我认为它的netlink,但仍然希望听到意见)
我熟悉持久性和非持久性XSS.我也知道同源策略可以防止/限制源自一个网站页面的请求转到另一个网站服务器.这使我认为相同的原始策略至少可以阻止非持久性类型的XSS攻击(因为在持久性攻击类型中,恶意代码来源与被盗的私有信息相同).我的理解是否正确?SOP可以用来阻止/减少这些攻击吗?
编辑:好吧,我在浏览器端调用两个脚本之间的方法和在另一个网站上调用HTTP POST之类的方法时感到困惑.谢谢你的回答jakber.
现在我有另一个问题,SOP是否能够阻止跨站点请求伪造?维基百科中给出的示例讨论了Bob在聊天论坛上访问由Mallory创建的恶意图像标记.但是,根据SOP规则,恶意脚本不应该能够访问银行的cookie.我在这里错过了什么吗?
我的内容脚本向background.js发送消息.在响应的回调处理程序中,我将最后一行作为"alert(alrt_msg)"
.执行代码后,我收到警告框,但点击"确定"后,Chrome控制台显示红色:
Error in event handler for 'undefined': Cannot call method 'disconnect' of null TypeError: Cannot call method 'disconnect' of null
at chromeHidden.Port.sendMessageImpl (miscellaneous_bindings:285:14)
at chrome.Event.dispatch (event_bindings:237:41)
at Object.chromeHidden.Port.dispatchOnMessage (miscellaneous_bindings:250:22)
Run Code Online (Sandbox Code Playgroud)
它没有太多的信息,但直觉上我知道这个错误是因为某些结构在某处被垃圾收集,而用户点击"确定".所以我把我的代码作为
window.setTimeout(function() { alert(alrt_msg); } , 1);
这使它工作没有上述错误.仍然,在搜索文档或谷歌后,我无法找到这背后的确切原因.有人可以解释一下,如果文档中包含特定的方法吗?
我有几个引导行。当用户单击任何行时,该行的中间应出现一个弹出窗口并显示一些信息。然而,目前它在行尾之后弹出到最右侧。
这是我的 JSBin 链接,显示了代码:https://jsbin.com/rogeyufuku/1/edit ?css,js,output
我尝试通过将positionLeft设置为负值来重新定位它,如下所示:
<ReactBootstrap.Popover className="my-popover"
positionLeft={-300}
positionTop={20}
>
Run Code Online (Sandbox Code Playgroud)
但这没有用。
我还尝试使用简单的旧 CSS 规则来操作它,如下所示:
.my-popover {
position: relative;
left: -200px;
}
Run Code Online (Sandbox Code Playgroud)
但这也不起作用。
有什么想法可以按照我的需要渲染弹出窗口覆盖吗?
(包括此处的所有代码供参考,但 JSBin 链接有效)
编辑:这是它现在的样子:https://i.stack.imgur.com/4XeBU.png 这是我想要的样子:https://i.stack.imgur.com/VZaHX.jpg
linux-kernel ×4
c ×3
c++ ×1
callback ×1
file-io ×1
header-files ×1
interop ×1
javascript ×1
jquery ×1
linker ×1
linux ×1
reactjs ×1
xss ×1