我试图完成PC和操作系统如何相互作用的图片.我就是这样,在设备驱动程序方面,我几乎没有猜测.
请不要写太复杂的东西,或者在使用高编程语言和winapi函数时你不需要知道.我想知道,这是出于学习目的.
因此,操作系统和PC的基本结构(通过PC我的意思当然是HW)是我看到的除了直接CPU命令之外的其他所有CPU本身可以做的事情(算术运算,其寄存器访问和内存访问) )必须通过OS.主要是因为3级环,你不能使用进出其他硬件的入口.我知道有MMIO,但必须首先通过端口通信来设置.
它不是一直这样.即使我有点年轻还记得MSDOS,我知道你可以直接访问HW,因为没有限制,没有响铃模式.所以你可以写字符串到diplay使用DOS函数,或直接访问显卡内存并自己编写.
但随着操作系统的发展,不再存在这种可能性.但它很好,因为操作系统现在处理所有的硬件通信,坦率地说,它在多任务处理环境中更方便,更安全(我会说是唯一的选择).所以现在你不是使用int指令来使用BIOS映射函数或DOS函数,而是在内部调用dll,而不是处理你不需要知道的所有内容.
我理解这一点.我还可以理解,设备驱动程序是在0级环中运行的代码段,因此它可以执行所有HW交互.但我不明白的是操作系统和设备驱动程序之间的联系.我们举一个例子 - 我想让声卡发出声音.所以我将Windows API称为访问声卡,但会发生什么?Windows是否会调用设备驱动程序?
但是,如果它确实调用了设备驱动程序,是否意味着,所有可以通过winAPI函数调用的设备驱动程序,必须具有以某种特定方式命名的例程?我的意思是,当我有新的声卡时,它的驱动程序是否必须具有与旧声卡相同的功能?那么Windows实际上可以从它的角度调用相同的函数吗?但是,如果Windows具有由设备驱动程序处理的预定义功能集,则它不能使用在最新版操作系统出现之前存在的新驱动程序.
拜托,帮我理解这个烂摊子.我真的生气了.谢谢.
驱动程序(设备驱动程序)和驱动程序堆栈有什么区别?我一直听到人们在谈论"驱动程序堆栈"但我以前从未真正听说过这个......谢谢!
在"设备管理器"中,单击特定设备将转到一个对话框,其"详细信息"选项卡显示设备的各种属性.是否有命令行工具将其转储出去?我需要区分两个设备的所有属性.
我正在研究用于Linux内核的FPGA驱动程序.代码似乎在x86上工作正常,但在x86_64上我遇到了一些问题.我实现了流式DMA.所以它就像
get_user_pages(...);
for (...) {
sg_set_page();
}
pci_map_sg();
Run Code Online (Sandbox Code Playgroud)
但pci_map_sg返回的地址就像是0xbd285800,它们没有对齐PAGE_SIZE,所以我无法发送完整的第一页,因为PCIE规范说
"请求不得指定地址/长度组合,这会导致内存空间访问跨越4 KB边界."
有没有办法获得对齐的地址,还是我错过了一些重要的东西?
我正在尝试为嵌入式Linux系统构建自定义操纵杆/游戏手柄设备.我正在寻找一个库或系统API,允许我在用户空间代码的/ dev/input中创建一个节点.
我想这是因为:
自定义硬件可以使用现有的SPI或I2C驱动程序与系统通信(这是我的硬件设计,所以我可以做任何最具技术意义的事情)
内核模块不能使用其他驱动程序,只能从其他模块导出符号
我理解制作内核模块的唯一方法是使用内核代码并将其编译为内核模块.我不是要尝试使用用户空间代码来实现内核模块.
我正在寻找一个允许我创建文件的API,当读取或写入该文件时,函数被调用.这是字符驱动程序的一般概念.我不需要内核提供或强加的特权或限制.
必须有一些方法来模拟不涉及编写全新内核模块的文件I/O.
谢谢!
我到处搜索,找不到答案.我真的想在Eclipse中使用我的Android设备.有没有人有摩托罗拉MC级手持设备的经验?有任何想法吗?
单片内核的驱动程序可以在环0,1或2中(微内核它们将在环3中 - 用户环).
将驱动程序代码放入内核0或"略少"特权环1和2中是否有任何优点/缺点?
环1和环2仍然可以访问超级用户页面,但是他们无法运行一些特殊的特权指令(如果有的话,它们会引发一般保护错误 - 就像环3一样)
以下是我的Arch linux终端上的lscpci命令的输出。我正在使用Lenovo G 50-70笔记本电脑。
[code_master5@BitBox ~]$ lspci
00:00.0 Host bridge: Intel Corporation Haswell-ULT DRAM Controller (rev 0b)
00:02.0 VGA compatible controller: Intel Corporation Haswell-ULT Integrated Graphics Controller (rev 0b)
00:03.0 Audio device: Intel Corporation Haswell-ULT HD Audio Controller (rev 0b)
00:14.0 USB controller: Intel Corporation 8 Series USB xHCI HC (rev 04)
00:16.0 Communication controller: Intel Corporation 8 Series HECI #0 (rev 04)
00:1b.0 Audio device: Intel Corporation 8 Series HD Audio Controller (rev 04)
00:1c.0 PCI bridge: Intel Corporation …Run Code Online (Sandbox Code Playgroud) 我正在编写驱动程序以创建防病毒程序。但是,我只能从进程中读取导入地址表。
我有一个CreateProcessNotify:
VOID CreateProcNotify(HANDLE ParentId, HANDLE ProcessId, BOOLEAN Create)
{
UNREFERENCED_PARAMETER(ParentId);
UNREFERENCED_PARAMETER(Create);
PEPROCESS Process;
KAPC_STATE Apc;
PVOID ModuleBase;
// From PID to PEPROCESS
PsLookupProcessByProcessId(ProcessId, &Process);
// Attach into the target process' memory
KeStackAttachProcess(Process, &Apc);
ModuleBase = GetModuleBase(Process);
PIMAGE_IMPORT_DESCRIPTOR pImportAddressTable = GetIAT(ModuleBase);
DPrint("Imports of [Meias] are: \n");
DPrint("IAT: %x\n", pImportAddressTable);
// Iterate all Modules Imports
while (pImportAddressTable->Name != 0) {
DPrint("{%s}, ", (PCHAR)((ULONG)ModuleBase + (pImportAddressTable->Name)));
pImportAddressTable++;
}
// Unattach ourselves from the target process' memory
KeUnstackDetachProcess(&Apc);
} …Run Code Online (Sandbox Code Playgroud) 我正在使用 ARM iMX6 处理器的嵌入式 Linux 设备上进行开发。主要目的是从外部源读取传入的串行流。
由于串行流的非典型性质,我在使用用于imx 处理器的Linux 串行驱动程序时遇到了一些障碍。但没有什么超出 iMX6 的能力。例如,传入的串行流是反转逻辑。iMX6 有一个特定的寄存器设置来反转 RX 信号。据我所知,Linux 驱动程序没有公开它。
另一个复杂之处是传入的串行数据以 3ms 突发的形式到达。外部源连续传输 3ms,然后 3ms 空闲,然后 3ms 数据,然后空闲,等等。为了与每个突发的第一个字节同步,能够检测线路何时空闲是非常有用的。同样,iMX6 有一个寄存器值专门用于指示 RX 线路空闲,但 Linux 驱动程序不会公开它。
我也很困惑驱动程序中的缓冲如何工作。我知道 iMX6 有一个 32 字节 FIFO 缓冲区,但我无法判断驱动程序是否使用该缓冲区或使用外部 RAM 进行缓冲。我遇到一个问题,当read我处于阻塞模式时,命令经常挂起一秒钟,而这种情况永远不会发生,因为数据流是连续的。
作为参考,以下是我在 C 代码中配置串行端口并读取 50 个字节的方法(目前我已将其更改为非阻塞):
#include <stropts.h>
#include <asm/termios.h>
#include <unistd.h>
#include <fcntl.h>
int main()
{
int fd;
struct termios2 terminal;
unsigned char v[50];
fd = open ("/dev/ttymxc2", O_RDONLY | O_NOCTTY | O_NONBLOCK );
ioctl(fd, TCGETS2, &terminal);
terminal.c_cflag |= …Run Code Online (Sandbox Code Playgroud)