⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 -+

📁 linux内核学习笔记 希望想看的人可以很快下载到
💻
字号:
any problems, send mails to sindybear@163.com


相关文件
	

(1)
所谓的内核空间和用户空间,只是一种笼统的区分办法。
内核运行在3G--4G之间的地址空间。我们应该这样理解这句话,其实我们只要将linux内核看作一个
大程序。这个就好理解了。这个大程序在机器启动的时候被固定加栽到物理内存0x00100000的地方。
所以,当这个大程序被编译的时候,它的地址在进行联接的时候就将所有的编译地址加上了一个偏移量
就是著名的0xC0000000,这样,内核里所有的程序段,函数,变量的虚拟地址都高于0xC000000,
也就是都位于3G的虚拟内存之上了。

(2)
而用户态的的程序在编译的时候都是从虚拟地址0开始的,到3G结束,只有当用户程序进行系统调用,
或者有中断发生的时候,才从用户态进入到内核态,这时候再运行的代码就是内核里的代码,
也就是那些逻辑地址为0xC0000000上的地址。


从上面的分析可以看出来,其实内核态和用户态的区别还主要是编译程序和系统设计相结合的产物。
其实这也体现了编译程序和虚拟内存的精髓。也就是说,编译程序在编译程序的过程中都是从一个
固定的地址开始的,一般是0开始。当真正进行连接操作的时候,才将他们和不同的段关联起来。
在这里,偏移量0xC000000就相当于一个段。经过连接以后的所以的内核数据,程序都是相对于这个
偏移量,也就是段的虚拟地址了。这时候才能将他们投入到cpu上进行解释,运行。


(?)
linux由于固定装载在物理内存的0x0010000的地方,所以编译的时候从0开始,联接的时候,
就会加上一个偏移量0xC010000,这样,当我们使用内核里的任何变量的时候,就可以减去
0xC000000这个偏移量,得到这个变量在物理内存中的位置。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -