stdlf
分类:
2011-07-04 22:37:20
在此,想先提一下所谓的系统资源(system resources). 在计算机的世界里,所谓的系统资源约可分为四大类,亦即: DMA, Memory, IO, and
Interrupts. (大家若是仔细检视一下 [我的计算机]->[内容]->[硬件]->[装置管理员]->[检视]->[资源(依类型)],便可以发现我想表达的)
* DMA:
=> CPU可以说是系统的大脑;在没有DMA时,CPU几乎得参与所有的事情;但是有了DMA后,可以让 DMA controller或是bus-mastering devices自己来执行data
transfer from and to memory,CPU只在开始及结束时参与;如此CPU可以做其它事情. 典型的计算机系统有八个 DMA channels. 检视
"资源(依类型)"中DMA的部分可以知道哪一个 channel被哪一个 device使用.
* Interrupt:
=> 周边devices请求 cpu 服务的方式. 一般的计算机系统中有 16IRQs(IRQ0~15). 由两个
cascade的8259所提供. 当有device透过 IRQx发 interrupt时, CPU会被告知;然后,CPU最后会得到对应于该IRQx的 service routine的
entry point,之后便跳到该处去执行ISR(interrupt service
routine). 现在的计算机系统有发展出APIC mode(有别于原有的8259 mode),其目的在于提供更多的 interrupt inputs以及专有的interrupt机制.
在检视 "资源(依类型)"中的interrupt可发现: IRQ 0/1/4/6/8/12/13/14/15其实是dedicated to specific devices使用的;而剩下的IRQs则是分给PCI devices共同/单独使用. 若是APIC mode,则可以看到超过15的IRQ !
* Memory:
=>在此所谓的memory,并非指内存模块那种memory,而是: CPU memory addressing
space ! 亦即,以32-bit CPU而言,可以寻址到的 memory space is 2^32 = 4GB. 这么大的空间就是一种资源 !因为,在此范围内,CPU可以完全存取,而且,也是有限的 !那,要如何利用这么大的资源呢 ? 方法就是所谓的 "Mapping(映射)".
举FM为例,在收音机上一定有旋钮可以调,亦即, FM的波段是有范围的. 只有在此范围,才能收到讯号(<-这也是资源). 然后,在此范围内,要发射讯号的人,会先提出申请,看要使用那个频率,经过认可后便可以使用该频率波段了. 所以在此范围内便可以听到警广,中广,空中英语教室...等的广播. (记住: "每个人" 都可以使用该资源中的"一部份",只要"被核准"...)
Memory space 也是一样 ! 在广大的 0~4G space中,也有很多人可以使用. Ex. 内存模块可以使用某一块,BIOS ROM也可以使用某一块, PCI devices也可以使用某一块,APIC也可以使用某一块,...etc. 常见的字眼 "Memory map" 就是阐述这样的观念 !
*I/O
=> 同理, IO 指的也是 CPU I/O addressing space. 也是一种资源. 现在 I/O addressing space 是 0000h~FFFFh,共64KB的范围.
[Summary] 资源是有限的,要斟酌使用 ^_^
[补充memory部分]
假设系统插有1G内存,使用外部的显示卡,且使用512KB BIOS ROM,则:
[Part1]
-memory space 0~(1G-1)被此1G内存所占用;或说此1G内存被映像到memory space 0~(1G-1);只要CPU存取这个范围,就会存取到此1G内存.
Ex. 在BIOS中写:(前提: in big-real mode)
xor ax,ax
mov es,ax
mov esi, 00000000h
mov al, BYTE PTR es:[esi] ; access 此1G内存中 位置0处的数据 !
[Part2]
-memory space 1G~4G 则是由"其它人"所占用,例如:(below are examples ONLY)
1.memory space 0xD4100000~D410FFFF是由 Ethernet card的
operational registers 所占用
2.memory space 0xD4204000~D4204FFF是由 USB 1.1 host的
operational registers 所占用
3.memory space 0xD4206000~D4206FFF是由 USB 2.0 host的
operational registers 所占用
4.memory space 0xD4200000~D4203FFF是由 High Definition Audio的
Operational registers 所占用
5.memory space 0xFEC00000~FECFFFFF是被 IO APIC 所占用
6.memory space 0xFFF80000~FFFFFFFF是被 512KB BIOS ROM 所占用
.....
只要CPU存取这范围,则会access到 "对应" 的device registers.
Ex. 假设要access USB 1.1 HOST's
operational register offset 0,则BIOS只要写:
(前提: big-real mode)
xor ax,ax
mov es,ax
mov esi, 0D4204000h
add esi, 0 ; 0 means offset 0
mov al, DWORD PTR es:[esi] ; access
[Q] 那问题来了:CPU发了一个memory cycle,谁来决定/如何决定要给谁(内存 or USB 1.1 HOST OP
registers)呢?
=>chipset一定知道系统插了1G内存,也会将此信息,1G( = 40000000h ),记录在内部register中.当cpu要存取内存而发 address: 00000000h 的cycle时,chipset会将 address与 1G比较;因为小于1G,则 "知道" 要发给内存 !
当cpu要存取USB OP而发 address: 0D4204000h 的cycle时,chipset会将 address与 1G比较;因为大于1G,则 "知道" 要发给PCI devices, Ex. USB host !
* 1G这个 information 的有一个名词代表它: Top Memory ! 代表可用的内存的上限.
[结论]: 4G memory space 充斥着各式各样的 "H/W registers"(假如把内存也视为 registers,ROM chip也视为registers.....)
Q:问个问题一下古时候, VGA 的memory 是被mapping 到0xA000 的一个64KB 的area,如果你的VGA card 有1MB 的memory 就无法全部mapping, 需要banking 的动作.在big-real mode 中, 如果还是1MB 的memory 会是多大 ,它会比mapping 从哪到哪?
A:就我所知,以前的VGA display会使用到 installed memory
A0000h~BFFFFh间的范围;这是属于UMA(upper memory area)的一部份;其中A0000h~AFFFFh(64k) for VGA graphics mode memory;B0000h~B7FFFh for VGA mono
text mode memory;B8000H~BFFFFh for VGA color text mode memory.
*上述的 三块 memory 都是 video memory(or called
frame buffer),用来储存要显示的image的内存
* 还记得组语练习中有 output color text to
screen,其中所用到的 segment = B800h !!!
( for color text )
当program存取到这块时,VGA card便会 read it and 负责将之显示到 monitor !
现在的 VGA cards则是含有 built-in video memory;虽然不是使用系统内存,仍是被 mapped to A0000h~BFFFFh.(此时,很重要的一点是:系统内存的 A0000h~BFFFFh不再被VGA display用了....这点之后会提到,将被用来放 SMI code...)
你所说的1M memory,因为无法全部 mapped,所以有 bank switch来解决;那么我的感觉是:还是一样用 bank switch来解决
!!! 没有变...
因为,我所知道的 memory map中在1M以下只有 A0000h~BFFFFh for Video card用的(你从 资源(依类型)中去看,也可以发现这范围是给 display用的...) 而且,in big-real mode 也不会让 1M memory可以完全 mapped,这是没关系的 !
这个其实跟系统chipset无关, 跟VGA chip比较有关. 如果VGA chip不支持 linear frame buffer, 我想你只有用banking的方法做. 如果有支持, 正确方式是要透过VBIOS. VBE 2.0以后有定义linear frame buffer的地址位置.你可以呼叫 return VBE mode infomation 这个 function call 来取得地址.