Articles of 处理器

C / C ++如何在linux上获得处理器序列号

我想知道如何在GNU Linux上可靠地获得处理器序列号(PSN)。 现在我正在使用这个 #include <stdio.h> #include <cpuid.h> unsigned int level = 1; unsigned eax = 3 /* processor serial number */, ebx = 0, ecx = 0, edx = 0; __get_cpuid(level, &eax, &ebx, &ecx, &edx); // byte swap int first = ((eax >> 24) & 0xff) | ((eax << 8) & 0xff0000) | ((eax >> […]

处理器和虚拟/物理地址

简而言之,就我所了解的内存pipe理而言,处理器产生虚拟地址。 这些地址通过MMU使用每个进程的地址表转换为相应的物理地址(在需要的时候有TLB和页面错误)。 我的问题是处理器总是产生虚拟地址? 当处理器产生物理地址时,地址空间(用户/内核),处理器模式(用户/内核)和上下文(进程/系统)

多核处理器中基于轮询和中断的数据包处理方法

此查询与多核处理器中的数据包处理有关。 数据包处理可以在Linux或纯数据path中进行。 如果数据包处理应用程序在Linux上,那么它是真的,那么它必须是基于中断的数据包处理以获得高性能,但是如果数据包处理是纯数据path(没有Linux),那么应该使用轮询来获得更高的性能? 如果是,为什么/如何?

保护指令免于在用户模式下使用它

我在一篇教程中阅读了x86架构中的15条指令不允许在用户模式下使用。 我知道有一个叫做代码段寄存器的东西来跟踪当前的预取级别 我的问题是 a)在执行每个指令之前是否要检查当前运行的特权级别 ? b)如果在用户程序中存在用户模式下不能使用的指令,实际上会发生什么情况?在执行之前,CPU如何知道这一点?

用Linux中的信号屏蔽cpu可能吗? (python)

我知道你可以通过信号量来限制有限资源的使用,但是我怎样才能使它适用于CPU(或内核,如果这是一个明智的事情)。 我有一个处理器上同时运行多个线程。 但是在其中一个线程上,我想运行一段代码,在那里发送一个信号,而且我需要时间来等待信号返回的时间。 信号看起来非常失真,而过去这些信号一直很好。 我肯定硬件工作正常,所以我相信添加这些额外的线程已经使响应脉冲的时间不准确。 这是一个非常微弱的CPU。 我想尝试阻止CPU做任何事情,但检索和计时返回脉冲; 我相信这应该是可能的。 以下是我想要实现的一个简要说明: -multiple threads are running -on the thread with the pulse signaling a pulse has been sent –> stop cpu from processing other threads –> return pulse has been received –> cpu is now free to continue it's work 我将在脉冲之间插入sleep()方法,以便cpu不会被其他线程locking。 我知道信号量如何工作,问题是,我如何使它在CPU上工作?

如何添加代码到标准的信号处理程序?

我有一个C应用程序运行在Linux上,我需要添加一些代码到标准的信号处理程序。 这个想法是设置我的处理程序保存指针到标准的,并从我的代码调用保存的处理程序。 不幸的是,signal()和sigaction()都不返回指向标准处理程序的指针。 两者都返回NULL。 有没有办法做自定义处理,并继续标准处理而不删除自定义处理程序,并再次发送相同的信号?

Linux中的处理器间通信的最佳方式是什么?

我有两个CPU在芯片上,他们有一个共享内存。 这不是一个SMP体系结构。 芯片上只有两个CPU共享内存。 第一个CPU上有一个类Unix操作系统,第二个CPU上有一个Linux操作系统。 第一个CPU做一些工作,这个工作的结果是一些数据。 第一个CPU完成工作后,应该向另一个CPU说,工作完成,第二个CPU必须处理这些数据。 处理处理器间通信的方式是什么? 我应该用什么algorithm来做到这一点? 任何参考文章关于它将不胜感激。

我怎么知道我是否可以用FMA指令集进行编译?

我已经看到了关于如何使用FMA指令集的问题,但是在我开始使用它们之前,我首先想知道我能否(我的处理器支持它们)。 我发现一篇文章说我需要看(在Linux上工作)的输出: more /proc/cpuinfo 找出。 我得到这个: processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 30 model name : Intel(R) Xeon(R) CPU X3470 @ 2.93GHz stepping : 5 cpu MHz : 2933.235 size : 8192 KB physical id : 0 siblings : 4 core id : 0 cpu cores : 4 apicid […]

如何使用u-boot为ARM处理器加载应用程序

我正在用64位的Linux机器编写一个应用程序(非常简单和基本的Hello World程序)。 我使用Linero的ARMembedded式gcc工具链进行应用编译,将应用程序交叉编译到我的主板上。 有关信息,我正在使用ATMEL AT91SAM9G20处理器的FOX G20 V板。 所以,我编译我的应用程序使用: arm-none-eabi-gcc同时添加了一些选项,使我可以使用标准的C函数(如printf等)。 这编译成功,我能够获得二进制文件,准备加载到我的板上。 因此,下一步就是编译和构buildU-Boot,以便能够将我的应用程序加载到我的电路板上。 我遵循编译和构build使用 使ARCH = arm CROSS_COMPILE = $ {CC} distclean 使ARCH = arm CROSS_COMPILE = $ {CC} at91sam9g20ek_mmc_config 使ARCH =armCROSS_COMPILE = $ {CC} 通过向编译器指定arm-none-eabi-gccpath所在的位置。 这编译和build成成功。 现在我有了我的应用程序二进制文件,并且我的U-Boot已经构build好了,可以加载了,我怎样才能真正地将我的应用程序加载到电路板上? 我试图在网上按照教程,但不成功。 理想情况下,我想将我的应用程序加载到我的主板的SD卡上。 任何build议将不胜感激。

多个进程在多个fork(Linux / C)之后卡在同一个cpu上

在多核机器上,如果在同一核心上有多个进程全部满负荷,为什么CPU不自动将进程移动到新核心? 这里是一个示例程序,重现了我所看到的问题: #include <stdio.h> #include <unistd.h> #include <stdlib.h> void RunClient(int i) { printf("Starting client %d\n", i); while (true) { } } int main(int argc, char** argv) { for (int i = 0; i < 4; ++i) { pid_t p_id = fork(); sleep(3); if (p_id == -1) { perror("fork"); } else if (p_id == 0) { […]