12

我正在查看一些指针以了解 Linux 内核如何实现各种硬件时钟的设置。这基本上与设置 LCD、UART 等硬件功能将使用的各种时钟有关。例如,当 Linux 启动时,它如何处理设置 UART 或 USB 的时钟。也许像时钟管理器之类的东西。

我基本上是在尝试在我正在开发的新硬件上为不同的操作系统实现类似的东西。任何帮助将非常感激。

[编辑]
感谢您的回复和链接。所以这是我到目前为止所实施的。这应该让你知道我要去哪里。

我查找了我所针对的特定系统的硬件参考手册,并编写了一些代码来监视/修改我感兴趣的外围设备的信号/引脚,即从命令行打开/关闭它们。现在这些集合时钟/信号一起控制外围设备。HRM 会说,如果你想打开 UART 或其他东西,那么就打开这样那样的信号/引脚。@BjoernD 是的,我正在使用类似 mmap() 的函数来与外围设备通信。

我的问题的核心是我想了解使用我已经编写的实用程序的时钟/外设管理器的设计和实现。这个时钟/外设管理器可以让我控制启用/禁用我想要的外围设备。基本上,这个管理器将使我能够对正在运行的初始化代码进行更改。此外,在运行时进程可以调用此管理器来打开/关闭设备,从而优化功耗。这可能没有完全的意义,但我自己正试图解决这个问题。

现在我确信这样的事情会在 Linux 或任何操作系统中实现性能问题(没有人愿意通过在启动时打开所有外围设备来浪费电力)。我想了解它的软件架构。到目前为止,来自任何操作系统的引用都至少可以抢占先机。此外,我不是在编写自己的操作系统,有一个操作系统,但我更多地关注板级软件,即 BSP 来工作。但是无论如何感谢操作系统链接,它们真的很棒。欣赏它。

谢谢!

4

2 回答 2

6

您想要实现的目标与 a) 您正在使用的平台和 b) 您想要使用的设备高度相关。例如,在 x86 上,有 3 种方式与设备通信:

  1. 中断允许设备向 CPU 发出信号。操作系统通常提供注册中断处理程序的机制——在发生中断时调用的函数。在 Linux 中查看 request_irq() 和 linux/include/interrupt.h 中的朋友
  2. 内存映射 I/O 是设备的物理内存,平台的 BIOS 以与访问普通物理内存相同的方式提供设备的物理内存 - 只需写入内存地址即可。这种内存背后的确切内容(例如,网络接口配置寄存器或 LCD 帧缓冲区)取决于设备,通常在设备的数据表中指定。
  3. 通过特殊地址空间和特殊指令(INB/OUTB & co.)访问 I/O 端口。除此之外,它们的工作方式类似于 I/O 内存。

有多种方法可以找出设备提供的资源以及 BIOS 映射它们的位置。一些平台使用 ACPI 表(谷歌自己了解 1,000k 页规范),PCI 通过 PCI 配置空间以标准化方式提供有关设备的信息,USB 具有类似的发现连接到总线的设备的方法,以及一些设备,例如 UARTS , 被简单地指定为在为您的平台固定的预配置 I/O 范围内可用。

作为了解 Linux 的开始,我推荐“了解 Linux 内核”。有关 Linux 如何处理设备以及编写驱动程序的详细信息,请查看Linux 设备驱动程序。此外,您需要了解您的平台和您想要驱动的设备的特性。

如果您想启动自己的操作系统,UART 肯定对打印调试输出非常有帮助,因此您可能首先要这样做。

既然我写下了所有这些,您的实际问题似乎是:如何开始操作系统设计。这个问题对您来说应该是非常有价值的:有哪些资源可以帮助您开始操作系统开发?

于 2011-07-01T20:36:23.380 回答
0

大多数计算机中的两个主要用户是 CPU 和磁盘。这两者都具有在 Linux 中省电的功能。CPU 时钟可以在系统不忙时减慢,磁盘电机可以在没有 I/O 发生时停止。对于 UART,即使您通过关闭时钟节省了它使用的所有功率,它与其他的相比仍然很小,因为 UART 中没有太多逻辑。

省电的最佳方法是 1) 更高效的电源 2) 用 SSD 替换旋转磁盘 3) 减慢 CPU 和内存总线

于 2011-07-10T23:41:54.240 回答