|
文件: |
um_s3c2410s_rev12_030428.pdf |
大小: |
2338KB |
下载: |
下载 | |
bob.zhang 助人乃快乐之本 说:
就是对于 io内存映射 , kernel把 外设寄存器映射到kernel的 内存空间中来 , 那是不>是 kernel可用的实际内存就少了呢。
wheelz 说:
应该是这样,外设寄存器,如果支持memory mapping的话(这可能和CPU的体系结构以及外>设都有关系),首先要映射到系统的物理地址上,这部分工作并不见的是kernel做的
有可能是硬连线的,或者总线有某些机制,可以把设备的寄存器以memory地址的方式,映射
到系统的物理地址上。
bob.zhang 助人乃快乐之本 说:
>> 有可能是,硬连线的,或者总线有某些机制,可以把设备的寄存器以memory地址的方式>,映射到系统的物理地址上。
那这样的话, 是不是也还是需要进行ioremap()映射呢?
wheelz 说:
对,
这种映射只是映射到物理地址
由于CPU只能使用虚拟地址
因此必须建立页表
以便把这个物理地址映射到虚拟地址
这就是ioremap()的目的
bob.zhang 助人乃快乐之本 说:
不好意思,我对硬件不太懂, 可能是1+1=2 的问题: 就是为什么 把外设的寄存器映射到memory的物理地址上,然后ioremap() 就可以访问了呢? 这是什么机制或者原理呢?
wheelz 说:
我其实也不是很懂硬件
bob.zhang 助人乃快乐之本 说:
有的时候, 就是有些湾转不过来。^_^。
wheelz 说:
是这样
外设的寄存器肯定是以某种方式连接到系统的总线上的
有地址线,和数据线
如果地址线是直接连接到memory的地址空间的话
那么,在memory 总线上用某个地址,就可以访问这个寄存器
bob.zhang 助人乃快乐之本 说:
>>这种映射只是映射到物理地址
你的意思是 把外设的寄存器 统统映射到内存的物理地址上来, 统一编址 , 这样cpu就可
以区分每个外设了。否则 每个外设初始都是 0 , cpu区分不了啊。
wheelz 说:
是的
bob.zhang 助人乃快乐之本 说:
看来, 我应该再复习一下《微机原理》 了。 ^_^。
wheelz 说:
外设的寄存器是否能够映射到物理地址
和CPU本身,以及设备,以及连接方式可能都有关系
这种映射到物理地址,有可能是硬件连线就直接把寄存器的地址连接到内存的地址上,
这是固定的,也有可能是总线有某些机制,可以动态地映射到不同的内存物理地址
比如PCI总线
bob.zhang 助人乃快乐之本 说:
>>有可能是硬件连线就直接把寄存器的地址连接到内存的地址上,
就是说 这个外设自上电后, 就自动拥有了一个物理地址了?
wheelz 说:
从道理上说,这是可能的
但这种方式比较原始
也许某些嵌入式系统就是这样的
比如我知道很多flash就是这样以固定的物理地址连接到板子上
bob.zhang 助人乃快乐之本 说:
>> 这是固定的,也有可能是总线有某些机制,可以动态地映射到不同的内存物理地址
还是这种方式灵活,而且不易冲突。
bob.zhang 助人乃快乐之本 说:
哦, 你这么说我觉得很有可能 , s3c2410 ,也许她的RTC 本身就是直接连接到 RAM总线上
去了 , 所以那个组织才改了RTC-2410.c ,才敢直接用物理地址, 而没有用RTC_BASE
bob.zhang 助人乃快乐之本 说:
>>比如我知道很多flash就是这样以固定的物理地址连接到板子上
我看 nandflash的起始地址和 norflash的起始地址不同呢, 也序就是这个原因吧 。
wheelz 说:
起始地址不同,完全是板子的设计的问题
设计者想把norflash放到什么地址上,就可以放到什么地址上
nandflash也是这样
只要不和系统真正的ram地址不冲突就可以
bob.zhang 助人乃快乐之本 说:
那为什么不从0开始呢? 我看我们的cpu (marvell板子的) , ram起始地址就不是0 , >为什么要这样呢?
wheelz 说:
不放在0开始的地址,可能是因为某些CPU在上电的时候,要从地址0开始执行指令,因此0开
始的地址必须是ROM
而不能是RAM
bob.zhang 助人乃快乐之本 说:
我有点搞糊涂了。
>> 设计者想把norflash放到什么地址上,就可以放到什么地址上
你说的这个地址是什么地址呢?
wheelz 说:
物理地址啊
bob.zhang 助人乃快乐之本 说:
我明白了, 就是说也把 flash当成一般的外设来进行操作了。 哦, my god !
wheelz 说:
从这个意义上来说,内存也是外设啊
bob.zhang 助人乃快乐之本 说:
这样的话, 就在上电以后, 系统初始化的时候, kernel 就应该会把所有的物理设备,外
设的registers都映射到物理地址上去, 然后把这些分配到的物理地址写入到 pci device>里面 base addr 里面去。 是这样吧?
bob.zhang 助人乃快乐之本 说:
我以前看过pci ,似乎是这样的。
wheelz 说:
这个映射,不一定是kernel做的
wheelz 说:
如果是硬件固定连线的话,一上电就就已经映射到物理地址了
PCI总线设备是怎么映射的,我现在有点忘了
应该是有一个机制
也许需要内核的参与,或者是BIOS的参与
bob.zhang 助人乃快乐之本 说:
哦, 对! 没错! 所以kernel 在给那些外设分配物理地址进行映射的时候, 就怕和硬连>线冲突啊。
wheelz 说:
是
bob.zhang 助人乃快乐之本 说:
好像是, 我记得也是。 现在的kernel对于pcidevice的初始化, 已经可以完全靠自己了,
不必依靠bios 了。
bob.zhang 助人乃快乐之本 说:
好多pci_bios_XX() 其实没有用到BIOS的信息。
wheelz 说:
可以选择使用BIOS或者不用
bob.zhang 助人乃快乐之本 说:
完全同意! 尤其是 嵌入式这方面, 因为没有bios
wheelz 说:
不不不,这和嵌入式没有关系
我说的BIOS,就是指的i386
在谈到i386,也就是PC的时候,才存在是否选择使用BIOS的问题
bob.zhang 助人乃快乐之本 说:
哦, i386 确实比较依赖bios的。
wheelz 说:
其实,说白了,就是因为PC机的板子是有规范的,
bob.zhang 助人乃快乐之本 说:
那倒是, 搞嵌入式的就不一样了, 所有的板子都不太一样, 所以才有这么多的需求啊。 哈哈。
wheelz 说:
对
bob.zhang 助人乃快乐之本 说:
换个板子就得重搞bootloader 。
都像pc那样, 也就没有镐头了。^_^。
wheelz 说:
因此每个板子的初始化都是特定的
bob.zhang 助人乃快乐之本 说:
嗯。
wheelz 说:
所谓特定,就是说每个板子的外设,映射到什么物理地址,都了能不同
bob.zhang 助人乃快乐之本 说:
对对 , 没错, 所以 , 我们搞嵌入式得,说白了, 移植, 也就是再改一些地址。 就需
要看懂datasheet 啊 。
而且, 针对类似RTC这样得芯片, 针对cpu进行一些调整。
wheelz 说:
比如一个例子是:板子初始化的过程中,会把这些映射记录下来,然后,内核使用platform_get_resource()得到这些地址映射
bob.zhang 助人乃快乐之本 说:
o , 原来如此, 回头我好好看看 这个函数 ,
wheelz 说:
这个函数没什么可看的吧?
就是查找啊
bob.zhang 助人乃快乐之本 说:
对, 就是查找一个flags 是自己要求得那个类型得rsource就可以了。
wheelz 说:
是,这些flags,其实就是初始化过程中建立的
wheelz 说:
platform_XXX_XXXX()这样的函数一般用于嵌入式的系统
bob.zhang 助人乃快乐之本 说:
那么:
/* get the memory region */
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (res == NULL) {
dev_err(dev, "failed to get memory region resource\n");
return -ENOENT;
}
s3c2410_rtc_mem = request_mem_region(res->start, res->end-res->start+1,
pdev->name);
那返回得resource 范围也太大了, 我觉得应该返回跟RTC有关得那段就可以了。 但是她的
标志。。。
wheelz 说:
这可能和你具体的板子的初始化有关系
bob.zhang 助人乃快乐之本 说:
我想 由于设备得寄存器本身是连续得, 这样kernel就可以在初始化得时候,分配 resource , 这里返回得resource 但从函数来看应该 所有外设得 resource 才对, 但是 从后面>看 (request_mem_region()) , 这个resource 应该是专门属于 RTC 得才对啊。
wheelz 说:
要注意到,调用platform_get_resource()时,第一个参数是pdev,也就是说,找的是这个>设备的地址空间
bob.zhang 助人乃快乐之本 说:
>> 第一个参数是pdev,也就是说,找的是这个设备的地址空间
那就是这个pdev专指RTC chip? 这到说得通。
wheelz 说:
应该是RTC
bob.zhang 助人乃快乐之本 说:
这样就可以和后面得request_mem_region () 对应上了。
wheelz 说:
嗯
bob.zhang 助人乃快乐之本 说:
对了, 我觉得我请教您的这些问题,非常有典型性, 可否贴出来?
wheelz 说:
当然没有问题,不过我对硬件的理解很肤浅,可能会贻笑大方的,呵呵。
bob.zhang 助人乃快乐之本 说:
不会的 ,很有见解!
wheelz 说:
贴出来也好,这样如果有错误的话,别人也可以指出来
bob.zhang 助人乃快乐之本 说:
对对, 以后肯定是个精华贴啊 。
bob.zhang 助人乃快乐之本 说:
我个人很喜欢open source , 一直 在往这个方向努力 , 而且, 去年参加了 ntfs-3g 得
opensource , 负责porting到arm上去, 并进行测试, 后来也提交了 endian得patch 和
对 i18n的 alternative方案。 觉得挺开心的。 呵呵。
wheelz 说:
good job!
bob.zhang 助人乃快乐之本 说:
呵呵 ,thanks ! 我觉得投身到open source的开发中, 才能体现自己的价值。 而且我们
公司也用opensource , 我利用上班时间来作,正好是一举两得啊。
阅读(2281) | 评论(4) | 转发(0) |