- 浏览: 271808 次
- 性别:
- 来自: 上海
最新评论
-
AndMacLinuXp:
试了下,不错!
printk内核调试 -
klose:
我引用你的文章,并做了简单的分析:这里贴出url:http:/ ...
linux系统调用fork, vfork, clone -
klose:
你上面提到的问题:free的问题。首先你可能疏忽了,stack ...
linux系统调用fork, vfork, clone -
qwe_rt:
HI ,非常nice的文章,在阅读过程中,我发现我的ubunt ...
linux手动添加开机启动的服务 -
suifeng:
谢谢分享, 受用中.
shell编程分支,循环
文章列表
exit函数使用很简单,效果就是退出一个进程(我觉得应该叫销毁一个进程,执行后这个进程就会被销毁).
exit的作用是终止一个进程,并释放其资源。注:exit不会使一个进程灰飞烟灭,前面我们在fork一个进程时候,谈到了进程资源,包括用户空间,进程信号表,文件和系统堆栈空间,执行exit以后进程进入一种僵死状态,不再会被系统调度,释放了除系统堆栈以外所有的资源。(就是保持了一个最小资源,用于父进程的检查)可能有人不太理解为什么不回收系统堆栈空间,下面是个人理解:第一:实现起来有难度,在CPU上运行的是进程不是代码,是进程自然需要一个task_struct来支持它的运行。exit也不例外,在运行e ...
- 2008-09-17 10:07
- 浏览 2118
- 评论(0)
实现的最终效果:改变进程执行的上下文。
1.使用execve就是一次系统调用,首先要做的将新的可执行文件的绝对路径从调用者(用户空间)拷贝到系统空间中。
2.在得到可执行文件路径后,就找到可执行文件打开,由于操作系统已经为可执行文件设置了一个数据结构,就初始化这个数据结构,保存一个可执行文件必要的信息。
3.可执行文件不是真正上能够自己运行的,需要有代理人来代理。在系统内核中有一个formats队列,循环遍历这个队列,看看现在被初始化的这个数据结构是哪个代理人可以代理的。如果没有就继续查看数据结构中的信息。按照系统配置了是否可以动态加载模块,加载一次模块,再循环遍历看是否有代理人前来认领。
4. ...
- 2008-09-11 15:04
- 浏览 6659
- 评论(0)
fork创建出来的子进程的PCB是复制了父进程的PCB,进程的4个资源中,我们可以控制了3个资源,系统堆栈和户口pcb已经被创建,还有虚存空间也是可以从新声请(通过COPY_ON_WRITE),但是我们看到代码段寄存器没有被改,2个进程采用仍然是同一个剧本,关于代码段在内存中是只读的,因此页面表项会被复制,代码段内存是不会重新分配的。整体效果看上去就是父子进程做的是同一件事。这样创建出来的子进程的意义将会大打折扣。(同时子进程的PCB是复制父进程而来,信号处理表,页面表这些都是复制过来。)execve就是用来改变这一情况的。
他通过改变进程的上下文,从而达到和父进程分开的目的。
- 2008-09-05 11:17
- 浏览 1588
- 评论(0)
这里介绍fork, vfork和 clone的具体实现
它们具体实现的代码如下:
asmlinkage int sys_fork(struct pt_regs regs)
{
return do_fork(SIGCHLD, regs.esp, ®s, 0);
}
asmlinkage int sys_clone(struct pt_regs regs)
{
unsigned long clone_flags;
unsigned long newsp;
clone_flags = regs.ebx;
newsp = regs.ecx;
...
- 2008-09-04 16:40
- 浏览 2704
- 评论(0)
KOF97
草雉京:1.(对手被夹在角落)跳重拳+落地重拳+踢飞+大蛇雉
2.轻腿+轻腿+轻拳+无式
八神:近身轻腿+屑风+重拳+八雉女(重拳的时机要把握好,否则连不上)
KOF2002
草雉京:1.(爆气,对手角落)8C+C+426B+SUPER CANCLE + 超大蛇雉
K'DASH:1. 8C+2C+26C+6D+连动(有点难度,关键是眼镜丢出时候敌人浮空的高度)
2.近身C+6B(膝击)+24C
鬼泣4:
NERO:投技强大,3级畜力枪十分强大,攻击,速度,攻击模式都不如 ...
- 2008-09-04 10:25
- 浏览 991
- 评论(0)
fork,vfork,clone都是linux的系统调用,用来创建子进程的(确切说vfork创造出来的是线程)。
先介绍下进程必须的4要点:
a.要有一段程序供该进程运行,就像一场戏剧要有一个剧本一样。该程序是可以被多个进程共享的,多场戏剧用一个剧本一样。
b.有起码的私有财产,就是进程专用的系统堆栈空间。
c.有“户口”,既操作系统所说的进程控制块,在linux中具体实现是task_struct
d.有独立的存储空间。
当一个进程缺少d条件时候,我们称其为线程。
1.fork 创造的子进程复制了父亲进程的资源,包括内存的内容task_struct内容(2个进程的pid不同)。这里是资源的复制不 ...
- 2008-09-02 11:11
- 浏览 11689
- 评论(2)
进程在操作系统中都有一个户口,用于表示这个进程。这个户口操作系统被称为PCB(进程控制块),在linux中具体实现是 task_struct数据结构,它记录了一下几个类型的信息:
1.状态信息,例如这个进程处于可执行状态,休眠,挂起等。
2.性质,由于unix有很多变种,进程有自己独特的性质。
3.资源,资源的链接比如内存,还有资源的限制和权限等。
4.组织,例如按照家族关系建立起来的树(父进程,子进程等)。
下面是这一个数据结构
struct task_struct {
/*
* offsets of these are hardcoded elsewhere - tou ...
- 2008-09-01 15:29
- 浏览 11765
- 评论(0)
在intelx86中,任务是设计者对进程的代名词(他们管进程叫任务)。这是从CPU角度考虑进程的,和从操作系统看进程,2者是有差距(比如在操作系统中每个进程都有自己的户口,既进程控制块,但在任务里面没有)。
设计者为 ...
- 2008-09-01 11:49
- 浏览 1608
- 评论(0)
CPU支持256个中断向量,早期的CPU把内存中从0开始的1K字节作为一个中断向量表,当从引脚中得到中断信号后,便读取中断向量号,并根据中断向量号得到相应的中断服务程序的入口地址,从而执行入口地址。
CPU进入保护模式后,对中断响应做了大幅度修改。首先中断向量表的表项从单纯的入口地址改变了意义,称之为“门”。意思为中断发生后,只有通过这些门才可以进入中断服务程序。但门的作用不仅仅限于中断,只要想切换CPU的运行状态就得通过门。因此门根据其用途被分为4种:任务门,中断门,陷阱门和调用门。除任务门外,其它们的结构类似。门的大小都是8字节,64位。
1。任务门
从高向低位看,前16位闲置不用,第17 ...
- 2008-08-19 15:37
- 浏览 3581
- 评论(0)
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表示该进 ...
- 2008-07-17 14:18
- 浏览 983
- 评论(0)
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); // ...
- 2008-06-27 11:49
- 浏览 3867
- 评论(0)
linux对物理内存的管理是分3个层次,节点,管理区,页面。分配流程如下:
1.首先获得节点列表的头,循环搜索可以分配给用户要求大小的内存。分配成功则跳出循环,不成功则返回0。
2.找到分配节点,根据分配策略和大小找到合适的管理区分配内存。
3.从管理区空闲页面链表内划分合适的内存,分配给用户。
便于理解,对linux分配策略具体实现和部分内存数据结构做下补充:
1.分配策略具体实现:在节点数据结构中
typedef struct pglist_data {
zone_t node_zones[MAX_NR_ZONES]; //该节点最多的3个页面管理区,MAX_NR_ZON ...
- 2008-05-26 14:41
- 浏览 3895
- 评论(0)
之前看过了内存管理的数据结构,下面通过越界访问来熟悉下这些数据结构。(之前一直没有让大家去下载内核源代码,因为我列的比较详细,接下来的东西,大家自己去http://www.kernelnewbies.org/下载内核源代码,然后结合起来看 ...
- 2008-05-15 14:38
- 浏览 2162
- 评论(0)
这里只列举几个比较麻烦的数据结构
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的倍 ...
- 2008-05-14 18:04
- 浏览 5736
- 评论(0)
linux内存寻址详细过程:
下面我们看这条语句call 0x0804837c
整个内存寻址分为2个阶段,段式和页式。处理器是intel i386系列.操作系统会先将虚地址经过段式映射后变成线性地址,再通过页式变成物理地址。从而获取内存上的数据或者是代码.
这里执行的是call语句,转移指令。首先会找到cs寄存器,intel i386是32位处理器,CS仍然是16位。高13位存贮的是段描述位置(注意不是地址,读到后面就知道了)。低3位中,倒数第3位是指使用GDT寄存器还是LDT(寄存器)。后2位表示权限。(在linux中只用了2种权限,最高级别的系统权限00和用户权限最低11)。该寄存器内容是在 ...
- 2008-05-09 09:55
- 浏览 3242
- 评论(0)