精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

原來操作系統(tǒng)獲取時間的方式也這么 low

系統(tǒng)
書接上回,上回書咱們說到,通過初始化控制臺的 tty_init 操作,內(nèi)核代碼可以很方便地在控制臺輸出字符啦!

書接上回,上回書咱們說到,通過初始化控制臺的 tty_init 操作,內(nèi)核代碼可以很方便地在控制臺輸出字符啦!

作為用戶也可以通過敲擊鍵盤,或調(diào)用諸如 printf 這樣的庫函數(shù),在屏幕上輸出信息,同時支持換行和滾屏等友好設(shè)計,這些都是 tty_init 初始化,以及其對外封裝的小功能函數(shù),來實現(xiàn)的。

我們繼續(xù)往下看下一個初始化的倒霉鬼,time_init。

  1. void main(void) { 
  2.     ... 
  3.     mem_init(main_memory_start,memory_end); 
  4.     trap_init(); 
  5.     blk_dev_init(); 
  6.     chr_dev_init(); 
  7.     tty_init(); 
  8.     time_init(); 
  9.     sched_init(); 
  10.     buffer_init(buffer_memory_end); 
  11.     hd_init(); 
  12.     floppy_init(); 
  13.      
  14.     sti(); 
  15.     move_to_user_mode(); 
  16.     if (!fork()) {init();} 
  17.     for(;;) pause(); 

曾經(jīng)我很好奇,操作系統(tǒng)是怎么獲取到當前時間的呢?

當然,現(xiàn)在都聯(lián)網(wǎng)了,可以從網(wǎng)絡(luò)上實時同步。那當沒有網(wǎng)絡(luò)時,為什么操作系統(tǒng)在啟動之后,可以顯示出當前時間呢?難道操作系統(tǒng)在電腦關(guān)機后,依然不停地在某處運行著,勤勤懇懇數(shù)著秒表么?

當然不是,那我們今天就打開這個 time_init 函數(shù)一探究竟。

打開這個函數(shù)后我又是很開心,因為很短,且沒有更深入的方法調(diào)用。

  1. #define CMOS_READ(addr) ({ \ 
  2.     outb_p(0x80|addr,0x70); \ 
  3.     inb_p(0x71); \ 
  4. }) 
  5.  
  6. #define BCD_TO_BIN(val) ((val)=((val)&15) + ((val)>>4)*10) 
  7.  
  8. static void time_init(void) { 
  9.     struct tm time
  10.     do { 
  11.         time.tm_sec = CMOS_READ(0); 
  12.         time.tm_min = CMOS_READ(2); 
  13.         time.tm_hour = CMOS_READ(4); 
  14.         time.tm_mday = CMOS_READ(7); 
  15.         time.tm_mon = CMOS_READ(8); 
  16.         time.tm_year = CMOS_READ(9); 
  17.     } while (time.tm_sec != CMOS_READ(0)); 
  18.     BCD_TO_BIN(time.tm_sec); 
  19.     BCD_TO_BIN(time.tm_min); 
  20.     BCD_TO_BIN(time.tm_hour); 
  21.     BCD_TO_BIN(time.tm_mday); 
  22.     BCD_TO_BIN(time.tm_mon); 
  23.     BCD_TO_BIN(time.tm_year); 
  24.     time.tm_mon--; 
  25.     startup_time = kernel_mktime(&time); 

夢想的代碼呀!

那主要就是對 CMOS_READ 和 BCD_TO_BIN 都是啥意思展開講一下就明白了了。

首先是 CMOS_READ

  1. #define CMOS_READ(addr) ({ \ 
  2.     outb_p(0x80|addr,0x70); \ 
  3.     inb_p(0x71); \ 
  4. }) 

就是對一個端口先 out 寫一下,再 in 讀一下。

這是 CPU 與外設(shè)交互的一個基本玩法,CPU 與外設(shè)打交道基本是通過端口,往某些端口寫值來表示要這個外設(shè)干嘛,然后從另一些端口讀值來接受外設(shè)的反饋。

至于這個外設(shè)內(nèi)部是怎么實現(xiàn)的,對使用它的操作系統(tǒng)而言,是個黑盒,無需關(guān)心。那對于我們程序員來說,就更不用關(guān)心了。

對 CMOS 這個外設(shè)的交互講起來可能沒感覺,我們看看與硬盤的交互。

最常見的就是讀硬盤了,我們看硬盤的端口表。

 


 

端口


0x1F0

數(shù)據(jù)寄存器 數(shù)據(jù)寄存器

0x1F1

錯誤寄存器 特征寄存器

0x1F2

扇區(qū)計數(shù)寄存器 扇區(qū)計數(shù)寄存器

0x1F3

扇區(qū)號寄存器或 LBA 塊地址 0~7 扇區(qū)號或 LBA 塊地址 0~7
0x1F4
磁道數(shù)低 8 位或 LBA 塊地址 8~15 磁道數(shù)低 8 位或 LBA 塊地址 8~15
0x1F5
磁道數(shù)高 8 位或 LBA 塊地址 16~23 磁道數(shù)高 8 位或 LBA 塊地址 16~23
0x1F6
驅(qū)動器/磁頭或 LBA 塊地址 24~27 驅(qū)動器/磁頭或 LBA 塊地址 24~27
0x1F7
命令寄存器或狀態(tài)寄存器 命令寄存器

那讀硬盤就是,往除了第一個以外的后面幾個端口寫數(shù)據(jù),告訴要讀硬盤的哪個扇區(qū),讀多少。然后再從 0x1F0 端口一個字節(jié)一個字節(jié)的讀數(shù)據(jù)。這就完成了一次硬盤讀操作。

如果覺得不夠具體,那來個具體的版本。

  • 在 0x1F2 寫入要讀取的扇區(qū)數(shù)
  • 在 0x1F3 ~ 0x1F6 這四個端口寫入計算好的起始 LBA 地址
  • 在 0x1F7 處寫入讀命令的指令號
  • 不斷檢測 0x1F7 (此時已成為狀態(tài)寄存器的含義)的忙位
  • 如果第四步驟為不忙,則開始不斷從 0x1F0 處讀取數(shù)據(jù)到內(nèi)存指定位置,直到讀完

看,是不是對 CPU 最底層是如何與外設(shè)打交道有點感覺了?是不是也不難?就是按照人家的操作手冊,然后無腦按照要求讀寫端口就行了。

當然,讀取硬盤的這個無腦循環(huán),可以 CPU 直接讀取并做寫入內(nèi)存的操作,這樣就會占用 CPU 的計算資源。

也可以交給 DMA 設(shè)備去讀,解放 CPU,但和硬盤的交互,通通都是按照硬件手冊上的端口說明,來操作的,實際上也是做了一層封裝。

好了,我們已經(jīng)學會了和一個外設(shè)打交道的基本玩法了。

那我們代碼中要打交道的是哪個外設(shè)呢?就是 CMOS。

它是主板上的一個可讀寫的 RAM 芯片,你在開機時長按某個鍵就可以進入設(shè)置它的頁面。

那我們的代碼,其實就是與它打交道,獲取它的一些數(shù)據(jù)而已。

我們回過頭看代碼。

  1. static void time_init(void) { 
  2.     struct tm time
  3.     do { 
  4.         time.tm_sec = CMOS_READ(0); 
  5.         time.tm_min = CMOS_READ(2); 
  6.         time.tm_hour = CMOS_READ(4); 
  7.         time.tm_mday = CMOS_READ(7); 
  8.         time.tm_mon = CMOS_READ(8); 
  9.         time.tm_year = CMOS_READ(9); 
  10.     } while (time.tm_sec != CMOS_READ(0)); 
  11.     BCD_TO_BIN(time.tm_sec); 
  12.     BCD_TO_BIN(time.tm_min); 
  13.     BCD_TO_BIN(time.tm_hour); 
  14.     BCD_TO_BIN(time.tm_mday); 
  15.     BCD_TO_BIN(time.tm_mon); 
  16.     BCD_TO_BIN(time.tm_year); 
  17.     time.tm_mon--; 
  18.     startup_time = kernel_mktime(&time); 

前面幾個賦值語句 CMOS_READ 就是通過讀寫 CMOS 上的指定端口,依次獲取年月日時分秒等信息。具體咋操作代碼上也寫了,也是按照 CMOS 手冊要求的讀寫指定端口就行了,我們就不展開了。

所以你看,其實操作系統(tǒng)程序,也是要依靠與一個外部設(shè)備打交道,來獲取這些信息的,并不是它自己有什么魔力。操作系統(tǒng)最大的魅力,就在于它借力完成了一項偉大的事,借 CPU 的力,借硬盤的力,借內(nèi)存的力,以及現(xiàn)在借 CMOS 的力。

至于 CMOS 又是如何知道時間的,這個就不在我們討論范圍了。

接下來 BCD_TO_BIN 就是 BCD 轉(zhuǎn)換成 BIN,因為從 CMOS 上獲取的這些年月日都是 BCD 碼值,需要轉(zhuǎn)換成存儲在我們變量上的二進制數(shù)值,所以需要一個小算法來轉(zhuǎn)換一下,沒什么意思。

最后一步 kernel_mktime 也很簡單,就是根據(jù)剛剛的那些時分秒數(shù)據(jù),計算從 1970 年 1 月 1 日 0 時起到開機當時經(jīng)過的秒數(shù),作為開機時間,存儲在 startup_time 這個變量里。

想研究可以仔細看看這段代碼,不過我覺得這種細節(jié)不必看。

  1. startup_time = kernel_mktime(&time); 
  2.  
  3. // kernel/mktime.c 
  4. long kernel_mktime(struct tm * tm) 
  5.     long res; 
  6.     int year
  7.     year = tm->tm_year - 70; 
  8.     res = YEAR*year + DAY*((year+1)/4); 
  9.     res += month[tm->tm_mon]; 
  10.     if (tm->tm_mon>1 && ((year+2)%4)) 
  11.         res -= DAY
  12.     res += DAY*(tm->tm_mday-1); 
  13.     res += HOUR*tm->tm_hour; 
  14.     res += MINUTE*tm->tm_min; 
  15.     res += tm->tm_sec; 
  16.     return res; 

就這。

所以今天其實就是,計算出了一個 startup_time 變量而已,至于這個變量今后會被誰用,怎么用,那就是后話了。

相信你逐漸也體會到了,此時操作系統(tǒng)好多地方都是用外設(shè)要求的方式去詢問,比如硬盤信息、顯示模式,以及今天的開機時間的獲取等。

所以至少到目前來說,你還不應該感覺操作系統(tǒng)有多么的“高端”,很多時候都是繁瑣地,讀人家的硬件手冊,獲取到想要的的信息,拿來給自己用,或者對其進行各種設(shè)置。

但你一定要耐得住寂寞,真正體現(xiàn)操作系統(tǒng)的強大設(shè)計之處,還得接著往下讀。

欲知后事如何,且聽下回分解。

本文轉(zhuǎn)載自微信公眾號「低并發(fā)編程」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系低并發(fā)編程公眾號。本網(wǎng)站已獲得低并發(fā)編程的授權(quán)。

 

責任編輯:武曉燕 來源: 低并發(fā)編程
相關(guān)推薦

2010-08-02 13:55:20

2010-04-22 14:18:42

Aix操作系統(tǒng)

2018-08-09 16:12:59

操作系統(tǒng)內(nèi)存分配

2019-03-14 09:29:02

Linux系統(tǒng)內(nèi)存

2021-04-19 05:42:51

Mmap文件系統(tǒng)

2010-02-26 14:13:51

Linux操作系統(tǒng)

2010-04-15 14:40:26

Unix操作系統(tǒng)

2023-05-07 23:22:24

golang

2009-12-09 17:25:19

Linux操作系統(tǒng)

2010-04-28 18:59:59

Unix操作系統(tǒng)

2010-03-04 14:34:50

Linux操作系統(tǒng)

2010-04-30 16:02:45

Unix操作系統(tǒng)

2009-12-25 17:05:50

Linux操作系統(tǒng)

2009-07-23 18:43:25

操作系統(tǒng)LinuxWindows

2012-03-30 14:43:23

2015-04-30 08:00:05

數(shù)據(jù)中心多種操作系統(tǒng)

2021-04-19 11:23:29

操作系統(tǒng)計算機DOS

2021-11-15 06:56:46

操作系統(tǒng)U盤

2009-12-02 17:01:05

路由器功能

2022-01-07 13:34:25

Java時間格式化
點贊
收藏

51CTO技術(shù)棧公眾號

日韩精品一区二区三区久久| 国产一区二中文字幕在线看| 真人bbbbbbbbb毛片| 伊人成综合网站| 欧美国产日韩a欧美在线观看| 91精品国产综合久久香蕉的用户体验| 欧美激情精品久久| 亚洲影院天堂中文av色| 欧美日韩国产在线播放网站| 福利在线一区二区| 国产视频第一页在线观看| 国产综合成人久久大片91| 亚洲国产日韩a在线播放| 久久天堂国产精品| 免费一级片在线观看| 婷婷综合成人| 日韩欧美久久一区| 日本熟妇人妻xxxxx| 在线观看男女av免费网址| 久久久欧美精品sm网站| 亚洲综合色av| 中文字幕 自拍偷拍| 亚洲国产二区| 美女久久久久久久| 国产精品免费无码| 欧美午夜寂寞| 日韩精品一区二区三区四区| www.精品在线| 极品美鲍一区| 亚洲高清一区二区三区| 宅男在线精品国产免费观看| 男男激情在线| av男人天堂一区| 91久久久一线二线三线品牌| 中文字幕精品无码亚| 一本一本久久| 97高清免费视频| 青青草手机在线视频| 97精品97| 色综合伊人色综合网站| 国产手机在线观看| 在线日韩一区| 国产午夜精品理论片a级探花| 亚洲熟女一区二区三区| 国产电影一区| 在线播放一区二区三区| 中文字幕国产传媒| 久久久成人av毛片免费观看| 欧美午夜美女看片| 日本精品二区| 国产又粗又猛视频免费| 视频一区中文字幕国产| 91a在线视频| 午夜毛片在线观看| 成人免费看片39| 亚洲性生活视频| 午夜在线观看一区| 激情五月综合网| 国产亚洲精品久久| 国产传媒在线看| 欧美限制电影| 中文字幕欧美精品在线| a资源在线观看| 日本道不卡免费一区| 伊人伊成久久人综合网站| 妺妺窝人体色WWW精品| 精品久久影视| 日韩性生活视频| 爱爱视频免费在线观看| 欧美午夜不卡| 91av视频在线播放| 中文字幕免费高清网站| 老司机一区二区| 91久久精品国产91久久性色tv | 欧美日韩另类一区| 中文字幕12页| 国产精品久av福利在线观看| 亚洲精品动漫100p| 国产伦理片在线观看| 天天影视天天精品| 欧美精品电影在线| 日日噜噜噜噜人人爽亚洲精品| 久久经典综合| 亚洲一区二区三区777| 韩国中文字幕hd久久精品| 久久综合久久久久88| 亚洲精品国产精品久久| 丝袜美女在线观看| 日韩欧美亚洲国产一区| 中文字幕 日韩 欧美| 中文字幕一区图| 亚洲三级av在线| 国产精品 欧美激情| 99国产精品视频免费观看一公开| 国产99视频在线观看| 欧美日韩成人免费观看| 国产精品综合色区在线观看| 久久久精品日本| 成人无码av片在线观看| 亚洲精品国产偷自在线观看| 97国产精品视频| 亚洲一区二区色| 99精品视频免费在线观看| 偷拍视频一区二区| 免费网站在线观看人| 欧美亚洲自拍偷拍| 中国黄色片视频| 色天天综合网| 日本乱人伦a精品| 午夜久久久久久久久久| 国产日韩v精品一区二区| 国产自产在线视频| 青春草免费在线视频| 一本到不卡免费一区二区| 欧美日韩亚洲一| 伊人久久精品| 亚洲丝袜在线视频| 久久久精品视频免费| 很黄很黄激情成人| 国产精品视频网址| 日本福利午夜视频在线| 一区二区欧美视频| 一区二区三区视频网| 最新亚洲精品| 孩xxxx性bbbb欧美| 亚洲美女综合网| 亚洲另类在线一区| 香港日本韩国三级网站| 国产日产精品_国产精品毛片| 欧美国产中文字幕| 天天操天天爽天天干| 亚洲欧美日韩精品一区二区| 亚洲xxx自由成熟| 日本成人网址| 欧美日韩一区二区欧美激情 | 国产欧美日韩在线看| 欧美日产一区二区三区在线观看| 日本理论片午伦夜理片在线观看| 6080午夜不卡| 欧美日韩黄色网| 亚洲国产专区| 国产高清不卡av| 青草在线视频| 精品国产91洋老外米糕| 麻豆成人在线视频| 丁香桃色午夜亚洲一区二区三区| 一区二区三区四区免费观看| 亚洲精品无播放器在线播放| 丝袜亚洲另类欧美重口| 中文字幕在线观看欧美| 欧美极品另类videosde| 9久久婷婷国产综合精品性色| 国产麻豆精品久久| 国产精品美女av| 在线观看二区| 69堂成人精品免费视频| 日本黄色小说视频| 丁香啪啪综合成人亚洲小说| 国产免费一区二区视频| 精品按摩偷拍| 91av视频在线观看| 日本一二三区在线视频| 在线视频欧美精品| 亚洲精品自拍视频在线观看| 国内精品伊人久久久久av影院| 在线视频一二三区| www.久久东京| 欧美亚洲另类视频| bbbbbbbbbbb在线视频| 欧美日韩国产首页在线观看| 亚洲国产精品免费在线观看| 成人三级伦理片| 精品免费国产一区二区| 97人人精品| 国产伦精品一区二区| 日韩免费电影| 久久久av一区| 凸凹人妻人人澡人人添| 在线观看日产精品| 午夜少妇久久久久久久久| 9色porny自拍视频一区二区| 免费看a级黄色片| 91精品国产91久久久久久密臀 | 亚洲狼人综合网| 亚洲国产精品av| 91欧美一区二区三区| 亚洲国产一区二区三区a毛片| 日韩av高清| 精品视频成人| 日本精品久久久| 高清全集视频免费在线| 亚洲黄色av网站| 伊人免费在线观看高清版| 亚洲一区在线视频观看| 最近中文字幕在线mv视频在线| 激情久久五月天| 国产成人无码精品久久久性色| av一级亚洲| 国产精品久久久久久av下载红粉| 国产一二区在线观看| 精品在线小视频| 国产av一区二区三区精品| 懂色av一区二区三区| 欧美日韩一区二区三区四区五区六区| 久久永久免费| 国产乱淫av片杨贵妃| 第一会所sis001亚洲| 国产成人精品福利一区二区三区| 日韩在线免费| 欧美一级免费视频| 午夜小视频在线观看| 中文字幕亚洲一区| 日韩偷拍自拍| 欧美白人最猛性xxxxx69交| 中文字幕一区二区三区四区免费看| 亚洲国产欧美另类丝袜| 永久免费未视频| 国产喷白浆一区二区三区| 国产污在线观看| 国产激情视频一区二区三区欧美| 国产熟人av一二三区| 国产免费成人| 分分操这里只有精品| 欧美1区3d| 一级一片免费播放| 精品日韩欧美一区| 国产亚洲欧美另类一区二区三区| 日本精品视频| 2019国产精品视频| 亚洲精品大全| 成人网中文字幕| 欧美成人一二区| 国产精品你懂得| 欧美成人a交片免费看| 国产91成人在在线播放| 91美女精品| 午夜精品久久久久久久久久久久久 | 精品少妇久久久| 亚洲黄色性网站| 久久精品aⅴ无码中文字字幕重口| 久久精品久久99精品久久| www.日本xxxx| 青青草精品视频| 亚洲色图久久久| 男女性色大片免费观看一区二区 | 日本亚洲欧美在线| 亚洲国产欧美在线| 国产成人无码精品久久久久| 亚洲成人激情av| 国产情侣自拍av| 欧美性猛交xxxx| 色老头一区二区| 欧洲国产伦久久久久久久| 欧美视频xxxx| 欧美日本一区二区三区四区| 91一区二区视频| 欧美精品色一区二区三区| 国产又粗又长又大视频| 日韩欧美在线1卡| 亚洲精品一区二区三区蜜桃| 精品99999| 欧美新色视频| 最近中文字幕mv在线一区二区三区四区| h视频在线播放| 欧美成人免费在线视频| 波多野结衣在线高清| 欧美亚洲国产精品| 国产一区二区三区四区五区3d | 成人性生生活性生交12| 麻豆成人在线观看| 丰满人妻一区二区三区大胸| 成人福利视频在线看| 9.1成人看片免费版| 欧美激情一区二区三区在线| 国产中文av在线| 亚洲一区二区精品视频| 欧美a视频在线观看| 欧美日韩黄色一区二区| 亚洲欧美黄色片| 亚洲女人天堂av| 国产黄a三级三级三级| 日韩精品一区二区三区在线播放 | 国产96在线 | 亚洲| 性娇小13――14欧美| 久久久久久蜜桃一区二区| 国产成人av电影在线播放| 欧美老熟妇乱大交xxxxx| 国产精品对白交换视频| 新91视频在线观看| 国产精品国产a| 日本系列第一页| 欧美精品在线一区二区| 秋霞网一区二区| 欧美刺激脚交jootjob| 日韩av地址| 精品中文字幕在线2019| 欧美18—19sex性hd| 亚洲最大的成人网| 亚洲最好看的视频| 一区二区三区一级片| 久久国产88| 精品无码av一区二区三区不卡| 久久精品免费在线观看| 日韩激情一区二区三区| 欧美日韩国产综合一区二区| 三级理论午夜在线观看| 欧美乱大交xxxxx另类电影| 九九热线视频只有这里最精品| 99精品国产高清在线观看| 精品午夜久久| 中国丰满人妻videoshd | 欧美性欧美巨大黑白大战| 丰满人妻妇伦又伦精品国产| 日韩中文在线中文网在线观看| 男人天堂视频在线观看| 成人羞羞视频免费| 99久久99热这里只有精品| 久久国产乱子伦免费精品| 成人精品免费视频| 美女的奶胸大爽爽大片| 欧美日韩精品一区二区三区四区 | 亚洲18私人小影院| 日韩在线观看中文字幕| 麻豆中文字幕在线观看| 日本欧洲一区二区| 成年人在线观看av| 五月天精品一区二区三区| 亚洲av综合色区无码一二三区| 日韩中文第一页| 九九九精品视频| 亚洲高清视频在线观看| 天堂va蜜桃一区二区三区| 成人免费看aa片| 精品久久久久久久久久国产| 内射无码专区久久亚洲| 欧美激情视频给我| 2023国产精华国产精品| 青青在线视频免费观看| 国产伦精品一区二区三区在线观看| 国产精品麻豆免费版现看视频| 欧美自拍偷拍一区| 二区在线观看| 国产日韩欧美一二三区| 99热在线成人| 亚洲国产综合av| 一区二区三区在线影院| 精品久久人妻av中文字幕| 精品视频9999| 精品一区二区男人吃奶| 激情文学综合丁香| 海角国产乱辈乱精品视频| www.久久99| 色呦呦网站入口| 精品一区二区三区免费播放 | 99久久国产免费看| 国产女同在线观看| 精品无码久久久久久国产| 亚洲精品日产| 亚洲狠狠爱一区二区三区| www.五月婷| 国语自产精品视频在线看一大j8| 成人偷拍自拍| 97干在线视频| 久久久久久一级片| 中文永久免费观看| 北条麻妃在线一区二区| 欧一区二区三区| 夜夜添无码一区二区三区| 2021国产精品久久精品| 国产又粗又猛又爽又| 日韩一区二区三区国产| 日韩高清一区| 亚欧无线一线二线三线区别| 久久久亚洲精品石原莉奈| www.亚洲激情| 久久电影一区二区| 国产91精品入| 亚洲视频在线a| 国产精品成人免费在线| 亚洲黄色小说网址| 欧洲成人免费aa| 国产精品毛片久久| 99久久免费看精品国产一区| 91久久精品网| 成人直播在线| 免费一区二区三区| 久久草av在线| 免费日韩一级片| www.亚洲男人天堂| 久久精品色综合| 91看片破解版| 精品久久久久久久久久| 日韩在线资源| 久久精品中文字幕一区二区三区 | 亚洲资源在线观看| 国模吧精品人体gogo| 亚洲一区二区三区香蕉| 西西裸体人体做爰大胆久久久| 久久精品一区二区三区四区五区 | 动漫一区在线|