关于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,生活在一个大的虚拟内存(虚拟空间)中,却从来感觉不到自己是虚拟出来的。而每次他需要进入虚拟空间的那个东西,就是从脑子后面插进去的那个东西,就相当于驱动程序么,把用户空间(虚拟内存,虚拟世界)和内核空间(真实内存,真实世界)联系起来了。
那么,linux中怎样才能够像我们平常操作单片机一样来操作寄存器呢?
这就必须涉及到linux的体系结构了。linux把内存划分为所谓的“内核空间”和“用户空间“,在用户空间中,内存是虚拟出来的,每一个进程都有一个单独的虚拟内存(什么叫做进程呢?简单的一个理解方式,就是我们平常所写的一个main函数),这个虚拟内存是从0开始的,无论用户想写什么程序,访问哪一段内存,都是可以访问的。但是,值得注意的是,这里的内存是虚拟出来的,并不是我们平时用单片机访问的实实在在的内存。
而内核空间中,访问的内存都是真实存在的。但是,真实存在,并不一定代表你能够访问这个地址——内核这个东东需要得到保护,倘若编程人员不小心误操作,在内核运行的内存中写入了不该写入的东西,那么就kernel panic了,就悲剧了...
于是,linux专门开辟了一段内存不用的区域,用来给提供给用户来访问真实的寄存器。但是,这一段内存的地址,和我们单片机(比如ARM9)中寄存器的地址极有可能不一样,那么怎么办呢?
于是,有了内存重定向的一个概念,把一段内存映射到另外一段内存中去,最终,我们实际上访问的是重定向之后的内存空间。
那么,这个重定向是怎么实现的呢?就是通过ioremap这个函数来实现的,具体可以百度之
这篇帖子里面的内容。
多说一句,这里的重定向,是指在驱动程序里面,可以进行内存的重定向——驱动程序是运行在用户空间和内核空间的一个接口,因此可以访问实际的内存地址(无论是不是重定向了)。但是,我们写的用户空间的应用程序,是无论如何也访问不了实际的内存的——想想就明白了,因为整个程序都是运行在虚拟内存中,怎么能意识到自己实际上在哪里呢?
说到最后,所谓虚拟内存,其实就是类似于《黑客帝国1》里面的neo,生活在一个大的虚拟内存(虚拟空间)中,却从来感觉不到自己是虚拟出来的。而每次他需要进入虚拟空间的那个东西,就是从脑子后面插进去的那个东西,就相当于驱动程序么,把用户空间(虚拟内存,虚拟世界)和内核空间(真实内存,真实世界)联系起来了。
相关文章推荐
- 关于通过http请求访问Linux下的ftp的问题以及解决办法
- 关于因各种原因,造成LINUX主机不能通过域名访问自己的解决办法
- 关于阿里云服务器Linux安装Tomcat后,外网不能访问解决方案
- 关于Linux权限问题(由samb访问所引起的)
- 【从零开始,从内核驱动驱动到用户空间调用】编写第一个linux驱动,通过端口访问I/O寄存器。
- 关于Linux访问web遇到403 Forbidden的问题
- 关于复制linux虚拟机后网络无法访问问题
- 关于Linux中外部不能访问tomcat
- 关于Linux 设置ip绑定问题 以及mysql 设置固定Ip访问问题
- 关于Linux文件访问权限与设置用户id位
- Linux访问Windows共享文件夹,关于mount cifs的一个问题
- Windows 与 Linux下关于端口不能访问的问题
- 关于在 Linux 下多个不相干的进程互斥访问同一片共享内存的问题
- 关于windows通过cuteftp访问linux的问题
- linux_apache服务知识总结(二)(关于用户的访问控制及编译安装)
- (zz)linux - 驱动中如何访问CPU中的寄存器?
- (zz)linux - 驱动中如何访问CPU中的寄存器?
- Linux关于文件和目录的访问权限
- linux下访问寄存器