Linux内核中的硬件时钟信号实现

The*_*tig 12 linux operating-system clock bios linux-kernel

我正在寻找一些指导,以了解Linux内核如何实现各种硬件时钟的设置.这主要涉及设置各种时钟,如LCD,UART等硬件功能将使用.例如,当Linux引导它如何处理为UART或USB设置时钟时.也许像时钟经理之类的东西.

我基本上试图在我正在使用的新硬件上为不同的操作系统实现类似的功能.任何帮助将非常感激.

[编辑]
感谢您的回复和链接.所以这是我迄今为止所实施的内容.这应该可以让你了解我的目标.

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

我的问题是,我想了解使用我已编写的实用程序的时钟/外围设备管理器的设计和实现.这个时钟/外设管理器可以让我控制启用/禁用我想要的外设.基本上这个管理器可以让我对正在运行的init代码进行更改.此外,在运行时,进程可以调用此Manager来打开/关闭设备,以便优化功耗.它可能没有完美的意义,但我自己试图绕过这个.

现在我确信这样的事情会在Linux中实现,或者就任何操作系统的性能问题而言都是如此(没有人希望通过在启动时打开所有外设来浪费电源).我想了解它的软件架构.任何操作系统的参考资料至今都可以实现至少获得一个先机.此外,我不是在编写自己的操作系统,有一个操作系统,但我正在寻找更多的板级软件,也就是BSP.但是,无论如何,感谢OS链接,它们真的很棒.欣赏它.

谢谢!

Bjo*_*rnD 6

您想要实现的目标非常特定于a)您正在使用的平台和b)您要使用的设备.例如,在x86上有3种与设备通信的方式:

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

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

作为理解Linux的开始,我建议"理解Linux内核".有关Linux如何处理设备以及编写驱动程序的具体信息,请查看Linux设备驱动程序.此外,您还需要了解平台和要驱动的设备的特性.

如果你想要启动一个自己的操作系统,UART肯定会对打印调试输出有所帮助,所以你可能想先这样做.

现在我写下了这一切,看来您的实际问题是:如何开始使用操作系统设计.这个问题应该对您非常有价值:开始操作系统开发有哪些资源?