Linux 内存管理 高端内存的映射方式
解释一:
高端内存是指物理地址大于 896M 的内存。
对于这样的内存,无法在“内核直接映射空间”进行映射。
为什么?
因为“内核直接映射空间”最多只能从 3G 到 4G,只能直接映射 1G 物理内存,对于大于 1G 的物理内存,无能为力。
实际上,“内核直接映射空间”也达不到 1G, 还得留点线性空间给“内核动态映射空间” 呢。
因此,Linux 规定“内核直接映射空间” 最多映射 896M 物理内存。
对 于高端内存,可以通过 alloc_page() 或者其它函数获得对应的 page,但是要想访问实际物理内存,还得把 page
转为线性地址才行(为什么?想想 MMU 是如何访问物理内存的),也就是说,我们需要为高端内存对应的 page
找一个线性空间,这个过程称为高端内存映射。
高端内存映射有三种方式:
1、映射到“内核动态映射空间”
这种方式很简单,因为通过 vmalloc() ,在”内核动态映射空间“申请内存的时候,就可能从高端内存获得页面(参看 vmalloc 的实现),因此说高端内存有可能映射到”内核动态映射空间“ 中。
2、永久内核映射
如果是通过 alloc_page() 获得了高端内存对应的 page,如何给它找个线性空间?
内核专门为此留出一块线性空间,从
PKMAP_BASE 到
FIXADDR_START ,用于映射高端内存。在
2.4 内核上,这个地址范围是
4G-8M 到
4G-4M 之间。这个空间起叫“内核永久映射空间”或者“永久内核映射空间”
这个空间和其它空间使用同样的页目录表,对于内核来说,就是
swapper_pg_dir,对普通进程来说,通过 CR3 寄存器指向。
通常情况下,这个空间是
4M 大小,因此仅仅需要一个页表即可,内核通过来 pkmap_page_table 寻找这个页表。
通过 kmap(), 可以把一个 page 映射到这个空间来
由于这个空间是
4M 大小,最多能同时映射
1024 个
page。因此,对于不使用的的
page,及应该时从这个空间释放掉(也就是解除映射关系),通过
kunmap() ,可以把一个 page 对应的线性地址从这个空间释放出来。
3、临时映射
内核在
FIXADDR_START 到
FIXADDR_TOP 之间保留了一些线性空间用于特殊需求。这个空间称为“固定映射空间”
在这个空间中,有一部分用于高端内存的临时映射。
这块空间具有如下特点:
1、
每个
CPU 占用一块空间
2、
在每个
CPU 占用的那块空间中,又分为多个小
相关文档:
手动设置
#ifconfig etn0 192.168.1.2,设置网卡IP地址
或直接运行ifconfig,这时候要注意了,在网络接口中有一个lo接口,也就是网络回环(loopback).
再使用ping命令
#ping 192.168.1.2 -c 3
测试3次,看能否正常响应.
启动与关闭网卡
/etc/rc.d/init.d/network restart <===重新启动网络
ifup eth0 &l ......
Files And Dirs
1. touch ---create a new, empty file
vi filename is also ok
2. mkdir ---make directory
mkdir -p ---to make all directories in the path
3. space in ......
举例来说,硬盘的文件名称即为 /dev/hd[a-d] ,其中, 括号内的字母为 a-d 当中的任何一个,亦即由 /dev/hda, /dev/hdb, /dev/hdc, 及 /dev/hdd 这四个档案的意思 (注:这种型式的表示法在后面的章节当中会使用得很频繁,请特别留意)。 那么光驱与软盘呢?分别是 /dev/cdrom, /dev/fd0 啰! 好了,其它的接口设备呢? ......
服务器端:
建立socket,本地地址绑定bind,然后建立监听,如果有客户端请求则响应之,然后进行数据的发送和接收
源代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/time.h&g ......