Linux下逻辑地址-线性地址-物理地址详解

好人,你写的总结很全面,而且一步一步分解得非常清楚。
但让我们谈谈实际的事情。
这件事看上去很简单,但真正开始的时候却很头疼。

上次在虚拟机中调试Linux内核时,由于地址转换的问题卡住了很长时间。
当时我调试了一个中断处理程序,查看了CPU寄存器中的线性地址,并试图找到物理内存的具体块,但发现根本不正确。
后来才知道是内核态,它的线性地址直接映射到物理地址,但是用户态就不一样了。
分页机制就在那里,你必须知道页表是如何设置的。

看看你说的“按需分页”,这个东西在实际系统中很常见。
例如,当你运行Python脚本时,它一开始会加载模块、变量等,这些模块、变量等占用了一堆逻辑地址,但物理内存可能会分配给它一小块区域。
此时,Linux 变得聪明了。
当使用这个地址时,发现与某个物理页面不匹配,就会抛出页面错误异常,然后系统从交换分区或直接从磁盘读取该页面。
这个过程对于用户程序来说是完全透明的,但是如果你监控内存使用情况你会发现内存使用情况并不是一下子就达到峰值,而是逐渐增加。

还有一个细节是GDT/LDT。
Linux实际上只使用GDT,并且段基地址设置为0,这样简化了地址转换。
不过,如果是做汇编编程,就需要了解段寄存器的作用,否则写代码的时候很容易出现问题。
我记得当我编写一个简单的Linux驱动程序时,我忘记将段寄存器设置到内核堆栈。
结果我一开就撞车了。
我花了很长时间才弄清楚发生了什么事。

说实话,这些地址翻译机制是现代操作系统内存管理的核心,但是它们非常难学。
你总结得很清楚了。
如果能加上一些实际的调试例子,比如观察使用gdb单步执行时逻辑地址、线性地址、物理地址如何变化,可能会更容易理解。
不管怎样,如果你想深入了解Linux内存管理,就不能绕过这一点。

linux常用命令

1 、查看内核版本:直接输入uname -a。
2 、打开图形界面:输入init 5 或startx。
3 . 切换到控制台:使用 init 3 或注销。
4 . 检查IP 地址:运行ifconfig。
5 . 配置IP: ifconfig eth0 设置新IP。
6 . 重新启动系统:reboot或shutdown -r now。
7 .切换到系统用户:使用su命令。
8 . 退出:输入退出。

控制台是一个类似DOS的文本操作界面。

Linux命令区分大小写,如果不正确将不会被识别。

你自己考虑一下。

本机IP地址查询指令详解

嘿,你说的我有点困惑。
我们现在都什么年纪了,还在用这些老式的方法查IP?我很久以前就已经停止使用它们了。

我记得去年我在我表弟的家乡帮他安装电脑。
我在他的Windows XP系统上直接在命令行输入“ipconfig”。
天啊,看到屏幕上一堆英文字符,他都害怕了。
我只是说,傻孩子,只要点击“无线局域网适配器”下的“IPv4 地址”并复制它即可。
不用担心混乱。

后来我换了MacBook,那家伙直接在终端中输入“ifconfig”。
结果比 Windows 更复杂,有一堆缩写。
我立刻找到他“en0”什么的,找“inet”后面的数字,告诉他这个东西是一个IP。

您说的是哪个子网掩码和网关?我根本不明白。
反正我以前在一家小公司工作,老板有关系网。
我只是不得不使用它。
他们用来提高安全性的复杂设置让我头晕目眩。
有时候公司网络出现问题,我干脆重启一下路由器,或者让老板重启一下交换机,问题就基本解决了。

如果你是搞IT的,这些你一定要懂。
我只是一个门外汉,所以可以随便说说。
如果您不明白某些事情,请不要担心。
如果您有任何问题,请找网络人员。