linux进程和内核地址空间

news/2024/7/20 10:11:38 标签: linux, linux内核

  一、 Linux采用了虚拟内存管理技术,使得每个进程都有独立的进程地址空间,该空间是大小为3G,用户看到和接触到的都是虚拟地址。利用这虚拟地址,不但能保护操作系itongde作用,更重要的是用户程序可使用比实际物理地址内存更大的地址空间。

    l二、inux将4G的虚拟地址空间划分为2部分---用户空间与内核空间用户空间从0到0xbfffffff,内核空间从3G到4G,用户进程通常情况下只能访问用户空间的虚拟地址,不能访问啮合空间。例外请款情况是用户进程通过系统调用访问内核空间。

    三、用户空间对应进程,每当进程切换,用户空间就会跟着变化。

    catr/proc/<pid>/maps下查看每个进程运行的用户空间。

    创建进程fork(),程序载入execve(),动态分配内存malloc()等进程相关的操作都需要分配内存给进程。进程申请和获得的不是物理地址,仅仅是虚拟地址。

    实际的物理内存只有当进程真的去访问新获得的虚拟地址时候,才会由“请页机制”产生“缺页”异常,从而进入分配实际页框的程序。该异常是虚拟内存机制赖以存在的基本保证---它会个哦阿苏内核去为进程分配物理页,并建立对应的页表,这之后虚拟地址才实实在在的映射到物理地址上。

  四、Linux内核中内存分配

1、   #include <linux/slab.h>

void *kmalloc(size_t size,int flags)  

 参数: size :要分配的内存大小。flags:分配的标志,它控制kmalloc的行为。

 flags如下:

  GFP-ATOMIC  用来在进程上下文之外的代码(包括中断处理)中分配内存,从不睡眠。

GFP_KERNEL  进程上下文中的分配,可能睡眠  (16M--896M)

__GFP_DMA  这个标志要求分配能够DMA的内存取(物理地址在16M一下的页帧)

__GFP_HIGHMEM  表示分配的内存位于搞内存

2、按页分配:使用模块需要分配大块的内存。

  get_zeroed_page(unsigned int flasgs)  返回指向新页面的指针,并将页面清零

 __get_freee_page(unsigned int flags)  fan返回指向新页面的指针,但不清零页面

__get_free_pages(unsigned int flags,unsigned int order)

分配若干个连续的页面,返回指向该内存区域的指针,但是不清零这段内存区域。

当程序用完这些页后,可以释放他们:

 void free_page(unsigned long addr)

void free_pages(unsigned long adrr,unsigned  long order)

如果释放的和先前分配数目不等的页面,会导致系统错误。

 

 五:内核地址空间:固定的,不会随着进程变化而改变

 六:高端内存:物理内存896M以上部分。

    内核空间分布

 直接映射区 8M        动态映射区 8K           KMAP区(永久内存映射区)     固定映射区4K

    896M(MAX)               120M(MIN)                  4M                 4M

七:直接映射区

      从3G开始,最大896M的线性地址区间,我们称作直接内存映射区,这是因为该区域的线性地址和物理地址之间存在线性转换关系:    线性地3G+物理地址    kmallloc是直接内存映射区分配的,分配的是物理内存

  物理地址区间0x100000  - ---   0x200000映射到线性地址空间就是3G+0x100000     -----    3G+0x200000

八、动态内存映射区

  该区域的地址由内核函数vmalloc来进行分配,其特点是线性空间连续,但对应的物理空间不连续。vmalloc分配的线性地址所对应的物理页可能处于低端内存,也可能处于高端内存。

九、永久内存映射区

  对于896MB以上的高端内存,可使用该区域来访问,访问方法:

 1、使用alloc_page(__GFP_HIGNMEM)fenpei gaodua分配高端内存页。

2、使用kmap函数将分配到的高端内存映射到该区域。

十、固定映射区

  有4M的线性空间,被成为固定映射区,它和4G顶端只有4K的隔离带,固定映射区中每个地址项都服务于特定的用途,如ACPI_BASE等。通常硬件会映射到这里来。


http://www.niftyadmin.cn/n/1117297.html

相关文章

linux 本地终端 SSH 连接 gcp (Google Cloud Platform ) 配置教程 ...

准备 首先在gcp创建实例 1.设置当前用户的新密码 $ sudo passwd ${whoami} // 下面以 user 代替 ${whoami} # 输入新密码 2.设置下 root 的新密码 $ sudo passwd root # 输入新密码 3.在本地生成私钥和公钥 $ cd ~/.ssh $ ssh-keygen -f myKey 或者 $ ssh-keygen -t rsa -f ~/.…

linux openssh升级8.0,Linux openssh8.0p1升级步骤

前期准备开启本机telnet服务&#xff0c;以防openssh升级失败无法连接服务器。注&#xff1a;redhat 5 6 和 redhat7 开机启动配置相关文件不同&#xff0c;请注意1、安装zlibtar -xzvf zlib-1.2.11.tar.gzcd zlib-1.2.11./configure --prefix/usr/local/zlib-1.2.11make &…

进程优先级反转

进程优先级进程优先级控制,是分时操作系统对不同重要程度的进程时间片划分的一个参照标准.分时操作系统在一个进程的时间片使用完,或由于等待外设等原因而放弃时间片时,会根据进程的优先级来考虑接下来调度上CPU的进程,并确定其时间片长度.高优先级进程优先调度上CPU,并被配给较…

iOS-开发者相关的几种证书

目录 引言写在前面一App IDbundle identifier二设备Device 三开发证书Certificates 证书的概念数字证书的概念iOS开发证书iOS开发证书的根证书申请证书CSRCertificate Signing Request 四供应配置文件Provisioning Profiles Provisioning Profile的概念Provisioning Profile的…

linux获取pc指针地址,为什么pc可以看成使程序存储器的地址指针

参考教材&#xff1a;张毅刚主编&#xff0c;单片机原理及应用&#xff0c;普通高等教育“十五”国家级规划教材&#xff0c;高等教育出版社&#xff0c;2004年1月第一章1&#xff0d;3&#xff1a;单片机与普通计算机的不同之处在于其将( )( )和( )三部分集成于一块芯片上。答…

返回数字中二进制位为'1'的个数

写一个函数&#xff0c;返回数字中二进制位为1的个数。比如36,化为二进制得到100100&#xff0c;其中有2个1。方法1&#xff1a;分别判断各个位 intbit_count(unsigned intn){ int count; for(count 0; n; n >> 1) { count n & 1; } return …

一流程序员的16个优良习惯!

俗话说&#xff1a;“习惯成自然&#xff0c;自然成人生”习惯对一个程序员的成败极为重要&#xff0c;好习惯可以让一个程序员走向成功&#xff0c;坏习惯就会走向失败&#xff01; 慎于说Yes 在没有搞清楚开发需求、任务工作量、团队期望值之前&#xff0c;有前途的程序员不会…

linux. SCSI. 错误处理,微视linux scsi驱动错误中断处理

SCSI有两种常见的故障类型。一种是卡自身故障发出错误中断或者中断里面自带错误信息&#xff1b;另外一种是卡没有响应&#xff0c;丢中断触发定时器超时错误。对于第一种故障模型&#xff1a;硬件中断执行结束后会触发软中断&#xff0c;流程如下void blk_done_softirq(struct…