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

Linux虚拟内存基础知识

1.从80386开始,Intel处理器的线性32被分为3个域,最高十位为此线性地址在页目录的索引;中间十位为此线性地址在页表中的索引;最低12为物理地址的低12位(也可以说是页内偏移量)。每个进程一定有各自独立的页表(注意:这里说的是进程,而不是线程。在linux里线程其实就是轻量级的进程,他们是连页目录都相同的进程,只是他们的的堆栈在线性空间的位置不同)。
 
2.线性地址(也就是虚拟地址)被分成以固定长度为单位的组,成为页。而分页单元把所有ram分成固定长度的页框(又叫物理页)页框的长度和页的长度一致。注意区分页和页框,页只是一个数据块,可以存放在实际的任何页框中,也就是说,页是内容,页框是容器。
 
3.一个进程的线性地址空间可以分为n多个连续的页,而这些也可以通过mmu和页表去转换为实际的物理地址去访问对应的页框(物理页)。所以一个进程的线性页可以对应任何一个物理页,只要修改页表就可以修改,线性页和物理页的对应关系。
 
4.当mmu开启后,不管是内核还是应用程序在此后的过程中所用的地址都是虚拟地址,都是要通过mmu进行转换才能访问到实际的物理地址。所以不管是内核还是应用程序的对任何内存的访问都要对应一张页表,进行从虚拟地址到物理地址的转换。
 
5.对页表的访问操作同样也用的是虚拟地址,众所周知在fork出一个新进程A 时肯定至少要为这个新线程建立长度为1k*4的一级页表,而内核对这个一级页表进行的任何修改操作同样也是使用虚拟地址进程操作的。同样,如果上面 fork出的线程A如果需要对某个虚拟地址进行读写操作时,这时mmu就会发现在一级页表内找不到这个虚拟地址对应的二级页表,mmu这时会产生一个缺页中断,通知内核,内核这时会申请1k*4+4k的空间。其中1k用于分配给这个虚拟地址空间所对应的二级页表,4k用于给进程的代码或者数据用。
通过以上分析可以总结出,要申请一个4M空间至少要4M+2k*4的物理空间。(呵呵,为什么要加“至少”呢,因为如果要申请的4M的空间落在两个二级页表之中的话,那就必须要两个二级页表了,最极端的情况是,这4M分别在不同的页表中,这时就需要1M*4+1K*4的空间来放页表了。
 
6.内核在启动后,会把896m的以下的RAM全部映射到内核空间,即以 0xC0000000为基地址的位置。这时内核对虚拟地址0xC0000000~0xC0000000+896m操作即是对0X0~896m的物理地址操作。内核代码和静态内核数据结构就存放在这个0xC0000000~0xC0000000+


相关文档:

实战Linux Bluetooth编程(六) L2CAP编程实例

例一:发送Signaling Packet:
Signaling Command是2个Bluetooth实体之间的L2CAP层命令传输。所以得Signaling Command使用CID 0x0001.
多个Command可以在一个C-frame(control frame)中发送。
 如果要直接发送Signaling Command.需要建立SOCK_RAW类型的L2CAP连接Socket。这样才有机会自己填充Command Code,Identi ......

Linux下查看cpu类型、内存大小、硬盘大小类型等

http://blog.tianya.cn/blogger/post_show.asp?BlogID=2243487&PostID=21072119&idWriter=0&Key=0
Linux下查看cpu类型、内存大小、硬盘大小类型等 
CPU查看:
1、  # dmesg | grep CPU
  Initializing CPU#0
  CPU: Trace cache: 12K uops
  CPU: L1 I-cache: 0K, L1 D-cache: 16K
  CP ......

linux lib 动态库

动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助。
1、动态库的编译
下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:so_test.h,三个.c文件:tes ......

Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf

今天在运行sphinx的时候,提示说
./searchd: error while loading shared libraries: libmysqlclient.so.16: cannot open shared object file: No such file or directory
我编译安装的时候明明有指定mysql的lib库啊,上网查到是因为mysql的lib不在系统的lib路径中,解决办法如下:
在/etc/ld.so.conf下面加一行/usr/loc ......

linux裁剪

最近公司要做linux嵌入式系统,目前主板是采用x86结构。所以就在自己的本本上装了一个虚拟的红旗6。
因为是新手,刚开始的时候认为linux裁剪难的应该是系统内核裁剪,可是一段时间发现不是的。相比之下内核是比较简单的。
内核裁剪主要的工作是你需要什么功能就把对应的模块选上,难点只是英语不容易看懂,要到网上搜索翻 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号