登陆 / 注册 搜索

USERCENTER

站内搜索引擎

查看:4968| 回复: 6
打印 上一主题 下一主题

一个键盘的自述

[复制链接]
跳转到指定楼层
楼主
仗剑天涯吾是土豪 发表于 2017-6-25 13:31:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
        我是一个键盘,和我的兄弟鼠标一样,是个典型的输入设备,像我这样的I/O设备多如牛毛,比如显卡,声卡,网卡,打印机,扫描仪,CD-ROM等等。
1 |) Y8 H* I+ ^2 ?5 E- g$ |4 C/ Y2 ]# M, p4 x  a4 n9 b
        CPU和内存很明显是第一等公民,这一对好基友占据着二环内最核心、最金贵的土地,居高临下对外发号施令,从各处“抢劫”二进制数据到自己的地界来。其他的都被归类到二等公民,居住在5环以外,统称为输入输出(I/O)设备。  b" S2 E: J8 J

% Z# O9 |1 g$ K% C. g; `  ~* n8 v# j6 Y        这个世界存在阶级歧视的,我确信。#381:; m" y, C1 _9 z) {1 _; T$ E

. }8 C- I+ e, K/ t        有些设备居无定所,通过USB临时接入到计算机,待个三五天就走,典型的“北漂”。
7 h, c( l% z, D5 j- n' u& \" j( R, N& F' n
        哦对了,我必须得说明,硬盘的地位有点特殊,虽然它也是个I/O设备,但是它存储着所有的程序和数据,包括操作系统老大!+ R- L7 q- ~. m+ u9 \5 s% ^

& c6 r7 s, D2 Y; L        虽然经常被CPU和内存嘲笑,但硬盘应该属于1.5等子民,住在三环以里。操作系统老大把我们这些二等公民笼统的划分为两类:块设备字符设备
* I8 h, H% ]+ O' u1 z, F6 @8 e
2 V& ]1 V  h, N; j9 o        硬盘,CD-ROM,U盘是典型的块设备,数据存储在固定大小的块中,每个块都有一个地址,就样门牌号那样。像我,鼠标,打印机很明显就是字符设备,哪有什么块结构? 就是用一个个字符组成的流而已,也没有什么地址。
$ ]- L6 E) E3 S# P) V& q' }& O0 |/ L* \) X! w6 f8 X
        还有一种分法是存储设备(硬盘),传输设备(网卡,调制解调器)、人机交互设备(我和鼠标,显示器也算),不管怎么划分,我们二等公民的身份都无法更改,也住不到二环去,那里房价实在太贵了。( U8 J6 {- T6 P% S# A& Z

9 W6 n  T! r# q$ [. q6 N        夜深人静的时候,我和二等公民朋友们经常探讨这个经久不衰的问题:咱都是人,为啥就住不到二环去?8 _; W/ |, \8 p7 e
7 B  k4 Z9 N9 a  |2 p

4 D1 z1 U: [0 `2 h- a! s  f
 crop.jpg 一个键盘的自述
  [! p8 R) i. F0 p  \# h
        鼠标说:这都是命啊,计算机刚发明的时候,只有最基本的计算功能和存储功能,哪有什么显卡,声卡,网卡?CPU和内存的祖先占据了二环,并且一直在那里经营至今,现在都不知道是多少代了。
% P3 Z( u, l+ d& i5 `) R
* z/ ]) c5 a0 `# E, N6 u        我说:唉,也是,我们的祖先还是出现晚了,没有占据好地界儿。
3 z0 C' G$ q2 Y' ?% [4 W9 Y0 G' c$ T; z3 q
        网卡说:这个不对的,关键是我们没本事,干不了CPU的活啊。" ~' L0 P2 n% y7 B, Z  a7 H: H

9 W# K- A9 E. c* u4 i2 ~# j        “那算啥,我的GPU运算速度已经很厉害了,很多超级计算机还用我做运算部件呢,知道不?”显卡说。% Q4 g( [3 M6 o
& _  I' O" d2 V( _* ~
        鼠标说:别想那么多,其实二环生活也不轻松,你看看一开机,CPU阿甘和内存就忙的不可开交,累得要死。像我和键盘,尤其是你键盘,除了码农写程序,半天都不用一下,还是知足吧。$ ^; w  h! g2 u0 T
        0 N0 \5 B/ Z( G- _5 ?
总 线 和 端 口
        ' q+ p, P; H: L5 |/ {  I, c
        虽然我们是住在五环外的二等公民,但是CPU还得和我们打交道,那CPU是怎么和我们联系的?
  Q* S7 }9 k+ N
2 |) F) I, @( _2 j' ?/ t
 总线.png 一个键盘的自述
4 j0 N- }* A2 W1 M: |6 D
        一种办法就是CPU和每个I/O设备之间都扯一根线,有多少个设备就扯多少根,组成了一个以CPU为中心的星型布局,很明显这样太麻烦了,尤其是来了新设备怎么办?% N" }7 |  ^$ e  [
- ?+ Z; E  Q+ O2 F* f
        后来我们采用了“总线”这个概念,大家都挂到这一条“总线”上,CPU想找谁了,就在上面吼一声。! @$ X+ u1 c; @4 I$ f

- J' i. [; i% m* M. e  L        当然这种方式也有缺点,当一个人在总线上吼叫的时候会霸占总线,其他人都得等待。还有这么多设备,CPU怎么知道谁是谁?# t) N9 _  X; O5 D6 o8 q

6 q) d0 S* v0 T$ Q8 [        首先肯定得给每个设备编号,比方说硬盘(更准确一点是,硬盘控制器)的编号是320,图形控制器的编号是3D0,这个编号就被称为IO端口。有时候CPU会更懒,他和内存商量好,把我们这些IO端口映射到内存中去,这样CPU访问我们的时候,就像访问内存地址一样了。称为内存映射I/O/ C6 Y# o  _1 B: |, p1 ^# g0 S0 h

8 ^- |, O6 f! q2 v! h. d* m1 u! S
 内存映射io.png 一个键盘的自述

! `( \/ R' E/ ?9 r  |' h' T- X
轮 询(程序式I/O)
       
        现在CPU知道了我们在哪儿,还知道我们的编号,接下来就可以和我们通信了。这时候我们又遇到了那个老问题:CPU太快,而我们I/O设备太慢,毕竟机械设备的速度是无法和电子设备相媲美的。#365:' f- l) K; o/ R2 ]" N
2 d3 J  h) e. f; A. `  q/ b
        比如说有个进程要读取硬盘上的文件,CPU代表该进程向磁盘控制器发出指令:/ m. [+ u$ R9 c2 b+ X. w* q
) O6 \' O  g& V5 Z% g
        CPU:硬盘硬盘,把你第1023689号磁盘块的内容给我拿过来
' {' V7 I8 h+ G# m' Y! s
: s2 M8 g2 {6 ^' R8 r) t        硬盘:好的。2 w2 X7 E  S6 J: L* \) T* n

- o) S5 d; w( z        CPU:弄好了没有?  ?% h% c9 m7 u5 K2 K

! R( U$ E1 L/ F8 P- p, h% y6 Y        硬盘:还没有。& ]3 q9 B7 [+ p7 q5 V( M3 L$ k
7 L4 S# W3 v# g9 [
        CPU:弄好了没有??( c, p3 y; n% ~$ t0 a8 L
1 j* P. k" e2 F. u. U
        硬盘:还没有还没有。。: e) ?! S4 L' \  K: P
4 d5 B- J! g9 H
        CPU:到底弄好没有?快点!
% p5 J, `9 \9 B) D: ^
' N1 m' t0 P5 g! s/ |        硬盘:都说过没弄好了!!!
/ d* s5 T) {0 D
3 ?* @' L2 }& c9 f$ U  c        CPU:弄好了没有?!
8 F# V# u! ~* X$ \, R6 A! E* `; e. w$ d# u; m# p
        硬盘:@#¥%……&&#j332:
, _0 B* P) o9 E# J% R6 c
+ S7 u0 W  }% z; z        CPU一直霸占着总线,不厌其烦的问硬盘弄好了没有,别的啥事也不做,这叫做轮询,或者叫做程序控制的I/O
4 U6 o; a* u! t* [
* @9 ~' Y+ a& N        由于CPU比硬盘快百万倍,很明显CPU被浪费了。/ v8 J2 O! r8 W0 @

! l) v4 r- p0 Y4 w5 o0 w& H/ W2 E4 t
中 断
        2 o2 k$ ~% S/ {
        大家都觉得这样不合适,因为CPU忙着和硬盘“卿卿我我”,把别的I/O都抛弃了,像我,鼠标即使有什么数据等着CPU读取,他也不搭理我们。
9 J8 I2 O* ?* M! P( k- O' c; {% c9 K0 B+ k
        后来就改成了这种方式:# Q. C) u+ O: c8 ~; h

3 {5 y8 |: n! @        CPU:硬盘硬盘,把你第1023689号磁盘块的内容给我拿过来,你弄好了以后告儿我一声。9 x1 R8 V- a( P, |2 R" f+ @+ B

9 w' y/ J" y" c5 H7 g        硬盘:我怎么告诉你啊?: Y& p$ K& r- A6 k* E& _& {! x

) @* P. p& p  ]9 ^        CPU:我有一个中断请求线,你弄完了可以往这个地方发信号,我每次执行完一个指令都会检查。
1 B; [1 K$ s$ ^' D& X
% f! W2 L# y. K$ F3 j  V        硬盘:好的(CPU干别的事儿去了,当前进程A阻塞,另外一个就绪的进程B开始执行)0 Q; E' o* w5 z) v8 p9 e% G4 @

1 w3 V9 i) Z$ G7 f) ]3 y        过了不知道多少纳秒。。。。。; k7 t" G" w- [5 ^) |% w: V& d6 ?
  S! H' t9 E) \- t
        硬盘:CPU,数据好了,赶紧过来取走。" n7 {2 M; H/ b  d( N# H

$ ^  Q* L# ~; ~* Y! A        CPU:稍等,我把当前的进程B给保存了,然后就去处理。(CPU执行中断处理程序,读取数据.....)
, |, O$ D3 p- b' Z- M; a$ q. c: ^/ E7 _- G, p5 {: D1 k) S
        这就是“中断”方式,有了中断以后,这些平时都不怎么露面的I/O设备都跳出了抢着发中断,“调戏”CPU,CPU乱成了一团,系统也乱成了一团。CPU不胜其烦,后来专门找了一个叫中断控制器的家伙专门负责协调,这家伙确实厉害,一上场就说:
1 S8 r- v( c3 ^3 Y       
( D" x; p  B: o4 ]. J        只有我才能给CPU发中断,你们的中断请求统统发给我啊,我来裁决谁的优先级高,谁能“调戏”CPU。
% J0 D, N  Z$ L  {; `
' O1 p! b: _% q' h0 v7 r        这样一来系统清净了。#j337:
1 G8 U1 e' d! k3 s7 `# m1 w# {% ?* v. I$ |/ N, J4 I2 @0 c
        注:这种“中断”的方式,其实就是一种异步的、事件驱动的处理思想,在计算机软硬件上应用非常广泛,例如Node.js,AJAX等等
4 G: a- H; A$ l# l0 Q        , R7 v; T# l) J: v) p
D M A
       
' v1 \! ~6 Q% r7 a        但是我知道,CPU和内存才是系统的核心,CPU运算时候只认内存这个好基友,所以所有的数据不管是谁产生的,不管是1.5等公民硬盘,还是2等公民键盘,鼠标等,数据统统都得搬到内存去。  J( B" V1 X) x- P& r

# T/ M& U0 X  }5 H& r$ ?        这就给我们带来了一个挑战:数据的搬运
9 T, E# l! i- ]. s! w
4 R% K$ s# v( a% Y/ U' Y) x        中断的方式对于小数据量传输是有效的,像我是一个键盘,每次你按下一个键以后,我就会发出一个中断告诉CPU,CPU就能发出指令,把这个一个键对应的字符搬到内存。" d& }# v/ H5 I9 h
  V3 \8 J. W& E- J: N4 d- h# c) k
        但是对于大数据量传输尤其是像硬盘这样的,CPU还得花费大量的时间和精力不断的发出指令,让磁盘控制器把数据从硬盘搬到内存去,这相当于又陷入了程序式I/O的陷阱。对于类似这样的情况,我们也有办法处理,就是用一个DMA控制器,使用这个专用的处理器进行I/O设备和内存之间直接的数据传输,脏活累活都被这个DMA给处理了。7 Y, O6 G* Y6 G' d
& n, D9 `' L; ^" q
        CPU:硬盘硬盘,把你第2333333号磁盘块的内容发送到内存的xxx地址去,弄完了告诉我,我去干别的事儿去了。  ~- X5 e8 o  y3 D& V
% ^& Q4 I& M2 Z9 x, f2 o
        硬盘:好咧,DMA,我这儿有数据要传输,数据一共有4096个字节,要传输到内存的xxx地址去。% `- L* A9 S2 _! R4 D* U+ ]

6 U* Q; s& b. f5 G4 I        DMA:没问题!(DMA控制器开始哼哧哼哧的干活,把这4096个字节复制到xxx地址)
$ c( ?  y4 @' ]0 D* ]% f. R3 Y5 b
4 V1 @: b7 ^7 S) d& ]4 j1 J0 P0 K        DMA:CPU,数据已经在内存中了,可以用了啊。
: K  x4 n, ]3 p* N) u7 ~4 _/ T# l0 L: m: h8 `' ]1 r; C
        CPU:怪不得刚才有时候我没法使用总线,是不是你小子霸占着啊?
9 H! n* B  v; {  c* W3 J. P" V& Z& @& H$ T, ~5 b4 w
        DMA:我不用总线怎么搬运数据到内存?我也没有挪用几个时钟周期啊,再说了你还能使用你的一级缓存和二级缓存不是?
: H! m$ E' Q. y6 B; p5 h. P  Z% Z( L/ \5 Z4 r  i2 x& r: U/ H
        CPU:好吧,看在你帮我干了这么多苦活累活,就算了吧。#j335:2 J2 e  m) Z: Q. Y/ N  Y
        5 X0 v' t) _+ V+ S9 R
键 盘 的 工 作 原 理
       
        说了这么多别人的事儿,也该说说我自己了。我和鼠标一样,是个非常简单的I/O设备,每次你按下和释放键盘上某个键的时候,我就会产生一个扫描码,例如你按下A,扫描码是"1E",释放A,扫描码是"9E"- B7 M; b& P2 U  ]/ N# o

; P5 h1 }: u- W# S1 K" w0 H: C        我把这个扫描码放到0x60端口,然后向CPU发中断,当然得通过中断控制器了。CPU会调用中断处理程序,读这个0x60端口,取到扫描码,翻译成ASCII码就可以使用了。
) ^1 Q; R  R5 {5 q  Q! I1 |
) b0 D; ~$ n' g5 A* W9 M        那么问题来了,假设系统中有好几个进程都在等待键盘的输入,这个中断处理程序获得ASCII码发给谁呢?怎么发过去呢?这个问题留给聪明的小伙伴们~8 F# G! p6 h) G1 V0 f) X. a
7 H% x5 J- \, h4 [9 C! n3 O
上一篇:路由器和猫(Modem)有什么不一样?摘要:生活中,我们经常听到路由器和猫这两个词,对应的英 ...
下一篇:一块硬盘的自述摘要:我是一个非常精密的存储介质,虽然具有坚固冰 ...
回复

使用道具 举报

站在你身边的人「锋芒初露」 发表于 2017-6-26 18:30:32 | 只看该作者
学到了#j335:
板凳
清风徐来出类拔萃 发表于 2017-6-26 20:23:17 | 只看该作者
记得作文也是这么写的; E; K9 |" K( K% A0 a
小河的自述
+ c# J7 H/ D4 M" a地球的自述1 y. L: h4 K7 a4 z& n
森林的自述) P, X1 ~) }: s0 W4 l5 F. r# }
海洋的自述( h) Z$ A; ^) _
..................
  收起(1)
地板
雾月「锋芒初露」 发表于 2017-9-4 10:27:55 | 只看该作者
你们那些十五字神马的完全弱爆了  r- c9 H8 H0 n! q
5#
柔光的暖阳出类拔萃 发表于 2018-1-20 23:15:39 来自手机 | 只看该作者
回个帖子,下班咯~
6#
流星☆坠落出类拔萃 发表于 2018-1-25 15:13:23 来自手机 | 只看该作者
锄禾日当午,发帖真辛苦。谁知坛中餐,帖帖皆辛苦!
您需要登录后才可以回帖 登录 | 立即注册  

本版积分规则

关于我们|小黑屋|手机版|Archiver|古黑论

GMT+8, 2019-6-25 04:01 , Processed in 0.129100 second(s), 41 queries , Redis On.

© 2015-2019 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表