沙巴现金网
书接上回,上回书我们说到,通过运行化驱散台的 tty_init 操作,内核代码不错很浮浅地在驱散台输出字符啦!
动作用户也不错通过敲击键盘,或调用诸如 printf 这样的库函数,在屏幕上输出信息,同期赞助换行和滚屏等友好策画,这些齐是 tty_init 运行化,以及其对外封装的小功能函数,来驱散的。

我们接续往下看下一个运行化的横祸鬼,time_init。
void 沙巴现金网main(void) { ... mem_init(main_memory_start,memory_end); trap_init(); blk_dev_init(); chr_dev_init(); tty_init(); time_init(); sched_init(); buffer_init(buffer_memory_end); hd_init(); floppy_init(); sti(); move_to_user_mode(); if (!fork()) {init();} for(;;) pause(); }
也曾我很敬爱,操作系统是若何获取到现常常期的呢?
诚然,当今齐联网了,不错从蕴蓄上及时同步。那当莫得蕴蓄时,为什么操作系统在启动之后,不错涌现出现常常期呢?难说念操作系统在电脑关机后,依然不断地在某处运行着,勤致力于恳数着秒表么?
诚然不是,那我们今天就大开这个 time_init 函数一探究竟。
大开这个函数后我又是很昂扬,因为很短,且莫得更长远的设施调用。
#define CMOS_READ(addr) ({ \ outb_p(0x80|addr,0x70); \ inb_p(0x71); \ }) #define BCD_TO_BIN(val) ((val)=((val)&15) + ((val)>>4)*10) static void time_init(void) { struct tm time; do { time.tm_sec = CMOS_READ(0); time.tm_min = CMOS_READ(2); time.tm_hour = CMOS_READ(4); time.tm_mday = CMOS_READ(7); time.tm_mon = CMOS_READ(8); time.tm_year = CMOS_READ(9); } while (time.tm_sec != CMOS_READ(0)); BCD_TO_BIN(time.tm_sec); BCD_TO_BIN(time.tm_min); BCD_TO_BIN(time.tm_hour); BCD_TO_BIN(time.tm_mday); BCD_TO_BIN(time.tm_mon); BCD_TO_BIN(time.tm_year); time.tm_mon--; startup_time = kernel_mktime(&time); }
梦念念的代码呀!
欧博正网那主要便是对 CMOS_READ 和 BCD_TO_BIN 齐是啥兴致伸开讲一下就光显明晰。
领先是 CMOS_READ
#define CMOS_READ(addr) ({ \ outb_p(0x80|addr,0x70); \ inb_p(0x71); \ })
便是对一个端口先 out 写一下,再 in 读一下。
这是 CPU 与外设交互的一个基本玩法,CPU 与外设打交说念基本是通过端口,往某些端口写值来默示要这个外设干嘛,然后从另一些端口读值来罗致外设的响应。
端午佳节将至,在苏州河上赛龙舟,既是对中华优秀传统文化的赓续传承,亦是对“团结拼搏,力争上游”的龙舟精神的生动展现。
皇冠hg86a
至于这个外设里面是若何驱散的,对使用它的操作系统而言,是个黑盒,无需温煦。那关于我们圭臬员来说,就更毋庸温煦了。
在皇冠体育上,您可以参加各种体育竞猜活动,和其他博彩爱好者一起分享乐趣。对 CMOS 这个外设的交互讲起来可能没嗅觉,我们望望与硬盘的交互。
最常见的便是读硬盘了,我们看硬盘的端口表。
香港彩博彩门户官方网 端口 读 写
0x1F0
数据寄存器 数据寄存器0x1F1
基金在线博彩平台大全 作假寄存器 特征寄存器0x1F2
扇区计数寄存器 扇区计数寄存器0x1F3
扇区号寄存器或 LBA 块地址 0~7 扇区号或 LBA 块地址 0~7 0x1F4 磁说念数低 8 位或 LBA 块地址 8~15 磁说念数低 8 位或 LBA 块地址 8~15 0x1F5 磁说念数高 8 位或 LBA 块地址 16~23 磁说念数高 8 位或 LBA 块地址 16~23 0x1F6 驱动器/磁头或 LBA 块地址 24~27 驱动器/磁头或 LBA 块地址 24~27 0x1F7 高歌寄存器或景象寄存器 高歌寄存器那读硬盘便是,往除了第一个之外的背面几个端口写数据,告诉要读硬盘的哪个扇区,读若干。然后再从 0x1F0 端口一个字节一个字节的读数据。这就完成了一次硬盘读操作。
要是合计不够具体,那来个具体的版块。
皇冠客服飞机:@seo3687 在 0x1F2 写入要读取的扇区数 在 0x1F3 ~ 0x1F6 这四个端口写入磋磨好的肇端 LBA 地址 在 0x1F7 处写入读高歌的领导号 不时检测 0x1F7 (此时已成为景象寄存器的含义)的忙位 要是第四体式为不忙,则脱手不时从 0x1F0 处读取数据到内存指定位置,直到读完看,是不是对 CPU 最底层是如何与外设打交说念有点嗅觉了?是不是也不难?便是按照东说念主家的操作手册,然后无脑按照条目读写端口就行了。
诚然,读取硬盘的这个无脑轮回,不错 CPU 径直读取并作念写入内存的操作,这样就会占用 CPU 的磋磨资源。
也不错交给 DMA 开发去读,皇冠app自若 CPU,但和硬盘的交互,通通齐是按照硬件手册上的端口闪现,来操作的,本体上亦然作念了一层封装。
皇冠投注app好了,我们也曾学会了和一个外设打交说念的基本玩法了。
那我们代码中要打交说念的是哪个外设呢?便是 CMOS。
它是主板上的一个可读写的 RAM 芯片,你在开机时长按某个键就不错参加缔造它的页面。

那我们的代码,其实便是与它打交说念,获取它的一些数据汉典。
我们回超越看代码。
static void time_init(void) { struct tm time; do { time.tm_sec = CMOS_READ(0); time.tm_min = CMOS_READ(2); time.tm_hour = CMOS_READ(4); time.tm_mday = CMOS_READ(7); time.tm_mon = CMOS_READ(8); time.tm_year = CMOS_READ(9); } while (time.tm_sec != CMOS_READ(0)); BCD_TO_BIN(time.tm_sec); BCD_TO_BIN(time.tm_min); BCD_TO_BIN(time.tm_hour); BCD_TO_BIN(time.tm_mday); BCD_TO_BIN(time.tm_mon); BCD_TO_BIN(time.tm_year); time.tm_mon--; startup_time = kernel_mktime(&time); }
前边几个赋值语句 CMOS_READ 便是通过读写 CMOS 上的指定端口,循序获取年月日时期秒等信息。具体咋操作代码上也写了,亦然按照 CMOS 手册条目的读写指定端口就行了,我们就不伸开了。
是以你看,其实操作系统圭臬,亦然要依靠与一个外部开发打交说念,来获取这些信息的,并不是它我方有什么魔力。操作系统最大的魔力,就在于它借力完成了一项伟大的事,借 CPU 的力,借硬盘的力,借内存的力,以及当今借 CMOS 的力。
至于 CMOS 又是如何知说念时期的,这个就不在我们辩论鸿沟了。
接下来 BCD_TO_BIN 便是 BCD 援助成 BIN,因为从 CMOS 上获取的这些年月日齐是 BCD 码值,需要援助成存储在我们变量上的二进制数值,是以需要一个小算法来援助一下,没什么兴致。
终末一步 kernel_mktime 也很粗拙,便是字据刚刚的那些时期秒数据,磋磨从 1970 年 1 月 1 日 0 时起到开机其时流程的秒数,动作开机时期,存储在 startup_time 这个变量里。
念念讨论不错仔细望望这段代码,不外我合计这种细节不必看。
startup_time = kernel_mktime(&time); // kernel/mktime.c long kernel_mktime(struct tm * tm) { long res; int year; year = tm->tm_year - 70; res = YEAR*year + DAY*((year+1)/4); res += month[tm->tm_mon]; if (tm->tm_mon>1 && ((year+2)%4)) res -= DAY; res += DAY*(tm->tm_mday-1); res += HOUR*tm->tm_hour; res += MINUTE*tm->tm_min; res += tm->tm_sec; return res; }
就这。
是以今天其实便是,磋磨出了一个 startup_time 变量汉典,至于这个变量今后会被谁用,若何用,那便是后话了。
敬佩你安宁也体会到了,此时操作系统好多场合齐是用外设条目的样式去洽商,比如硬盘信息、涌现形式,以及今天的开机时期的获取等。
是以致少到咫尺来说,你还不应该嗅觉操作系统有何等的“高端”,许多时候齐是繁琐地,读东说念主家的硬件手册,获取到念念要的的信息,拿来给我方用,好像对其进行多样缔造。
但你一定要耐得住落寞,着实体现操作系统的巨大策画之处,还得接着往下读。
欲知后事如何,且听下回判辨。
本文转载自微信公众号「低并发编程」,不错通过以下二维码关注。转载本文请臆度低并发编程公众号。本网站已获取低并发编程的授权。
金鸡岭百家乐
