标签: embedded-linux

for_each_process - 它是否迭代线程和进程?

我想迭代内核中的所有任务(线程和进程)并使用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)

c linux linux-kernel embedded-linux

7
推荐指数
1
解决办法
3730
查看次数

查找可加载内核模块的内核地址

我正在尝试找到内核地址空间,我的可加载内核模块由insmod重新定位.

我开始知道通过在修改模块时使用-m,-O开关,我们只能从模块的视点看到符号表和可执行文件的部分地址,而不是它们的重定位地址,因为我们做insmod时进行搬迁过程.

任何人都可以告诉如何在内核内存中找到模块的重定位地址,即加载模块所在的内核中绑定的地址?

谢谢!

PS请注意我使用的是Redhat 2.4 Linux内核,其中/ proc/modules列表没有显示已加载模块的虚拟地址.

linux kernel kernel-module linux-kernel embedded-linux

7
推荐指数
2
解决办法
8038
查看次数

无法锁定链(​​端口权限不足)

我是Linux的新手,我正在尝试安装AlteraQuartus 2 WEb Edition和NIOS2 EDS来使用Nios2处理器.

但是,在安装Quartus之后以及我尝试执行jtagconfig时.

即使在运行/altera/nios2eds/nios2_command_shell.sh之后,我也看不到类似下面的内容

1.)[Nios2 EDS] $ 2.)无法锁定链(​​端口权限不足)

请帮忙,

linux embedded embedded-linux intel-fpga

7
推荐指数
2
解决办法
6498
查看次数

如何在linux内核模块中添加peridic计时器回调

我正在研究一个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 .
  • 找到另一种方法将处理程序从内核模块挂钩到RTC中断,而不是注册IRQ 8.
  • 找到可以在内核模块中使用的另一个1秒定时器事件源,可能有一个标准的内核API,我不知道.

我想可能有一种简单而标准的方法可以做到这一点,我很高兴如果有人会评论这些解决方案或建议其他解决方案.

linux interrupt linux-device-driver linux-kernel embedded-linux

7
推荐指数
1
解决办法
7803
查看次数

理解/proc/iomem

我正在查看“/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 …

linux linux-kernel embedded-linux

7
推荐指数
1
解决办法
2万
查看次数

如何避免 Linux 内核中 printk 日志丢失

是否有任何提示或方法可以避免内核日志丢失或日志缓冲区溢出?

我通过以下代码更改将日志缓冲区大小增加到最大值。我只在高端设备上运行。但是,当我想从驱动程序获取完整日志(写入大量日志)时,我仍然看到 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

7
推荐指数
2
解决办法
1万
查看次数

MISRA-C是否适用于Linux应用程序

据我所知,MISRA-C标准适用于嵌入式固件.当嵌入式Linux是您的产品平台时,您的嵌入式应用程序可以/应该开发为符合MISRA-C吗?有没有人考虑过这样的练习?

我的一般意义是你必须先了解所有"规则",然后在设计/编码阶段应用它们.可能存在需要强制符合系统调用(pthread_create)和void*的情况 - 产生难看的代码.

c embedded misra embedded-linux

7
推荐指数
2
解决办法
1768
查看次数

ubifs 卷与 mtd 分区

我正在将产品从 jffs2 文件系统迁移到 ubifs。

以前的 jffs2 设计包含 3 个 mtd 分区(2 ro 和 1 rw)。

转向 ubifs - 我应该创建:

  • 1 个 mtd 分区和 3 个卷
  • 3 个 mtd 分区,每个分区 1 个卷

基本上我是问在移动到 ubifs 时是否应该用卷替换分区?(我的理解是,如果这样做,ubi 层将管理整个闪存)

谢谢,冉

filesystems linux-kernel embedded-linux ubifs jffs2

7
推荐指数
1
解决办法
2977
查看次数

如何在运行 Linux 的 VM 上获取 /dev/ptp0 ptp 硬件时钟?

我正在尝试运行需要使用 ptp 获取硬件时间戳的软件。因此,我需要/dev/ptp0可用。我在 VMWare 上运行 Linux/Ubuntu。

有没有办法让它在虚拟机上工作?

谢谢!

linux linux-device-driver embedded-linux vmware-player ptp

7
推荐指数
2
解决办法
8652
查看次数

将新的内核参数添加到 Yocto 生成的自定义 Linux 映像中

我正在尝试使用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 映像?

linux linux-kernel embedded-linux procps yocto

7
推荐指数
1
解决办法
4555
查看次数