您的位置:首页 > 运维架构 > Linux

关于linux下访问寄存器

2011-10-28 09:49 288 查看
由于linux体系特殊的结构,于是我们在嵌入式linux中是不能够直接访问寄存器的。比如,我们在51中,想让一个IO口输出高电平,只需要让相应的寄存器置1就可以,但是,linux为了保证其程序的可移植性,以及程序的稳定性,不允许这样直接访问寄存器。

那么,linux中怎样才能够像我们平常操作单片机一样来操作寄存器呢?

这就必须涉及到linux的体系结构了。linux把内存划分为所谓的“内核空间”和“用户空间“,在用户空间中,内存是虚拟出来的,每一个进程都有一个单独的虚拟内存(什么叫做进程呢?简单的一个理解方式,就是我们平常所写的一个main函数),这个虚拟内存是从0开始的,无论用户想写什么程序,访问哪一段内存,都是可以访问的。但是,值得注意的是,这里的内存是虚拟出来的,并不是我们平时用单片机访问的实实在在的内存。

而内核空间中,访问的内存都是真实存在的。但是,真实存在,并不一定代表你能够访问这个地址——内核这个东东需要得到保护,倘若编程人员不小心误操作,在内核运行的内存中写入了不该写入的东西,那么就kernel panic了,就悲剧了...

于是,linux专门开辟了一段内存不用的区域,用来给提供给用户来访问真实的寄存器。但是,这一段内存的地址,和我们单片机(比如ARM9)中寄存器的地址极有可能不一样,那么怎么办呢?

于是,有了内存重定向的一个概念,把一段内存映射到另外一段内存中去,最终,我们实际上访问的是重定向之后的内存空间。

那么,这个重定向是怎么实现的呢?就是通过ioremap这个函数来实现的,具体可以百度之

这篇帖子里面的内容。

多说一句,这里的重定向,是指在驱动程序里面,可以进行内存的重定向——驱动程序是运行在用户空间和内核空间的一个接口,因此可以访问实际的内存地址(无论是不是重定向了)。但是,我们写的用户空间的应用程序,是无论如何也访问不了实际的内存的——想想就明白了,因为整个程序都是运行在虚拟内存中,怎么能意识到自己实际上在哪里呢?

说到最后,所谓虚拟内存,其实就是类似于《黑客帝国1》里面的neo,生活在一个大的虚拟内存(虚拟空间)中,却从来感觉不到自己是虚拟出来的。而每次他需要进入虚拟空间的那个东西,就是从脑子后面插进去的那个东西,就相当于驱动程序么,把用户空间(虚拟内存,虚拟世界)和内核空间(真实内存,真实世界)联系起来了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: