摘要: 系统调用:由操作系统实现的所有系统调用所构成的集合即程序接口或应用编程接口(Application Programming Interface,API),是应用程序同系统之间的接口。系统调用把应用程序的请求传给内核,调用相应的的内核函数完成所需的处理,将处理结果返回给应用程序,如果没有系统调用和内核 阅读全文
posted @ 2013-10-16 15:17 学会淡定 阅读(366) 评论(0) 推荐(0) 编辑
摘要: 我们知道,在32位机器上linux操作系统中的进程的地址空间大小是4G,其中0-3G是用户空间,3G-4G是内核空间。其实,这个4G的地址空间是不存在的,也就是我们所说的虚拟内存空间。 C程序一直由下列几部分组成: A.正文段。这是由cpu执行的机器指令部分。通常,正文段是可共享的,所以即使是经常执行的程序(如文本编辑程序、C编译程序、shell等)在存储器中也只需要有一个副本,另外,正文段常常是只读的,以防止程序由于意外事故而修改器自身的指令。 B.初始化数据段。通常将此段称为数据段,它包含了程序中需赋初值的变量(也就是初始化的全局变量以及静态变量)。 C.非初始化数据段。通... 阅读全文
posted @ 2013-10-11 09:59 学会淡定 阅读(199) 评论(0) 推荐(0) 编辑
摘要: 进程内存空间Linux操作系统采用虚拟内存管理技术,使得每个进程都有各自互不干涉的进程地址空间。该空间是块大小为4G的线性虚拟空间,用户所看到和接触的都是该虚拟地址,无法看到实际的物理内存地址。利用这种虚拟地址不但能起到保护操作系统的效果(用户不能直接访问物理内存),而且更重要的是用户程序可使用比实际物理内存更大的地址空间(具体的原因请看硬件基础部分)。在讨论进程空间细节前,请大家这里先要澄清下面几个问题。第一、4G的进程地址空间被人为的分为两个部分——用户空间与内核空间。用户空间从0到3G(0xC0000000),内核空间占据3G到4G。用户进程通常情况下只能访问用户空间的虚拟地址,不能访问 阅读全文
posted @ 2013-10-10 22:03 学会淡定 阅读(332) 评论(0) 推荐(0) 编辑
摘要: 1.进程的堆栈 内核在创建进程的时候,在创建task_struct的同时,会为进程创建相应的堆栈。每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间。当进程在用户空间运行时,cpu堆栈指针寄存器里面的内容是用户堆栈地址,使用用户栈;当进程在内核空间时,cpu堆栈指针寄存器里面的内 容是内核栈空间地址,使用内核栈。2.进程用户栈和内核栈的切换 当进程因为中断或者系统调用而陷入内核态之行时,进程所使用的堆栈也要从用户栈转到内核栈。 进程陷入内核态后,先把用户态堆栈的地址保存在内核栈之中,然后设置堆栈指针寄存器的内容为内核栈的地址,这样就完成了用户栈向内核栈的转换;当进程从内 阅读全文
posted @ 2013-10-10 17:07 学会淡定 阅读(2096) 评论(0) 推荐(1) 编辑
摘要: 存储系统是指计算机中由存放程序和数据的各种存储设备、控制部件及管理信息调度的设备(硬件)和算法(软件)所组成的系统。 计算机的主存储器不能同时满足存取速度快、存储容量大和成本低的要求,在计算机中必须有速度由慢到快、容量由大到小的多级层次存储器,以最优的控制调度算法和合理的成本,构成具有性能可接受的存储系统。存储系统的性能在计算机中的地位日趋重要,主要原因是:①冯诺伊曼体系结构是建筑在存储程序概念的基础上,访存操作约占中央处理器(CPU)时间的70%左右。②存储管理与组织的好坏影响到整机效率。③现代的信息处理,如图像处理、数据库、知识库、语音识别、多媒体等对存储系统的要求很高。 在计算机系统中. 阅读全文
posted @ 2013-10-10 16:46 学会淡定 阅读(364) 评论(0) 推荐(0) 编辑
摘要: .tar 解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!).gz解压1:gunzip FileName.gz解压2:gzip -d FileName.gz压缩:gzip FileName.tar.gz 和 .tgz解压:tar zxvf FileName.tar.gz压缩:tar zcvf FileName.tar.gz DirName.bz2解压1:bzip2 -d FileName.bz2解压2:bunzip2 FileName.bz2压缩: bzip2 -z FileName.tar.bz2解压: 阅读全文
posted @ 2013-09-29 09:31 学会淡定 阅读(272) 评论(0) 推荐(0) 编辑
摘要: 1、安装内核 如果内核已经安装(/usr/src/目录有linux子目录),跳过 如果没有安装,在光驱中放入linux安装光盘,找到kernel-source-2.xx.xx.rpm文件(xx代表数字,表示内核的版本号), 比如RedHat linux的RPMS目录是/RedHat/RPMS/目录,然后使用命令rpm -ivh kernel-source-2.xx.xx.rpm安装内核 如果没有安装盘,可以去各linux厂家站点或者www.kernel.org下载。2、清除从前编译内核时残留的.o 文件和不必要的关联 cd /usr/src/编译的版本 make mrproper... 阅读全文
posted @ 2013-09-28 16:27 学会淡定 阅读(172) 评论(0) 推荐(0) 编辑
摘要: 在linux的内核空间中,大部分嵌入式芯片都不支持内核空 间的KGDB调试。通常在内核中死掉的话,可以根据死机地址再加反汇编,或者是addr2line找到死机的函数或者是那一行,但是对于动态插入的模块却不行。这是因为,内核在编译的时候就把地址链接好了,运行的时候代码段的地址空间在链接的时候就决定了。但是,对于模块来说的话,在insmod的时候, 内核是动态的分配一段内存,在这段内存中完成模块和内核的链接,并决定该模块运行时的模块代码段、数据段,等等。而且模块文件本质就是一个目标文件,当然 他比普通的目标文件还含有更多一些帮助模块装载的东西。这样,我们如果在运行的时候死机在模块中的话,即使内核. 阅读全文
posted @ 2013-09-28 15:44 学会淡定 阅读(797) 评论(0) 推荐(0) 编辑