`
memorymyann
  • 浏览: 271808 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
文章列表

exit函数

exit函数使用很简单,效果就是退出一个进程(我觉得应该叫销毁一个进程,执行后这个进程就会被销毁). exit的作用是终止一个进程,并释放其资源。注:exit不会使一个进程灰飞烟灭,前面我们在fork一个进程时候,谈到了进程资源,包括用户空间,进程信号表,文件和系统堆栈空间,执行exit以后进程进入一种僵死状态,不再会被系统调度,释放了除系统堆栈以外所有的资源。(就是保持了一个最小资源,用于父进程的检查)可能有人不太理解为什么不回收系统堆栈空间,下面是个人理解:第一:实现起来有难度,在CPU上运行的是进程不是代码,是进程自然需要一个task_struct来支持它的运行。exit也不例外,在运行e ...
实现的最终效果:改变进程执行的上下文。 1.使用execve就是一次系统调用,首先要做的将新的可执行文件的绝对路径从调用者(用户空间)拷贝到系统空间中。 2.在得到可执行文件路径后,就找到可执行文件打开,由于操作系统已经为可执行文件设置了一个数据结构,就初始化这个数据结构,保存一个可执行文件必要的信息。 3.可执行文件不是真正上能够自己运行的,需要有代理人来代理。在系统内核中有一个formats队列,循环遍历这个队列,看看现在被初始化的这个数据结构是哪个代理人可以代理的。如果没有就继续查看数据结构中的信息。按照系统配置了是否可以动态加载模块,加载一次模块,再循环遍历看是否有代理人前来认领。 4. ...

execve函数

fork创建出来的子进程的PCB是复制了父进程的PCB,进程的4个资源中,我们可以控制了3个资源,系统堆栈和户口pcb已经被创建,还有虚存空间也是可以从新声请(通过COPY_ON_WRITE),但是我们看到代码段寄存器没有被改,2个进程采用仍然是同一个剧本,关于代码段在内存中是只读的,因此页面表项会被复制,代码段内存是不会重新分配的。整体效果看上去就是父子进程做的是同一件事。这样创建出来的子进程的意义将会大打折扣。(同时子进程的PCB是复制父进程而来,信号处理表,页面表这些都是复制过来。)execve就是用来改变这一情况的。   他通过改变进程的上下文,从而达到和父进程分开的目的。    
这里介绍fork, vfork和 clone的具体实现 它们具体实现的代码如下: asmlinkage int sys_fork(struct pt_regs regs) {     return do_fork(SIGCHLD, regs.esp, &regs, 0); } asmlinkage int sys_clone(struct pt_regs regs) {     unsigned long clone_flags;     unsigned long newsp;     clone_flags = regs.ebx;     newsp = regs.ecx;    ...
KOF97    草雉京:1.(对手被夹在角落)跳重拳+落地重拳+踢飞+大蛇雉                 2.轻腿+轻腿+轻拳+无式    八神:近身轻腿+屑风+重拳+八雉女(重拳的时机要把握好,否则连不上)   KOF2002     草雉京:1.(爆气,对手角落)8C+C+426B+SUPER CANCLE + 超大蛇雉     K'DASH:1.  8C+2C+26C+6D+连动(有点难度,关键是眼镜丢出时候敌人浮空的高度)                    2.近身C+6B(膝击)+24C   鬼泣4:     NERO:投技强大,3级畜力枪十分强大,攻击,速度,攻击模式都不如 ...
fork,vfork,clone都是linux的系统调用,用来创建子进程的(确切说vfork创造出来的是线程)。 先介绍下进程必须的4要点: a.要有一段程序供该进程运行,就像一场戏剧要有一个剧本一样。该程序是可以被多个进程共享的,多场戏剧用一个剧本一样。 b.有起码的私有财产,就是进程专用的系统堆栈空间。 c.有“户口”,既操作系统所说的进程控制块,在linux中具体实现是task_struct d.有独立的存储空间。 当一个进程缺少d条件时候,我们称其为线程。 1.fork 创造的子进程复制了父亲进程的资源,包括内存的内容task_struct内容(2个进程的pid不同)。这里是资源的复制不 ...
进程在操作系统中都有一个户口,用于表示这个进程。这个户口操作系统被称为PCB(进程控制块),在linux中具体实现是 task_struct数据结构,它记录了一下几个类型的信息: 1.状态信息,例如这个进程处于可执行状态,休眠,挂起等。 2.性质,由于unix有很多变种,进程有自己独特的性质。 3.资源,资源的链接比如内存,还有资源的限制和权限等。 4.组织,例如按照家族关系建立起来的树(父进程,子进程等)。   下面是这一个数据结构 struct task_struct {     /*      * offsets of these are hardcoded elsewhere - tou ...
在intelx86中,任务是设计者对进程的代名词(他们管进程叫任务)。这是从CPU角度考虑进程的,和从操作系统看进程,2者是有差距(比如在操作系统中每个进程都有自己的户口,既进程控制块,但在任务里面没有)。 设计者为 ...
CPU支持256个中断向量,早期的CPU把内存中从0开始的1K字节作为一个中断向量表,当从引脚中得到中断信号后,便读取中断向量号,并根据中断向量号得到相应的中断服务程序的入口地址,从而执行入口地址。 CPU进入保护模式后,对中断响应做了大幅度修改。首先中断向量表的表项从单纯的入口地址改变了意义,称之为“门”。意思为中断发生后,只有通过这些门才可以进入中断服务程序。但门的作用不仅仅限于中断,只要想切换CPU的运行状态就得通过门。因此门根据其用途被分为4种:任务门,中断门,陷阱门和调用门。除任务门外,其它们的结构类似。门的大小都是8字节,64位。 1。任务门 从高向低位看,前16位闲置不用,第17 ...

linux安全

1,禁止root用户远程登录主机 vim /etc/ssh/sshd_config 修改#PermitRootLogin yes为PermitRootLogin yes(去掉注释) service sshd restart 局域网内部可以登录,root被禁止远程登录带来的某些指令不够权限无法执行,可以通过sudo指令来执行。sudo指令需要配置/etc/sudoers。可以使用visudo来配置(推荐),具体配置细节见http://tanger.iteye.com/blog/190362   2.进程文件权限 在linux的shell中运行ps -le就可以看到当前系统运行的进程,uid表示该进 ...
kswapd进程就是专司定期将页面换出的守护神,它使用的是内核的地址空间 kswapd的初始化 static int __init kswapd_init(void) {     printk("Starting kswapd\n");     swap_setup(); //根据物理内存大小设置设定全局量page_cluster,磁盘读道是个费时操作,每次读一个页面过于浪费,每次多读几个,这个量就要根据实际物理内存大小来确定     kernel_thread(kswapd, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGNAL); // ...
linux对物理内存的管理是分3个层次,节点,管理区,页面。分配流程如下: 1.首先获得节点列表的头,循环搜索可以分配给用户要求大小的内存。分配成功则跳出循环,不成功则返回0。 2.找到分配节点,根据分配策略和大小找到合适的管理区分配内存。 3.从管理区空闲页面链表内划分合适的内存,分配给用户。 便于理解,对linux分配策略具体实现和部分内存数据结构做下补充: 1.分配策略具体实现:在节点数据结构中 typedef struct pglist_data {     zone_t    node_zones[MAX_NR_ZONES];   //该节点最多的3个页面管理区,MAX_NR_ZON ...
之前看过了内存管理的数据结构,下面通过越界访问来熟悉下这些数据结构。(之前一直没有让大家去下载内核源代码,因为我列的比较详细,接下来的东西,大家自己去http://www.kernelnewbies.org/下载内核源代码,然后结合起来看 ...
这里只列举几个比较麻烦的数据结构 struct list_head {     struct list_head *next, *prev; } //linux通用的双向链队列,下面多处用到,这里列出源代码 linux对内存再用页式管理,对于页,就有个数据结构page加以描述。在内核中有个全局量mem-map指向的是一个page的数组,整个数组描述了整个物理内存,大家注意32位地址线,内存大小是2的32次方。由于页大小是4k也就是2的12次方。每4K的页就有一个page。那么2的32次方共有2的20次方个页,则mem-map指向的数组大小就是2的20次方。其中明显对于页的物理地址,一定是4K的倍 ...
linux内存寻址详细过程: 下面我们看这条语句call 0x0804837c 整个内存寻址分为2个阶段,段式和页式。处理器是intel i386系列.操作系统会先将虚地址经过段式映射后变成线性地址,再通过页式变成物理地址。从而获取内存上的数据或者是代码. 这里执行的是call语句,转移指令。首先会找到cs寄存器,intel i386是32位处理器,CS仍然是16位。高13位存贮的是段描述位置(注意不是地址,读到后面就知道了)。低3位中,倒数第3位是指使用GDT寄存器还是LDT(寄存器)。后2位表示权限。(在linux中只用了2种权限,最高级别的系统权限00和用户权限最低11)。该寄存器内容是在 ...
Global site tag (gtag.js) - Google Analytics