Articles of pipe理员

强制内存分配在64位Linux上从更高地址(> 4GB)分配

这里是我想要做的:我有一个为64位Linux构build的库。 然后我创build了一个链接该库的应用程序。 我想确保在运行应用程序时,从库中分配的内存始终位于较高的位置(> 4GB)。 在Windows上,用户可以强制分配以便在testing之前从较低地址分配较高地址,在调用VirtualAlloc时指定MEM_TOP_DOWN或将以下registry值设置为0x100000: HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Memory Management \ AllocationPreference 我不知道在Linux上是否有类似的策略。 我了解Linux内存pipe理与Window不同,但是我发现了一些线索,例如使用mmap()或者链接器脚本。 但是我一直无法实现这个目标。 任何人都可以提供更多的信息? #include <sys/mman.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while (0) int main() { void *addr1=0, *addr2=0; long sz = sysconf(_SC_PAGE_SIZE); // get page […]

在自定义的linux shell中pipe道

试图实现我自己的Linux shell有一些基本的function,当然是时候实现pipe道的问题。 更具体的pipe道工作大部分,尽pipe似乎放弃了最后一个论点。 例如,如果我要运行命令 ps ax | grep ps grep命令之后的ps放在我的shell中。 所以不要像使用典型的Linux shell那样输出 339 ? S 0:00 upstart-udev-bridge –daemon 497 ? Ss 0:00 /usr/sbin/cupsd -F 503 ? S< 0:00 [kpsmoused] 720 ? S 0:00 upstart-socket-bridge –daemon 5541 pts/0 R+ 0:00 ps ax 5542 pts/0 S+ 0:00 grep –colour=auto ps 你明白了 339 ? S 0:00 upstart-udev-bridge –daemon […]

如何正确接收来自pipe道的数据?

所以我写了一个使用pipe道的程序,并且执行一些算术运算。 我不知道如何debuggingpipe道和不同的stream程,但是从我所看到的,必须与我的pipe道读取数字有关。 所以我的设置到目前为止是儿童创build,并根据他们给定的操作,他们execl的不同程序,将计算pipe道中的书面价值。 我不知道在读取结果之前,是否应该在父项中写入值,然后在父项中执行等待或什么。 我不断得到Z作为我的输出。 所以这是我execl文件之一,其他文件看起来完全一样,它只是显示其相应的操作: #include <iostream> #include <fstream> #include <cstdio> #include <cstdlib> using namespace std; main(int argc, char *argv[]) { int x, y, z; while (read(0, (char *)&x, sizeof(int)) && read(3, (char *)&y, sizeof(int))) { z = x * y; if (argc > 1) cerr << "multiply: " << x << " * […]

有没有一个标准的方法来保持修改的Linuxconfiguration文件分离和可识别?

通常我需要在/etc下编辑许多configuration文件,但是,我不希望这些更改在我执行下一次系统升级时丢失。 现在,我已经把所有的configuration文件以及我的一些维护脚本放在/opt/admin ,并且在那里安装了符号链接/etc目标,但根据我所看到的标准 ,这似乎不正确。 我想到的另一个select是把它们放在/usr/local 。 上述文件说明在本地安装软件时供系统pipe理员使用 。 这是我得到的最接近的 但是,安装新的非打包软件时, /usr/local也会被破坏。 对于如何维护这些标准,有没有一个标准/很大程度上遵循的最佳做法? 由于这不是一个讨论页面,答案应该是明确的,并有一两个文章来支持。 编辑 由于这是正确的搁置,我想我会redirect你在服务器故障类似的问题 。 似乎有两个通用的解决scheme – 使用符号链接或维护一个文件列表(请参阅ptman的链接问题的答案)。 目前,我正在使用混合解决scheme:维护configuration文件( /opt/admin/config/FILES )的列表。 脚本( /opt/admin/scripts/link-config-files.sh )创build一个/opt/admin/scripts/link-config-files.sh链接层次结构(位于/opt/admin/config )。 现在很容易从一个地方访问文件,清楚它们的位置,还有一个易于维护(不需要手动链接)的文件集中列表,而/opt/admin的简单备份包括所有configuration。 这是我的脚本 。 谢谢吉姆,你的回答。

使用fork()和C中的pipe道进行前缀符号计算,无需recursion或堆栈(HW)

我有一个任务只使用fork()和pipe()来计算前缀符号。 不允许recursion或使用堆栈。 (这个algorithm很简单) 我花了3天没有运气。 我知道fork()和pipes()是如何工作的,但是我不能像recursion一样运行它们。 我写了一个有趣的recursion函数。 int poss; //global var int prefixNotationCalc(char tokens[30][30], int start) { char * token; poss = start; int op1, op2; token = tokens[poss]; if (isOperator(token) == 0) { poss++; return atoi(token); } else { poss++; int op1 = prefixNotationCalc(tokens, poss); int op2 = prefixNotationCalc(tokens, poss); if (*token == '*') { […]

Linux内核线程地址空间

我读过linux内核线程没有自己的地址空间,他们的mm字段被设置为NULL。 我知道所有的内核线程共享地址空间,但是,他们有自己的堆栈权限? 他们需要以某种方式来描述这个领域,而没有 – 他们如何做到这一点? 和其他列表,如打开文件,他们在哪里保留它? 另外,将active_mm字段设置为上一个用户任务的要点是什么? 提前致谢。

使用Perl将压缩数据写入文件,以便以后可以解压缩(如STDIN)

我正在寻找技术的组合来创build一个压缩文件。 稍后,我想立即解压缩该文件,并通过pipe道传递给curl命令。 问题是我正在使用的代码生成一个文件,保存压缩的数据stream(而不是一个文件): my $fh = IO::Zlib->new("file.gz", "wb9"); if (defined $fh) { print $fh "some big data here!\n"; $fh->close; } 因此,我不能简单地使用zcat解压缩它: zcat file.gz zcat: can't stat: file.gz (file.gz.Z): No such file or directory 而这样做的全部原因是我希望稍后将curl命令的zcat输出redirect为STDIN: zcat file.gz | curl -X PUT -d @- http://localhost:5822/ 上面的作品,如果我创build文本文件并gzip它。 我正在寻找一个优雅的方式来从Perl做到这一点,我不需要创build临时文件,压缩它,首先删除临时文件。 这可能可以通过两种方式实现: 1)find一种方法来创build包含文件数据的压缩文件(而不是数据stream) 2)find一个Linux / Unix / OSX命令处理文件与stream压缩数据(如zcat显然不能) 将不胜感激的帮助。 双向

尝试从mm_struct-> start_code进行复制时,memcpy失败

我正在经历task-> mm指向的代码段的一些非常奇怪的行为,我希望有人能帮助我。 我正在做的是拉出代码段,并将其放入一个缓冲区,然后从中产生一个HMAC。 偶尔我会得到一个哎呀! 说不能用调用堆栈在memcpy()终止。 看来正在发生的事情是数据在复制过程中消失,并导致页面错误,然后是Ooops。 我已经search了很多关于在mm_struct中使用的这个看似短暂的内存的引用,但是什么都没find。 我不相信我在代码中做任何有争议的事情; 这里是简短的删除评论等。 struct mm_struct* __mm; … __mm = get_task_mm(__task); if(likely(__mm)) { __buflen = (__mm->end_code – __mm->start_code); if(likely(__buflen > 0)) { __buf = (unsigned char*)__get_buffer(__buflen); if(likely(__buf)) { preempt_disable(); memcpy(__buf, (uint8_t*)__mm->start_code, __buflen); preempt_enable(); mmput(__mm); if(unlikely(!__do_ntru_hmac(__buf, __buflen, __hmac))) { __retcode = 0; } __release_buffer(__buf, __buflen); } else { printk(KERN_ERR "[%s] Buffer […]

如何在linux内核中发生页面错误?

我正在研究一个需要在Linux内核中进行大量修改的项目。 在其中一个修改中,我必须改变页面error handling程序的工作方式。 我想要拦截特定进程的页面错误,并通过从另一台机器上复制数据来满足这些错误。 作为第一步,我想写一些实验代码,可以帮助我理解Linux如何满足页面错误,以及它如何告诉过程现在无法提供页面错误,并且需要在晚点。 所以,我想修改handle_mm_fault ,这样可以帮助我理解上述所有情况。 像这样的东西: int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long address, unsigned int flags) { /* some code */ if(current->pid == my_target_pid) { /* 1. Chose randomly between 1 and 2 -> rand_num 2. if rand_num from (1) is 1 then allocate a block of memory, write 'X's […]

释放物理内存页面并强制页面错误

我想编写一个内核函数/模块,它将复制特定进程中的特定页面,然后释放该特定页面。 然后,模块/函数将执行任何必要的操作,以在下一次引用页面时强制该过程成为页面错误。 然后页面错误将使用保留在一边的副本服务。 我可以使用vm_operations_struct或通过修改内核中的handle_mm_fault函数来拦截页面错误。 我不知道该怎么办是释放页面,并强制该过程成为页面错误。 这是计划的testing,将详细解释我想要做什么: 开始一个testing过程,挂起它并把它的pid传递给内核模块/函数。 内核函数将使用pid来获取指向该进程的mm结构体的指针。 然后,内核函数从进程中select一个页面(比如一个堆页),将其复制到另一个页面,然后将该vm_area_struct的vm_ops指针分配给我自己的vm_operations_struct 。 内核函数然后释放页面并从cpu刷新它。 内核函数然后发送一个SIGCONT到进程。 一旦该过程恢复,将会遇到页面错误。 页面错误将被使用vm_ops指针拦截,这将调用我的函数来服务页面错误。 我的error handling程序将使用重复页面来处理页面错误。 我的问题是关于粗体的步骤。 我需要弄清楚如何做到这一点。 任何想法? 谢谢。