Articles of linux kernel

Linux内核线程地址空间

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

rawsocket sendto()的一些数据包被丢弃,在networking中看不到

socketFd_ = socket(AF_INET, SOCK_RAW, protoType); sentBytes = sendto(socketFd_, buf, len, 0, (struct sockaddr *)&sa,sizeof(structsockaddr_in)); protoType = GRE 我正在networking中发送1000个数据包。 如果我的tx数据包速率是40,我能看到wireshark中的所有数据包。 然而,当我将尝试以100的速率发送一些数据包(3-4)不会在networking中达成,但sendto没有返回任何错误。 我知道sendto只是把txpacket放入队列中,不能保证在networking中传送数据包,但是从那里我可以得到丢包的统计数据和内核丢包的原因。 我曾尝试增加界面的txqueuelen到65000,但它没有帮助。 我怎么能debugging这个问题?

在中间节点重新组装

我有以下要求, 我有一台直接连接到embedded式主板的Linux PC。 Linux PC从互联网接收IPstream量 – 需要将其转发给embedded式主板。 但是embedded式板卡不具备重组IP片段的能力。 目前我们所做的是在linux pc上收到重组的数据包,然后sendto()到emmbeded板。 但是,由于stream量的高负载,这会消耗Linux PC中太多的CPU周期 – 因为这会从内核空间复制到用户空间,并且同样的数据包会从用户空间复制到内核空间。 有没有一种方法让内核重新组装并将IP转发到embedded式主板,而不必将数据包传送到用户空间? 注意:我可以灵活地将IP数据包的目标IP作为Linux PC或embedded式板卡。 谢谢

尝试从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 […]

我怎样才能使用vm_operations结构来拦截页面错误的特定页面?

我想创build一个内核模块,当给定一个进程的ID可以查找其任务结构,然后它的内存映射。 当它发现它应该附加一个将页面错误提供给一组特定页面(即堆页)的函数。

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

我想编写一个内核函数/模块,它将复制特定进程中的特定页面,然后释放该特定页面。 然后,模块/函数将执行任何必要的操作,以在下一次引用页面时强制该过程成为页面错误。 然后页面错误将使用保留在一边的副本服务。 我可以使用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程序将使用重复页面来处理页面错误。 我的问题是关于粗体的步骤。 我需要弄清楚如何做到这一点。 任何想法? 谢谢。

dpkg –list不显示已安装的内核版本

我使用内核3.13运行Ubuntu 14.04 我正在关注eudyptula的挑战,它要求我从linus的git下载内核源代码,然后构build,安装,我现在有两个内核,3.13和3.15。 我想validation安装,并在某个网站上阅读dpkg –list | grep linux-image会给我所有安装的内核列表,但我只得到3.13。 我目前启动3.15 terminal输出如下: ashish@ashish-PC:~$ uname -r 3.15.0-07913-g64b2d1f ashish@ashish-PC:~$ dpkg –list | grep linux-image ii linux-image-3.13.0-24-generic 3.13.0-24.46 amd64 Linux kernel image for version 3.13.0 on 64 bit x86 SMP ii linux-image-extra-3.13.0-24-generic 3.13.0-24.46 amd64 Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP ii linux-image-generic 3.13.0.24.28 amd64 […]

Linux内核中的FPU使用

如果Linux softirq正在通过中断Linux内核模式运行,并且中断的任务正在使用FPU,则不允许在softirq中使用FPU。 如果被中断的任务是用户模式进程,则仍允许在softirq中使用FPU,但不能中断内核模式。 下面讨论代码。 问题是,为什么如此? static inline bool interrupted_kernel_fpu_idle(void) { return !__thread_has_fpu(current) && (read_cr0() & X86_CR0_TS); }

针对时间敏感的应用程序的分析方法

我正在embedded式Linux环境中debugging与Zigbee设备的配对/绑定有关的高度时序敏感问题。 我们的架构是通过SPI接口从Zigbee前端模块读取数据,然后从内核空间传递到用户空间进行处理。 然后将处理后的数据和响应传回内核空间,再次通过SPI接口输出。 Zigbee 802.15.4的时序要求规定我们需要在19.5ms内响应,而且我们经常会遇到这样的情况:我们只是在这个窗口之外响应,导致networking出现故障和丢包。 Linux内核没有启用先占权运行,也可能无法启用先占权。 我怀疑是因为内核不能抢占,所以还有另一个使用ioctl()接口的任务/进程,这足以让超过19.5ms的窗口足够长的Zigbee应用程序。 我已经尝试了以下工具 oprofile – 在这里没有太多的帮助,因为它剖析整个系统,在这段时间内应用程序实际上并不是非常繁忙,因为它移动了如此less量的数据 strace – 开销太多,我没有太多的经验,所以也许输出可以被改进。 开销会影响性能,所以应用程序根本就没有function 有没有其他轻量级的方法来分析这样的系统? 有没有办法赶上一个ioctl的呼叫挂在另一个任务/线程? (假设这是问题的根源)

为什么.bss部分映射到比目标文件中报告的bss小的进程?

我总是假定链接器分配了任何库的bss部分并将其映射到进程中。 这部分的大小将取决于图书馆报告的bss的大小。 我查看了进程的/ proc / [PID] / maps文件,并计算了加载库的bss部分的大小。 7f1f5561f000-7f1f55637000 r-xp 00000000 08:01 3018048 /usr/lib/libpthread-2.19.so 7f1f55637000-7f1f55837000 —p 00018000 08:01 3018048 /usr/lib/libpthread-2.19.so 7f1f55837000-7f1f55838000 r–p 00018000 08:01 3018048 /usr/lib/libpthread-2.19.so 7f1f55838000-7f1f55839000 rw-p 00019000 08:01 3018048 /usr/lib/libpthread-2.19.so 7f1f55839000-7f1f5583d000 rw-p 00000000 00:00 0 7f1f5583d000-7f1f55851000 r-xp 00000000 08:01 3017945 /usr/lib/libresolv-2.19.so 7f1f55851000-7f1f55a50000 —p 00014000 08:01 3017945 /usr/lib/libresolv-2.19.so 7f1f55a50000-7f1f55a51000 r–p 00013000 08:01 3017945 /usr/lib/libresolv-2.19.so […]