Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1024475
  • 博文数量: 238
  • 博客积分: 2842
  • 博客等级: 少校
  • 技术积分: 2765
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-16 00:20
个人简介

stdlf

文章分类

全部博文(238)

文章存档

2013年(6)

2012年(13)

2011年(82)

2010年(89)

2009年(48)

我的朋友

分类:

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). 由两个 cascade8259所提供. 当有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,则可以看到超过15IRQ !

* 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 来取得地址.

 

阅读(663) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~