易截截图软件、单文件、免安装、纯绿色、仅160KB

Linux学习笔记零零三

存储管理
MMU与内核内存管理的关系
从线性地址到物理地址的映射,通过页目录表和页表来实现的。
内核为存储管理维护了一套复杂的数据结构,页目录表和页表是主要的结构之一。这些表也是存储在物理内存页面中的,因此,也是以4K为单位。
表中的每个表项都记录了一个32位的地址,为4个字节,因此,一个表中最多可以有1K项,这也是线性地址划分的依据。
32位的线性地址划分为3部分。最高10位代表页目录表的索引。紧接着的10位对应页表的索引。最后12位对应页内的偏移地址。
MMU与内核内存管理的分工和协作:
MMU从硬件上实现虚拟地址到物理地址的映射。内核的内存管理实现对一系列数据结构的维护和管理。
在系统启动时,内核为每一个4K的物理内存页面维持一个叫page的数据结构,这个数据结构是每一个物理内存页面的ID。内核维持了一个叫Mem_page的结构体数组,记录了所有的page。并引入了管理区的概念,对DMA、高地址区和正常区进行了分类。
在启动进程时,内核为进程的用户空间做了初始化,这些初始化工作包括堆栈区、静态数据区、全局数据区、代码区。并初始化了一套结构来维持这些状态,通过划分虚拟区间来记录。
此外,内核还构建了页目录表、页表等结构,并将页目录表的地址放入特定的寄存器。
当内核初始化完毕后,开始执行用户进程的代码,MMU开始地址转换,MMU从特定的寄存器中取出页目录表的地址,根据线性地址,查询页目录表和页表,最终访问page结构。如果页目录表和页表中没有对应的表项,就说明没有映射好。如果页内存结构page中的标识位表示它不在内存中,就需要将对应的物理页面导入物理内存页面。这两种情况是如何处理的呢?通过异常。
当出现以上两种情况时,MMU会发出page fault异常,由内核的对应的异常处理程序来处理。
在异常处理程序中,该映射的映射,该导入内存的导入内存,处理完后,MMU就可以继续地址转换了。
内核还要响应用户进程中的系统调用,比如分配堆空间,比如写文件,进行IO操作。在这些过程中,内核需要对相应的结构体进行修改,或者操作物理页面。
主要的结构体联系图:
task_struct----->mm_struct---->vm_area_struct
                               |---->pgd---->pte


相关文档:

灵活使用Linux下的glimpse工具和tee命令


采用glimpse可以对源代码进行索引,这样在繁杂的代码里面,可以很快的找到关键字。
这个工具就是glimpse。使用方法就不多说了。可以查google嘛! ^__^
采用tee命令可以将glimpse查找出来的信息转存为文件。
就是这样:
    glimpse CONFIG_BOOTDELAY | tee bootdelay.txt
这样就查出了所有CONFI ......

linux下udp客户端源码示例

#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <s ......

linux下统计时间类

class CTimeTickCount
{
public:
CTimeTickCount(int threadIndex, int id )
{
struct timezone tz;
gettimeofday(&m_tvStartTime, &tz);
// m_tmStartTime = ACE_OS::gettimeofday();
m_iThreadIndex ......

SuSE Linux10上安装Oracle数据库

系统要求:
  内存:推荐1G
  Swap分区:设为内存的2倍
  /tmp磁盘空间:400MB以上三
  磁盘空间:软件3.5G 数据1.2G
  所需软件:
  SuSE Linux10 for x86
  Oracle database 10gR2 for Linux32
  Orarun-1.8-109.15.i586.rpm软件包,可以从http://Ftp.novell.com/partners/Oracle/sels-9下载
&n ......

Linux中 静态库和共享库

1. 创建目录
 mkdir –p test/sub
2. 在子目录sub/下编写hello.c和hello.h
 /*****hello.c*****/
 #include <stdio.h>
 #include “hello.h”
 void hello()
 {
 printf(“Hello!\n”);
 }
 
 /*****hello.h**** ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号