我正在寻找一些指导,以了解Linux内核如何实现各种硬件时钟的设置.这主要涉及设置各种时钟,如LCD,UART等硬件功能将使用.例如,当Linux引导它如何处理为UART或USB设置时钟时.也许像时钟经理之类的东西.
我基本上试图在我正在使用的新硬件上为不同的操作系统实现类似的功能.任何帮助将非常感激.
[编辑]
感谢您的回复和链接.所以这是我迄今为止所实施的内容.这应该可以让你了解我的目标.
我查看了硬件参考手册,了解了我所针对的特定系统,并编写了一些代码来监控/修改我感兴趣的外设的信号/引脚,即从命令行打开/关闭它们.现在收集这些时钟/信号一起控制外设.HRM会说如果你想打开UART或其他东西,那么打开这样的信号/引脚.和@BjoernD是的,我正在使用类似mmap()函数的东西与外围设备通信.
我的问题是,我想了解使用我已编写的实用程序的时钟/外围设备管理器的设计和实现.这个时钟/外设管理器可以让我控制启用/禁用我想要的外设.基本上这个管理器可以让我对正在运行的init代码进行更改.此外,在运行时,进程可以调用此Manager来打开/关闭设备,以便优化功耗.它可能没有完美的意义,但我自己试图绕过这个.
现在我确信这样的事情会在Linux中实现,或者就任何操作系统的性能问题而言都是如此(没有人希望通过在启动时打开所有外设来浪费电源).我想了解它的软件架构.任何操作系统的参考资料至今都可以实现至少获得一个先机.此外,我不是在编写自己的操作系统,有一个操作系统,但我正在寻找更多的板级软件,也就是BSP.但是,无论如何,感谢OS链接,它们真的很棒.欣赏它.
谢谢!
我正在编写一些高度可移植的安全代码.我试图避免实用程序中的安全漏洞,例如在某些版本中找到的这个sudo:
...通过运行
sudo -k然后将系统时钟重置为01-01-1970,可以成为超级用户.
发生这种情况是因为sudo依赖于绝对(即日历)时间来确定访问是否已超时.
我的想法是使用CLOCK_MONOTONIC定义的time.h.
从POSIX标准来看,
[CLOCK_MONOTONIC]被定义为一个时钟,其值不能通过clock_settime()设置,并且不能有后向时钟跳转.最大可能的时钟跳转应由实现定义.
问题是,在许多(大多数?)系统上,CLOCK_MONOTONIC重启时会重置.是否有任何保证 POSIX兼容的方法来确定自程序上次运行以来系统是否已重新启动?
一种(坏)方法是检查存储的时钟值是否大于当前时钟值,但这只会改变问题.在CLOCK_MONOTONIC重新启动时重置的系统上,可能会有一个TIMEOUT允许访问的短窗口.
我错过了什么可以避免这个问题?
我想将托管的iOS设备部署到公司的员工,他们将使用的应用程序将为本地记录的数据加时间戳,然后转发.我需要这些时间戳是正确的,所以我必须阻止用户调整设备上的时间,记录一个值,然后重置日期和时间.日期和时间将被配置为自动来自网络,但设备可能始终没有网络连接(否则每次记录数据值时我只会读取网络时间).我还没有在Apple Configurator中看到一个选项来阻止更改日期和时间,那么有没有其他方法可以做到这一点?
我正在构建一个依赖于预定作业的Heroku应用程序.我们之前使用的是Heroku Scheduler,但时钟进程似乎更灵活,更强大.所以现在我们正在使用时钟进程在特定时间/间隔排队后台作业.
Heroku的文档提到,与所有dynos一样,时钟dynos每天至少重启一次 - 这会导致时钟进程跳过预定作业的风险:"由于dynos每天至少重启一次逻辑需要在时钟进程启动时存在,以确保在dyno重启期间不会跳过作业间隔." (参见https://devcenter.heroku.com/articles/scheduled-jobs-custom-clock-processes)
有哪些建议的方法可以确保不会跳过预定的作业,并重新排队错过的任何作业?
一种可能的方法是在作业运行/入队时创建数据库记录,并在时钟作业内定期检查预期记录的存在.最大的缺点是如果时钟dyno存在系统性问题导致它在相当长的一段时间内停机,那么我不能每隔X小时进行一次轮询以确保预定的作业成功运行,因为轮询发生在时钟dyno内.
你是如何处理时钟dyno弹性问题的?
谢谢!
Linux提供了stime(2)调用来设置系统时间.但是,虽然这会更新系统的时间,但它不会将BIOS硬件时钟设置为与新系统时间相匹配.
Linux系统通常将硬件时钟与关机时的系统时间以及定期间隔同步.但是,如果机器在其中一个自动同步之前重新启动电源,则机器重新启动时的时间将不正确.
在设置系统时间时,如何确保硬件时钟得到更新?
我需要在网页上添加一个时钟.时钟需要与服务器同步,但我真的不想让它经常检查服务器,因为页面将在几台PC上全天候打开.有没有办法从服务器获取时间,然后使用系统时钟保持更新并每隔15分钟左右检查服务器以保持同步?
/sys/devices/system/clocksource/clocksource0/available_clocksource我的Linux框中的文件列出了以下时钟源:
tsc hpet acpi_pm
Run Code Online (Sandbox Code Playgroud)
我知道这tsc是Processer中的时间戳计数器寄存器.我知道这hpet是高精度事件计时器.
我不知道它acpi_pm是什么以及硬件实现了什么?这是PIT(可编程间隔定时器)吗?
我想在云中运行一个庞大的节点集群(AWS,Heroku,或者可能是自我管理的VMS),其时钟必须与预定义的容差同步.我正在寻找可能200毫秒的容差.这意味着如果我有250个节点,250个节点中任何一个节点之间的最大时钟差异不应超过200毫秒.我真的不关心世界的实际日期/时间.解决方案必须是容错的,并且不需要依赖任何一个系统的时钟精度 - 实际上,很可能没有一个时钟会非常准确.
要求足够强大,如果由于任何原因确定时钟同步对于任何特定节点不可靠,我宁愿由于时钟失步而从集群中丢弃节点 - 所以在任何可疑的故障时,我都会喜欢能够执行该节点的某种类型的受控关闭.
我喜欢使用类似NTP的东西,但根据NTP 已知问题twiki:
NTP不是为在虚拟机内部运行而设计的.它需要一个高分辨率的系统时钟,响应时间到时钟中断,并以高精度提供服务.没有已知的虚拟机能够满足这些要求.
虽然然后同样的twiki描述了解决这种情况的各种方法(例如在主机操作系统上运行ntp),但我不相信我能够使用AWS或者horoku来修改环境以符合解决方法.
即使我没有在VM中运行,一位拥有多年运行ntp经验的值得信赖的运营经理告诉我,由于每隔一段时间内本地时钟漂移不良,ntp可以并且会丢失同步(或者说得失时间).它不会经常发生,但确实会发生,并且随着您增加机器,您会增加发生这种情况的机会.AFAIK,检测你的距离需要停止ntpd,运行查询模式命令,然后重新启动它,并且可能需要很长时间才能得到答案.
总结一下 - 我需要一个时钟同步,其主要目标如下:
从描述来看,似乎伯克利算法可能是正确的选择,但是它已经实现了吗?
很高兴有:
是否可以检测用户的机器是使用12小时制(上午/下午)还是24小时制(军事时间)?
一种方法是检查用户的区域设置,但是它只是大量的区域设置比较列表,而美国想要12小时时钟的人可以发送我的区域设置,而不是US_en,我无法知道她的偏好.与此同时,来自美国的某人可能会将她的机器设置为使用12小时时间格式而不需要12小时时钟.
编辑:
date.toLocaleTimeString();
Run Code Online (Sandbox Code Playgroud)
正如下面的用户Mouser所建议的那样,它可以理论化,但遗憾的是它在WebKit浏览器上进行了测试(在Chrome上测试,在Windows上测试了新的Opera),并且出于某种原因总是返回上午/下午的时间.
示例:http://jsfiddle.net/sjuaL3p4/
所以我想如果有人知道如何在webkit浏览器上完成它,我必须重新解释我的问题.
在试图在SFML中找到一个可靠的游戏循环的过程中,我遇到了这个我似乎无法弄清楚的问题.我能够删除所有SFML代码,仍然clock()在time.h中看到问题.然后我走得更远,仍然看到问题使用std::chrono::steady_clock.
问题:我总是看到跳过更新之间可以完成的工作量.每次更新应该花费1/60秒,剩下的时间用于Draw()尽可能多地完成绘图.有时抽奖量下降到0或1,没有明显的原因.这会以明显的口吃形式冒泡到实际应用中.除了"跳过"之外,完成的抽签次数非常一致.
这是一个图像(注意更新时间的跳转和绘制中的下降): 问题的控制台输出
一些代码:
#include <iostream>
#include <time.h>
#include <chrono>
using namespace std;
using namespace std::chrono;
void Draw()
{
//for (int i = 0; i < 1000000; i++);
}
int main()
{
steady_clock::time_point update_time;
steady_clock::time_point update_next;
int update_rate = 16666666; // 60 times a second (nanosecs)
int updates;
int max_updates = 5;
int draws = 0;
update_next = steady_clock::now();
while (true)
{
updates = 0;
update_time = steady_clock::now();
while (duration_cast<nanoseconds>(update_time - update_next) > …Run Code Online (Sandbox Code Playgroud)