- 论坛徽章:
- 0
|
本帖最后由 l4rmbr 于 2013-05-08 00:10 编辑
a_jige 发表于 2013-04-11 17:31 ![]()
最近在用gdb 和 bochs调试 0.11,打印用户态变量的地址和内核里变量的地址
搞不懂打印出来的究竟是 线性 ...
Hi, a_jige,
(首先说点话, 建议你先读读<提问的智慧>这篇文章, 只有明确自己的问题, 并做过自己的努力,
你才会明白有什么问题适合这个地方,你的问题确切的是什么.
甚至你能为他人提供你已知道的信息, 这样有助他人帮你解决问题, 也能让你的问题免受冷遇或
被人斥责)
对于你的问题,
*** 短答案 ***
gdb调试打印出来的是线性地址.
*** 长答案 ***
需要讲的东西太多,不适合在一个帖子里说, 建议你google下这几个名词, 这些概念都有很好的文章在说明.
这里简要说一点.
1.物理地址
就是直观理解的内存条(或其它可寻址主存)的地址,这是一个顺序编码的数组, 可以随机访问某一个地址值
2.逻辑地址
是物理段机制催生的东西, 简言之, (这里举x86的cpu来说, )
- 在80286前的Intel CPU, 所谓的逻辑地址就是著名的
段 : 段内偏移
它的计算方法是 段 左移4位 + 段内偏移 = 实际物理地址
- 在80286 及以后的CPU中, 由于引入了分页的概念, 段其实已经可以退出历史舞台了, 但出于向后兼容性, 还一直保留
此时的逻辑地址还是以
段 : 段内偏移
的形式, 但是, 它的内含已经变了,
段不再直接参与最终物理地址的计算. 实际上, 它是一个下标, 指向一个叫_全局描述符表_(GDT)的某一项, 而后从这个
表中取出基址, 加上段内偏移获得最终的物理地址
3.线性地址,
顾名思义, 它是寻址模式上的一次"回归", 它摒弃了之前复杂的段+偏移的非线性地址模式, 而表示一个平坦的地址空间中
的地址. 这个地址空间, 就是内核和物理内存管理单元一同呈现的进程的虚拟地址空间,比如在X86平台上, 就是典型的4G
空间. 所以, 你问题中的地址就是指这个虚拟地址空间中的线性地址.
|
|