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

yangss2006 2007-09-20 09:54:39
看了下书,发现Linux的内核态是映射到3G以上的内存,而普通的用户态则映射3G以下的内存,但是有一个问题这些对应的同样的一个物理内存块,怎么会映射到不同的空间哪?怎么能实现这个哪?理解不了!
还有,如果,我要在自己的程序中使用如下的指令:
unsigned int *timerCntAddr = 0x100000;
也就是我直接在程序中访问CPU的定时器的一个寄存器,这样能成功吗?会引起什么异常反映吗?
...全文
2389 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ayw215 2007-09-22
  • 打赏
  • 举报
回复
cr3 cr2
去看杨季文的汇编后面的保护模式
yangss2006 2007-09-22
  • 打赏
  • 举报
回复
恩,大体明白了!怎么区别段式和页式的内存管理的区别!他们的实现机制如何?Linux使用的事两个的混合是不是呀?请教了!
george3038 2007-09-22
  • 打赏
  • 举报
回复
可以在内核态写硬件寄存器,可以写一个系统调用来实现,只要从用户态trap过去就可以了。
其实二者就是通过设置一个cpu的寄存器来区别的,用户态限制了一些指令和内存访问范围。

goodluckyxl 2007-09-21
  • 打赏
  • 举报
回复
lz 首先不管运行在什么态
先看你是否处在mmu管理之下
如果是那这个地址是虚拟地址会被重新计算其权限
结果一般会是一个申请的不允许操作的地址
248406869 2007-09-21
  • 打赏
  • 举报
回复
也就是我直接在程序中访问CPU的定时器的一个寄存器,这样能成功吗?会引起什么异常反映吗?

cpu运行是分4个等级,内核程序运行在“0”级,你的程序运行在“3”级每个级别能够执行的指令是不一样的。操作外设是操作系统系统和驱程干的,你是操作不了的,你连物理内存都控制不了。如果你能控制外设,那是操作系统没写好
248406869 2007-09-21
  • 打赏
  • 举报
回复
程序中的地址是虚地址,并不是物理地址,要通过目录表和页表影射才能得到物理地址,因此相同的虚地址,可以影射到相同的物理地址或不同的物理地址,这取决于使用的目录表和页表。你可以看看ia32结构的文档。
iamliadai 2007-09-20
  • 打赏
  • 举报
回复
看看x86保护模式的原理就知道了
独孤过儿 2007-09-20
  • 打赏
  • 举报
回复
补充,如果用强制类型转换可以哦
独孤过儿 2007-09-20
  • 打赏
  • 举报
回复
那是系统内存管理的事情,如果不做系统层的开发,可以不用管这个

unsigned int *timerCntAddr = 0x100000;

这条语句这么写肯定不行,随便把一个常量赋值给一个指针,任何编译器都能允许的,这要是允

许了,对所有的系统来说都是致命的啊

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧