读书人

linux中的内核态和用户态的区别!该如

发布时间: 2012-02-28 13:06:36 作者: rapoo

linux中的内核态和用户态的区别!
看了下书,发现Linux的内核态是映射到3G以上的内存,而普通的用户态则映射3G以下的内存,但是有一个问题这些对应的同样的一个物理内存块,怎么会映射到不同的空间哪?怎么能实现这个哪?理解不了!
还有,如果,我要在自己的程序中使用如下的指令:
unsigned int *timerCntAddr = 0x100000;
也就是我直接在程序中访问CPU的定时器的一个寄存器,这样能成功吗?会引起什么异常反映吗?

[解决办法]
程序中的地址是虚地址,并不是物理地址,要通过目录表和页表影射才能得到物理地址,因此相同的虚地址,可以影射到相同的物理地址或不同的物理地址,这取决于使用的目录表和页表。你可以看看ia32结构的文档。
[解决办法]
也就是我直接在程序中访问CPU的定时器的一个寄存器,这样能成功吗?会引起什么异常反映吗?

cpu运行是分4个等级,内核程序运行在“0”级,你的程序运行在“3”级每个级别能够执行的指令是不一样的。操作外设是操作系统系统和驱程干的,你是操作不了的,你连物理内存都控制不了。如果你能控制外设,那是操作系统没写好
[解决办法]
lz 首先不管运行在什么态
先看你是否处在mmu管理之下
如果是那这个地址是虚拟地址会被重新计算其权限
结果一般会是一个申请的不允许操作的地址

[解决办法]
可以在内核态写硬件寄存器,可以写一个系统调用来实现,只要从用户态trap过去就可以了。
其实二者就是通过设置一个cpu的寄存器来区别的,用户态限制了一些指令和内存访问范围。


[解决办法]
cr3 cr2
去看杨季文的汇编后面的保护模式

读书人网 >C++

热点推荐