我的第一个问题是;通常我可以通过几次搜索找到答案,但这次不行。
我想编写一个在启动时运行的脚本,以检查外部显示器是否连接到笔记本电脑。
我想用 python 编写脚本。
我使用的是 32 位 Ubuntu 10.04。我四处搜寻但找不到任何有用的东西。有什么建议吗?谢谢
您将使用什么指令来写入/读取 x86 汇编中的硬件?我需要编写一个驱动程序(我熟悉总线端口等)。
我有这些相关问题:
有谁知道操作系统如何了解主板上连接的所有硬件?(我想这被称为“硬件枚举”)。
它如何确定特定 IO 地址上驻留的硬件类型(即:串行或并行或任何控制器)?
如何编写一个系统模块来完成这项工作?(假设尚未加载操作系统,仅加载 BIOS)。
我知道 BIOS 只是一个验证和一个用户友好的界面,用于在启动时配置硬件,之后对于大多数现代操作系统(win、Linux 等)没有真正的用途。此外,我知道对于 BIOS,找到所有硬件应该不难,因为它是由主板制造商专门调整的(谁知道有关它的一切!)。但对于 BIOS 之上的操作系统或应用程序来说,情况就完全不同了。正确的?
我读到每个PCI设备功能都有一组称为配置空间的寄存器,这个配置空间有256字节长。您可以使用以下两个端口映射的 I/O 地址来访问这些寄存器:
CONFIG_ADDRESS 0x3f8
CONFIG_DATA 0x3fc
Run Code Online (Sandbox Code Playgroud)
我的问题是,configuration space寄存器是否也映射到内存空间或IO空间?或者访问它们的唯一方法是通过0x3f8和0x3fc?
TMP102 芯片(http://www.ti.com/lit/ds/symlink/tmp102.pdf)可以有多个 I2c 从地址。它有一个名为 ADD0(第 5 节)的地址引脚,可用于选择多个地址(第 7.3.4 节)。该引脚的逻辑电平可用于选择特定的 TMP102 从设备。根据表4,可能有4个地址。我确实知道将引脚连接到高电压或低电压会产生两个不同的地址。但表中提到我们可以将 SDA 和 SCL 引脚用于两个不同的地址。我不确定这是如何运作的。谁能解释一下如何使用它以及我们如何使用基于 SDA 和 SCL 引脚的多个 TMP102 器件。
我正在编写一些汇编 BIOS 代码,通常我们使用中断来访问磁盘功能。我们给出命令,例如寻找该扇区读取字节等,但是磁盘如何知道它是否是第一个扇区,同样,当 cd/dvd 从随机位置插入 CD 驱动器时,cd/dvd 如何识别扇区。是否有与这些硬件中的扇区相关的任何类型的标识号?
我用C++编写了测试代码:
void handler()
{
std::cout << "allocation failed" << std::endl;
std::set_new_handler(nullptr);
}
int main()
{
size_t allocations_count = 0u;
std::set_new_handler(handler);
try {
while (true) {
new char[1024u * 1024u * 1024u];
++allocations_count;
}
} catch (const std::bad_alloc& e) {
std::cout << e.what() << '\n';
}
std::cout << "allocated " << allocations_count << " GB" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
在我的 8GB RAM 机器上,我得到了输出:
BigAllocations(5125,0x1050e7d40) malloc: can't allocate region
:*** mach_vm_map(size=1073741824, flags: 100) failed (error code=3)
BigAllocations(5125,0x1050e7d40) malloc: *** set a breakpoint in …Run Code Online (Sandbox Code Playgroud) 在PC(程序计数器)寄存器发生变化的所有可能性中,我发现了这些:
1) PC increases its value with loading new instruction
2) with jumps and branches
3) with calling subroutine
4) with return from subroutine
Run Code Online (Sandbox Code Playgroud)
这些都是我遗失的东西吗?
我来自这篇文章.
想象一下,我们有一台计算机,除了从网络等待数据外什么都不做,并在收到数据时进行计算.
现在我认为除了定期检查一些指示数据准备就绪然后进行计算的处理器寄存器之外,没有别的方法可以做到这一点.在我的理解下,网卡接收数据,把它放到内存中,并自己写入cpu寄存器,cpu可以做计算.在下一次定期检查后,处理器将计算内容.您能否详细解释实际发生的事情(在硬件和操作系统中).这个问题让我担心多年了!
也很高兴看到有关它的任何材料!
在我迄今为止学到的关于分割的内容中:
所以,我的问题是:
基于我所读到的内容,虚拟地址被加载到段寄存器中,然后以某种方式从那里继续转换.在将虚拟地址加载到其中以获取描述符后,段寄存器会发生什么?
据我了解,段寄存器还包含描述符的缓存值.这在翻译过程中如何发挥作用?
系统如何确定要加载哪个段寄存器,假设段选择器最多可以有2 ^ 13个不同的值且只有6个主寄存器?