问题标签 [systems-programming]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
210 浏览

c - 分段错误:尝试修改结构时出现 11

我试图将我的 char* 参数存储到结构指针的数据成员中。但是当我尝试这样做时,我收到了 Segmentation Fault: 11。

当我尝试将名称存储到 current->name 中时发生错误。感谢任何可以提供帮助的人!

0 投票
0 回答
478 浏览

c++ - Flash 仿真库 - 捕获内存写访问

我需要编写一个库(在 C++ 中),它将模拟类似 NOR 闪存的行为。(平台-Windows,语言-C++)(对不起,很长的帖子,我试图解释我到目前为止所做的事情:))

要求的行为:

所以,这就是它应该如何工作的,我需要返回内存范围,用户将使用它作为闪存。他应该能够从返回的内存缓冲区中读取任何字节,这不是问题,主要问题在于写入,因为闪存的写入行为不同,因此您只能重置一点,如果地址有内容(二进制) 10101010 并且用户尝试将 01011001 写入该地址,然后该位置在写入后实际上应该包含 10101010 和 01011001 = 00001000。我不知道如何完成这项工作!

这些是我正在考虑的方法:

我需要将数据存储为内部文件,以便能够多次使用它并在多次使用后进行分析,所以我打算使用内存映射文件-IO 来返回内存。读取不是问题,但我不确定如何在写入之前捕获内存写入并应用 AND 掩码。

以下是我想到的一些方法...

方法一:

将暴露的指针标记为只读,因此允许用户直接从内存中读取,但对于写入,我们可以暴露一个接口,该接口将是写入内存的唯一接口。由于它是我们的接口,我们可以处理应用遮罩的要求。

优点:

=> 保持实现简单。

缺点:

=> 通过限制用户写入来降低模块的可用性。

方法二:

编写一个将重载所有可能的内存访问运算符的类。像这样的东西

优点:=> 再次保持实现简单。

缺点:=> 尽管我们可以处理大多数写情况,但在以下代码片段中我们无法处理这些情况。

因此,这可能又不是一个完整的解决方案,并且实际上可能会导致任何新代码出现很多问题。

方法3:

第三种方法是将页面保护设置为 READ_ONLY 并通过信号处理程序(Linux 上的 mprotect 和 sigaction)捕获任何写入尝试,但到目前为止,我只能捕获写入调用,但还不能获取更多信息来完成写入请求. 将对其进行调查,看看是否有可能在应用掩码后捕获写入调用和写入数据。如果这是可能的,它可以是完整的解决方案。

优点:

1) 可以透明地处理写入请求,而无需使用模拟器对用户进行任何更改。

这看起来很完美,但我只能得到说存在访问冲突的中断,但我不知道如何在中断处理程序中写入数据之前实际获取正在写入的数据并应用掩码!(但我在 Linux 中尝试过,在 Windows 中没有这样做)

方法4:

有一些具有内存映射 IO 的模拟设备,任何对设备内存范围的写入都将进入我的设备驱动程序,我可以用它做任何我想做的事情。

这只是一个想法,我不确定这是否可以做到,即使做到了,也可能对我的要求有点过头了。

方法4:

为了支持像方法 3 中那样透明地读写,我们可以使用 linux 的 FUSE 框架等效于 Windows(截至目前,我得到了 DOKAN http://dokan-dev.net/en/和 CBFS http://www.eldos。 com/cbfs/)。使用它,我们可以将我们的代码作为文件系统呈现给系统,所有读写调用都将转移到用户空间中的代码,我们可以在其中随意操作数据。所以,我们的代码将有两部分,

  1. 将 flash_emulator 类公开给应用程序编写器(我们现在拥有的)的库,=> 这将在我们创建的用户空间文件系统中打开 flash 仿真文件,并执行内存映射文件 io 并将映射地址返回到用户,应用程序编写者可以使用它来执行将转换为文件系统操作(读取和写入)的内存操作。

  2. 简单的用户空间文件系统。=> 这将实现用户空间文件系统所需的基本必需接口,并在内部使用系统文件系统来实际存储文件。实现的读写操作将访问存储在磁盘上的数据。读取将像我们现在一样从文件中直接读取,但写入操作将应用掩码并写入文件系统。

优点: => 可以透明地支持所有内存操作并在后台模拟类似闪存的行为。

缺点:=> 它需要需要使用的外部框架,这将比我们编写的代码大得多。(我需要检查它们是否是免费的框架,我还不确定,如果它们不是免费的,将检查并返回)

实现用户空间文件系统只是为了具有透明的类似闪存的写入特性可能是一种矫枉过正,但如果在不影响应用程序编写器代码的情况下这样做更重要,那么这看起来是一种可能性。请让我知道您对此的看法。谢谢你。

谢谢,

微内核

0 投票
1 回答
84 浏览

c - 与其他两个进程的通信进程

我逐行阅读以下文件(file.txt):

父进程向一个进程发送负数,向第二个进程发送正数:

每个儿子都在数数,并将其显示在屏幕上。

当我执行时,我只有:

当我也期待

0 投票
3 回答
11610 浏览

c++ - sys/stat S_ISDIR(m) with struct dirent

我想检查文件是目录、链接还是普通文件。我遍历目录并将每个文件保存为struct dirent *. 我尝试传递d_inoS_ISDIR(m)S_ISLINK(m)S_ISREG(m)无论文件如何,我都不会得到肯定的结果。所以我的问题是:我如何使用S_ISDIR(m)with struct dirent

0 投票
2 回答
2033 浏览

c - 同步父子进程

我想同步父进程和子进程以交替将 1 到 10 打印到文件中。并输出哪个进程打印了这个数字。以下代码交替打印,但数字相同。请帮帮我!

0 投票
1 回答
393 浏览

reverse-engineering - PDB 文件中不存在导出的别名符号(RegisterClipboardFormat 具有 RegisterWindowMessage 内部名称)

我正在尝试在 user32 中设置断点!RegisterClipboardFormat 显然,此函数已导出(链接 /dump /exports - 它就在那里)。在从 Microsoft 符号服务器下载 PDB 文件之前,我能够找到这个函数:

没问题。我能够“购买”任何这些功能。但是当我从 Microsoft PDB 服务器下载 PDB 符号时:

WinDBG 找不到符号。但是,它可以找到 RegisterWindowMesssage:

请注意,这些函数具有相同的地址(这是在 Windows 8 上。不确定以前的版本)。这可能是通过优化器或在 DEF 文件中实现的(EXPORT 部分中的 func1=func2)。'link /dump /exports' 显示 RegisterWindowMessage 和 RegisterClipboardFormat 具有相同的 RVA。

问题是我在这上面花了太多时间。所以我的问题是:

  1. 是否有一种简单的方法,从 WinDBG 中找出丢失的别名导出符号。
  2. 假设我只想打破 RegisterClipboardFormatW。如果我没记错的话,应该有一个 JMP 指令(在调用模块导入表中)。我如何找到那个符号?有没有办法在所有调用模块中找到这个条目?
0 投票
1 回答
4607 浏览

c - (ORIG_EAX*4) 在 ptrace 调用中

我在这里浏览了一篇文章,并尝试了我在下面复制的代码片段:-

我对传递给 ptrace 调用ORIG_EAX的确切内容和原因有疑问。4*ORIG_EAX我最初假设ORIG_EAX,EBXECX将是存储寄存器值的特定结构的偏移量。

所以我决定在等待之后通过使用打印 ORIG_EAX 的值printf("origeax = %ld\n", ORIG_EAX);。值为11。所以,我之前关于偏移量的假设是错误的。

我知道wait当孩子发生状态变化(在这种情况下,发出系统调用)时调用被终止,并且 ORIG_EAX 将包含系统调用号。

但是,为什么将 ORIG_EAX * 4 传递给 ptrace 调用?

0 投票
3 回答
12747 浏览

android - 了解android内部(深入系统)

好的,伙计们,我认为这是提出问题的正确地方,因为这完全是关于发展的(如果我错了或者是重复的问题,请告诉我)。

所以,我想深入研究 Android,了解系统如何工作到内核(并了解生根和其他黑客行为背后的原因)。我应该从这里去哪里?Linux 书?虚拟机架构?

仅仅下载源代码并没有帮助,因为我不明白这一切是如何工作的。

0 投票
1 回答
37 浏览

scripting - 如何修改键盘按钮在窗口中回显到屏幕上的文本?

这背后的想法是使用组合键来回显一个非常常用的字符串。说 shift+backspace 必须回显到屏幕“谢谢”。我不知道从哪里开始,具体要做什么。我有编程经验(C/C++/Java),但我对脚本完全陌生。任何帮助或建议将不胜感激。提前致谢。

0 投票
1 回答
12602 浏览

c - 使用 sigaction(), c

我正在阅读一些内容sigaction()(来源来自我的课程笔记),但我不确定我是否理解这段文字:

仅在信号处理程序的持续时间内计算和安装信号掩码。

默认情况下,信号“sig”在信号出现时也会被屏蔽。

一旦使用 sigaction 为特定信号安装了一个动作,它就会一直保持安装状态,直到明确请求另一个动作。

这是否意味着从信号处理程序返回后恢复默认信号掩码?另外,我是否必须在使用后重新安装处理程序,就好像我正在使用一样signal()

此外,还有这段代码:

那么 - 究竟将如何SIGTERM处理?我可以看到安装的处理程序是termination handler(),但随后SIGTERM被添加到信号掩码中而没有使用sigprocmask(). 这是什么意思?谢谢!

PS最后一个问题:为什么if声明在main()