使用c++以及x86和x64体系结构访问处理器中断
Access processor interrupts with c++ and x86 and x64 architectures
我想知道是否可以从c++代码访问处理器中断(我想我需要使用汇编代码)。
事情是这样的。我习惯于使用嵌入式系统(PIC、ARM7和Atmel处理器),我可以毫无问题地对中断进行编程(我使用C)。所有寄存器都被映射,总而言之,这很容易,具体取决于应用程序。现在我正在使用x86和x64体系结构,我希望(强调want)能够在这些处理器中做同样的事情。
例如:我想让c++中的一个线程运行一个代码,在不按回车键(cin、getchar等)的情况下不断验证当前按下的键。我想编程一个定时器中断,这样我就可以在特定的时间执行操作。我知道我想做的很多事情都可以通过操作系统完成,但我真的想有自己做的自由。
目前我使用的是Linux(Ubuntu),但我肯定很快就会使用Windows,如果这是回答这个问题所需的信息,
对于用户级进程,中断由信号代替。您可以通过调用setitimer
来安排将信号发送到您的进程。但最有可能的是,做你想做的事情的最好方法是两件事之一:
-
使用事件循环。基本上,把你的程序写成一个巨大的循环,定期检查是否有什么需要做的。在循环中,检查时间,检查按键,等等。做一些你需要做的事情,然后再次循环。
-
使用螺纹。您可以有一个线程来监视时间和触发计时器作业。您可以有一个线程阻塞
read
,以便在数据到达时充当中断。
很可能你已经意识到,你在中断处理程序本身中做的工作很少,通常只是将信息传递给在正常上下文中运行的其他代码。操作系统已经为您完成了这一部分。您只需要编写等待中断处理程序(或所需的任何程序)检测并开始处理事件的代码。
我想让c++中的一个线程运行一段代码,在不按回车键(cin、getchar等)的情况下不断验证当前按下的键。
那就这么做吧。这需要一个线程,并且需要将终端的输入模式更改为不需要回车键的模式。这与中断无关。
对于Windows:
Windows在隐藏低级别硬件访问(如访问cpu中断)方面做得很好,原因是win内核使用它们在进程和其他内部事务之间切换。因此,您将需要编写一个驱动程序来获得直接的硬件访问,或者让您的代码在执行环中执行<3(用户模式)。
但出于教育目的,你可以使用DOS甚至Windows DOS窗口,甚至可以模拟中断。当然,您将使用一些编译器,如Borland C++3.x(dos 16bit)。setvect和getvect可用于中断挂接。
- vscode g++链路故障:体系结构x86_64的未定义符号
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- 如何从其他结构访问受保护的结构变量
- OSX clang++:用于 cpp 文件中显式实例化模板的体系结构x86_64的未定义符号
- PCL 出错:体系结构x86_64 @pcl的未定义符号
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 体系结构x86_64的未定义符号:链接器错误
- C++ std::vector<int> 体系结构的未定义符号 x86_64:
- 未使用的 asm() 在不受支持的体系结构上的行为
- 用于本地网络运行的客户端服务器体系结构
- 生成文件:体系结构x86_64的未定义符号
- Xcode"体系结构x86_64的未定义符号"
- 有了memory_order_relaxed,原子变量的总修改顺序如何在典型体系结构上得到保证
- 体系结构x86_64的未定义符号:找不到原因
- 在OSx:ld上使用CMake构建C++项目:找不到体系结构x86_64的符号
- 如何从类中定义的结构访问私有成员?c++
- 体系结构x86_64的未定义符号:c++/ h 文件和 cpp 文件
- 以编程方式在运行时检测 CPU 体系结构
- C++ XCODE ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -
- 使用c++以及x86和x64体系结构访问处理器中断