草庐IT

c - Hook SIGSEGV 时强制内核转储进程

我为一个RAM值非常有限的系统编写应用程序。由于应用程序崩溃总是可能的,并且它使用动态内存分配,我为应用程序可以停止的所有可能方式创建了回调,并在那里清理所有缓冲区,如下所示:sigaddset(&sigact.sa_mask,SIGSEGV);sigaction(SIGSEGV,&sigact,(structsigaction*)NULL);它会触发一些通知操作并多次尝试自行重启。但我仍然想知道是什么导致了崩溃,所以我需要crashdump。GDB不适合这么小的系统,只有内核级核心转储是可能的。但是由于应用程序拦截了这样的信号并最终自行退出,内核没有收到信号-没有创建核心。我发不了k

linux - Linux 是如何记住它的内核堆栈指针的?

我知道Linux中有两种类型的堆栈:每个用户线程的用户堆栈和内核线程的内核堆栈(但1个进程)。中断,更准确地说,中断程序,是这两种模式(内核(0)和用户(3))之间的桥梁。中断向量表让处理器在PC寄存器中加载正确的指令地址,但是当它切换到内核模式时堆栈指针寄存器是如何改变的呢?子程序是否在其第一条指令之前指示内核堆栈在哪里?或者处理器是否使用了两个堆栈指针寄存器(我真的很怀疑)?“从中断返回”如何知道返回哪里?PCB是保存在内核堆栈中还是其他地方?如果我说的是真的,请不要犹豫,纠正它。非常感谢您的帮助。 最佳答案 Linux内核中的

c - 为什么更新大数组会使 "change_protection"内核调用支配 CPU?

这里是代码gcctest.c-std=c99#include#includevoidmain(){size_tsize=(long)40*1024*1024*1024;int*buffer=malloc(size*sizeof(int));for(size_ti=0;i一口气分配160Gram,遍历两次第一个循环运行愉快但是程序有点卡在第二个循环中用perftop显示这个Samples:7Mofevent'cpu-clock',Eventcount(approx.):1412784969874.95%[kernel][k]change_protection23.52%[kernel][

c - linux 用户级(pthread)线程是否在多个内核上运行?

我知道有:1)用户级线程-在进程的相同地址空间内,但具有不同的堆栈。2)内核级线程-在内核内存堆栈中(我在这里猜测)。所以当我创建用户级线程时,内核并不知道它们[1].那么内核如何知道,如何在不同的内核中调度不同的用户级线程。这个问题是关于pthread的。如果pthread是用户级线程,怎么跑在多核上?future的答案寻求者阅读:(感谢所有贡献者)1)Ziffusion的回答(下)2)DavidSchwartz'sanswer3)Tutorialpointlink 最佳答案 SoWhenIcreateuserlevelthrea

linux - 为什么 docker 不能运行早于 3.10 的内核?

Docker通常不能在早于3.10的Linux内核上运行。(在某些情况下,它也可以在3.8内核中运行)。旧内核缺少新内核的哪些功能会阻止docker在其中运行? 最佳答案 A3.10LinuxkernelistheminimumrequirementforDocker.Kernelsolderthan3.10lacksomeofthefeaturesrequiredtorunDockercontainers.Theseolderversionsareknowntohavebugswhichcausedatalossandfreque

c - 为多功能 i2c 设备编写内核模块 - 一个还是多个?

我有一个i2c设备,内置在我正在为其开发的板中。它响应单个地址,但第一个字节(有时称为“命令”或“寄存器”)指示所寻址的功能。我可以通过i2cset/get/detect使用用户空间的设备,所以我知道一切正常。设备控制LED(因此应该出现在/sys/class/leds中)。它还有GPIO(因此应该出现在/sys/class/gpio中)。还有六个不同的地方应该显示设备的部分功能。我应该将其编码为:一个i2c客户端模块,并找到一种方法将内容列在/sys中的正确位置。一个平台模块和许多驱动程序模块,它们都(以某种方式)在特定功能的位置共享单个i2c设备及其模块代码。(这是我自late-2

linux - 为 Linux 内核启动时间优化计时

我正在尝试优化linux在嵌入式设备(而非PC)上的启动时间目前正在分析启动顺序,我已在printk日志上启用时间信息。这是最优的方式吗?如果不是,我如何以最小的开销分析启动顺序(带时序)?附言:我在串行连接上有一个(设备的)终端&我在windows-XP上使用TeraTerm来访问它。 最佳答案 printktiminginfo的开销很小。但是,此信息并不总是有用,因为它不会告诉您用户空间中发生了什么。您可能想试试Bootchart。它是一个shell脚本,在启动期间在后台运行并从/proc收集数据。虽然它比printk计时信息的

Linux 内核 dentry 和 inode

是否可以从给定的dentry和inode构造绝对路径?谢谢大家 最佳答案 如果你有一个structpath(或者可以构造一个),看看tomoyo是如何做到的:http://lxr.linux.no/linux+v2.6.37/security/tomoyo/realpath.c#L86 关于Linux内核dentry和inode,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/46

linux - 在内核模块中创建以太网数据包并发送

我需要创建一个以太网数据包并将其发送到我的内核模块中。有人可以帮我做这个吗?我想我需要使用dev_alloc_skb创建一个skb,然后我需要编写mac_ethernet,插入数据并使用dev_queu_xmit发送它。但我不确定这是否有效,或者它是否是正确且最简单的方法。最好的问候编辑1:intsendpacket(){unsignedchardest[ETH_ALEN]={0x00,0x25,0x22,0x05,0xF3,0xF0};unsignedcharsrc[ETH_ALEN]={0x90,0xE6,0xBA,0x48,0x7C,0x87};structsk_buff*skb

linux - 如何更新/检查ubuntu内核配置?

我刚接触Linux,现在想在我的笔记本电脑中尝试一下。官方教程说你需要在一台机器上安装Docker。您的内核应该支持内存和交换记帐。确保在Linux内核中打开以下配置:配置资源计数器=Y配置存储器=Yconfig_memcg_swap=yconfig_memcg_swap_enabled=yconfig_memcg_kmem=y我刚安装了Ubuntu14.04,不知道上面的配置是否已经打开,如何检查?如果有些仍然关闭,如何打开它们? 最佳答案 正如其他评论者指出的,配置选项列表可以在单节点Docker入门指南中找到:https://