我想迭代内核中的所有任务(线程和进程)并使用for_each_process宏打印tid/pid和name:
#define for_each_process(p) \
for (p = &init_task ; (p = next_task(p)) != &init_task ; )
Run Code Online (Sandbox Code Playgroud)
如何区分线程和进程?
所以我会像那样打印出来:
if (p->real_parent->pid == NULL)
printk("PROCESS: name: %s pid: %d \n",p->comm,p->pid);
else
printk("THREAD: name: %s tid: %d \n",p->comm,p->pid);
Run Code Online (Sandbox Code Playgroud) 我正在尝试找到内核地址空间,我的可加载内核模块由insmod重新定位.
我开始知道通过在修改模块时使用-m,-O开关,我们只能从模块的视点看到符号表和可执行文件的部分地址,而不是它们的重定位地址,因为我们做insmod时进行搬迁过程.
任何人都可以告诉如何在内核内存中找到模块的重定位地址,即加载模块所在的内核中绑定的地址?
谢谢!
PS请注意我使用的是Redhat 2.4 Linux内核,其中/ proc/modules列表没有显示已加载模块的虚拟地址.
我是Linux的新手,我正在尝试安装AlteraQuartus 2 WEb Edition和NIOS2 EDS来使用Nios2处理器.
但是,在安装Quartus之后以及我尝试执行jtagconfig时.
即使在运行/altera/nios2eds/nios2_command_shell.sh之后,我也看不到类似下面的内容
1.)[Nios2 EDS] $ 2.)无法锁定链(端口权限不足)
请帮忙,
我正在研究一个Linux内核模块,该模块为来自定制板的中断注册回调,并将接收到的数据放在char设备接口后面的队列中,由应用程序处理.即使没有来自电路板的中断,该模块也需要不断监视和测量来自电路板的中断和数据,因此它有另一个根据时间触发的回调.
当前实现使用RTC中断作为常量定时器源.我禁用内核RTC驱动程序(CONFIG_RTC_DRV_CMOS)并请求IRQ 8并将计时器回调挂钩为RTC中断处理程序.每秒从RTC芯片产生中断.
问题是我们必须失去一些Linux以这种方式管理时间的能力,因为只能rtc-cmos同时加载一个或一个板模块(显然我们选择了板模块).
目标架构是i386 PC.
我不是内核开发人员,因此对内核模块开发没有全面了解,但我正在努力寻找自己的方式,这些是解决方案最接近的问题:
request_irq(8, rtc_handler, IRQF_SHARED, rtc_handler)?)或chainload IRQ处理程序之间共享IRQ 8 .我想可能有一种简单而标准的方法可以做到这一点,我很高兴如果有人会评论这些解决方案或建议其他解决方案.
linux interrupt linux-device-driver linux-kernel embedded-linux
我正在查看“/proc/iomem”条目并且对此有疑问。
我的 Linux PC 运行的是 Intel Xeon,系统 RAM 为 4GB。
我的系统的 /proc/iomem 条目看起来像
00000000-0000ffff : 保留 00010000-0009f3ff:系统内存 0009f400-0009ffff : 保留 000a0000-000bffff:PCI 总线 0000:00 000c0000-000c7fff : 视频 ROM 000ca000-000cbfff : 保留 000ca000-000cafff : 适配器 ROM 000cb000-000cbfff : 适配器 ROM 000cc000-000cffff:PCI 总线 0000:00 000d0000-000d3fff:PCI 总线 0000:00 000d4000-000d7fff:PCI 总线 0000:00 000d8000-000dbfff:PCI 总线 0000:00 000dc000-000fffff : 保留 000f0000-000fffff : 系统 ROM 00100000-7fedffff:系统内存 01000000-01520fa4:内核代码 01520fa5-01c0e44f:内核数据 01d56000-0201d963:内核 bss 03000000-0b0fffff:内核崩溃 7fee0000-7feeffeff:ACPI 表 7feff000-7fefffff : ACPI 非易失性存储 7ff00000-7ffffffff:系统内存 c0000000-febffffff:PCI 总线 0000:00 fec00000-fec0ffff : 保留 fec00000-fec003ff : IOAPIC 0 …
是否有任何提示或方法可以避免内核日志丢失或日志缓冲区溢出?
我通过以下代码更改将日志缓冲区大小增加到最大值。我只在高端设备上运行。但是,当我想从驱动程序获取完整日志(写入大量日志)时,我仍然看到 printk 日志有时会被删除。我将 printk 与 KERN_INFO 一起使用,通过动态调试(dprintk)启用。
我做的改变:
--- a/kernel/printk.c
+++ b/kernel/printk.c
@@ -55,7 +55,7 @@ void asmlinkage __attribute__((weak)) early_printk(const char *fmt, ...)
{
}
-#define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)
+#define __LOG_BUF_LEN (1 << 17)
Run Code Online (Sandbox Code Playgroud)
我用来写入文件的命令:
cat "/proc/kmsg">/sdcard/klog.txt
Run Code Online (Sandbox Code Playgroud)
仅在调试时,如果驱动程序的性能下降,我没关系,但是,我不想删除任何日志。我知道我们无法让工作队列/线程等待打印完成。但是,仍然有任何方法可以保证日志不会丢失。
logging linux-device-driver linux-kernel embedded-linux printk
据我所知,MISRA-C标准适用于嵌入式固件.当嵌入式Linux是您的产品平台时,您的嵌入式应用程序可以/应该开发为符合MISRA-C吗?有没有人考虑过这样的练习?
我的一般意义是你必须先了解所有"规则",然后在设计/编码阶段应用它们.可能存在需要强制符合系统调用(pthread_create)和void*的情况 - 产生难看的代码.
我正在将产品从 jffs2 文件系统迁移到 ubifs。
以前的 jffs2 设计包含 3 个 mtd 分区(2 ro 和 1 rw)。
转向 ubifs - 我应该创建:
基本上我是问在移动到 ubifs 时是否应该用卷替换分区?(我的理解是,如果这样做,ubi 层将管理整个闪存)
谢谢,冉
我正在尝试运行需要使用 ptp 获取硬件时间戳的软件。因此,我需要/dev/ptp0可用。我在 VMWare 上运行 Linux/Ubuntu。
有没有办法让它在虚拟机上工作?
谢谢!
我正在尝试使用Yocto 项目为我的嵌入式设备生成自定义 Linux 映像。
我需要向/etc/sysctl.conf生成的图像添加持久的自定义内核参数。
IE
kernel.core_pipe_limit = 1
Run Code Online (Sandbox Code Playgroud)
/etc/sysctl.conf由基础系统( )procps自带的包生成。但是,我认为在基本系统中编辑不是推荐的方法。Yoctometa/recipes-extended/procps/procps/sysctl.confsysctl.conf
我正在使用一个新层来定义我的自定义配置。我希望有一种方法可以在部署基础层后通过自定义层将补丁应用到基础包。
我怎样才能做到这一点?
我知道如何通过更新/etc/sysctl.conf(或者最好是/etc/sysctl.d/xxx.conf)来持久更改内核变量。我的问题是,如何生成应用了必要更新的 Linux 映像?
embedded-linux ×10
linux ×7
linux-kernel ×7
c ×2
embedded ×2
filesystems ×1
intel-fpga ×1
interrupt ×1
jffs2 ×1
kernel ×1
logging ×1
misra ×1
printk ×1
procps ×1
ptp ×1
ubifs ×1
yocto ×1