Articles of 指针

x86_64程序集execve * char 系统调用

我试图进入一些Linux 64位x86程序集,而不使用标准的库,但是我有一些问题处理提交给我的程序(argv)的参数。 我会认为(基于文档) rsp标志着argc qword的开始,而[rsp + 8]将是argv。 不幸的是,情况并非如此,下面的(删节的)程序会导致EFAULT (Bad address) 。 sys_execve equ 59 sys_exit equ 60 section .data child db "/bin/sh", 0 global _start section .text _start: mov rdi, child ; #1 filename mov rsi, [rsp + 8] ; #2 argv mov rdx, 0 ; #3 envp = 0 mov rax, sys_execve ; execve […]

如何获得Linux内核的时间戳?

int netif_rx(struct sk_buff *skb) { if(skb -> stamp.tv_sec ==0) do_gettimeofday(&skb->stamp); } 上面的api是接收方api,它从发送方接收数据。 我想计算一下接收数据的时间并将其存储在缓冲区中。 在2993行的上面的api可以在内核源代码中find:/linux/net/core/dev.c 但我得到错误:作为结构sk_buff没有成员命名邮票。 http://lxr.free-electrons.com/source/include/linux/skbuff.h有人可以帮我:如何获得Linux内核的时间戳。 后来我把我的代码改为: int netif_rx(struct sk_buff *skb) { if(skb -> tstamp.off_sec ==0) do_gettimeofday(&skb->tstamp); } 现在我得到的错误是:ktime_t没有名为“tv_sec”的memeber。 结构timeval但参数的typesunio ktime_t。

使用Ptrace来跟踪正在打开的文件的位置

我正在使用下面的代码,每当打开一个系统调用被调用时,它实际上会让我得到寄存器(eax,ebx,ecx)中的内容。 经过很多的斗争,我明白了这个问题的价值。 ebx包含指向文件名的指针。 但是当我尝试访问它时,我得到了一个分段错误。 我哪里错了? 代码可以从这里访问

lmbench如何用C测量L1和L2caching的等待时间? (在手册中不能理解说明)

我想了解lmbench如何测量L1,L2和主内存的延迟。 lat_mem_rd的手册页提到了这个方法,但是我不清楚: 基准运行为两个嵌套循环。 外部循环是步幅大小。 内部循环是数组大小。 对于每个arrays大小,基准testing会创build一个指向前进一步的指针环。 遍历数组是由 p =(char **)* p; 在for循环中(for循环的头部不重要;循环是展开循环1000加载长)。 循环完成一百万次加载后停止。 你如何“创造一个指向前进的指针环”? 这是不是意味着如果stride的大小是128字节,你需要build立一个链接列表,每个节点与前一个节点相距128字节? malloc只是返回一些随机的免费内存,所以我不明白在C中是如何可能的。而在这段代码中,我总是会遇到分段错误。 (testing过了,p应该用什么初始化?) SO( 链接 )上有一个类似的线程,第一个答案讨论了这个问题,但是它没有提到如何使用链表来描述链表。 我也看了看源代码本身(lat_mem_rd.c),但是也不能理解这个。 任何帮助表示赞赏。

如何通过一个mmap映射内存指针来立即刷新写入?

在双ARM处理器系统(准确地说是Xilinx Zynq)上使用/ dev / mem和mmap时,我看起来像是一个caching问题。 我的configuration是不对称的,一个处理器运行Linux,另一个处理器运行裸机应用程序。 它们通过不在Linux虚拟内存空间的RAM块进行通信(它被devicetree文件排除)。 当我的用户空间Linux应用程序使用从mmap()返回的指针写入内存时,第二个处理器可能需要从100 ms到超过一秒的时间才能检测到已更改的内存内容。 在对/ dev / mem的open()调用中,我试图指定O_RDRW,O_SYNC和O_DIRECT,但是O_DIRECT导致打开失败,所以我删除了O_DIRECT。 我认为O_SYNC应该保证在write()调用返回之前将数据写入内存,但是我使用内存指针而不是通过write()写入。 在mmap()调用中,我看不到任何可能解决caching问题的参数。 我已经尝试在写入内存后调用fsync(fd)和fdatasync(),但是这并没有改变行为。 什么DID似乎工作是在内存写入后立即产生这个命令:sync; 回声3 / proc / sys / vm / drop_caches 通过映射的内存指针立即刷新写入最简单的方法是什么?

Linux内核代码中的“current”

当我正在浏览下面的Linux字符驱动程序代码块时,我发现printk的结构指针是current的。 我想知道current指向什么结构及其完整的元素。 这个结构的目的是什么? ssize_t sleepy_read (struct file *filp, char __user *buf, size_t count, loff_t *pos) { printk(KERN_DEBUG "process %i (%s) going to sleep\n", current->pid, current->comm); wait_event_interruptible(wq, flag != 0); flag = 0; printk(KERN_DEBUG "awoken %i (%s)\n", current->pid, current->comm); return 0; }

如何在C上设置鼠标光标位置?

我如何在Linux下使用C程序在X窗口中设置鼠标光标的位置? 谢谢:)(如WIN中的setcursorpos()) 编辑:我试过这段代码,但不起作用: #include <curses.h> main(){ move(100, 100); refresh(); }

是否有可能从应用程序访问内存到另一个? 怎么样?

标题有点困惑。 但是,我试图做的是一些事情: 我有一个应用程序中的button(来自TButton类Button1)。 我想获得这个button的指针值,并从第二个应用程序检查它的属性。 有人可以说是否有可能? 如果不是,解释为什么? 韩国社交协会。 重新开放,因为我在互联网上获得其他信息。 如果我使用的东西? ReadProcessMemory 示例: http : //www.codeproject.com/KB/threads/int64_memsteal.aspx http://forum.cheatengine.org/viewtopic.php?p=4150408&sid=2358f118bab9f54b032d99377aed0545

使用MapViewOfFile,指针最终走出内存空间

所有, 我正在使用MapViewOfFile在内存中保存文件的一部分。 有一个stream指向这个文件,并写入它,然后倒带。 我使用指向映射文件的开始的指针,并阅读,直到我得到作为最终字符的空字符。 int fd; yyout = tmpfile(); fd = fileno(yyout); #ifdef WIN32 HANDLE fm; HANDLE h = (HANDLE) _get_osfhandle (fd); fm = CreateFileMapping( h, NULL, PAGE_READWRITE|SEC_RESERVE, 0, 4096, NULL); if (fm == NULL) { fprintf (stderr, "%s: Couldn't access memory space! %s\n", argv[0], strerror (GetLastError())); exit(GetLastError()); } bp = (char*)MapViewOfFile( fm, FILE_MAP_ALL_ACCESS, 0, […]

获取进程的基地址

我想访问一个进程的某个地址。 但为此,我需要首先获取进程的基地址。 我正在使用一个工具,看看我是否真的做对了。 该工具显示我需要以下内容: "app.exe"+0x011F9B08 = 0x119F8300 我以为我可以通过OpenProcess()获得进程的基地址,但是这给了我: 0x0000005c作为结果。 我不认为这是对的? 至less,不是我所需要的。 我认为我需要的基地址是: 0x119F8300 – 0x011F9B08 = 0x107FE7F8 <– base? 这是我的代码: hWindow = FindWindow(NULL, lpWindowName); if(hWindow) { GetWindowThreadProcessId(hWindow, &dwProcId); if(dwProcId != 0) { // hProcHandle -> 0x0000005c hProcHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcId); } else { return 0; } } 我怎样才能得到我打开过程的基地址?