荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: jjksam (Linux,c/c++,java), 信区: Linux
标  题: [转寄] Re: 请教lin下的信号
发信站: 荔园晨风BBS站 (Thu Nov 29 18:07:04 2001), 转信

【 以下文字转载自 jjksam 的信箱 】
【 原文由 jjk.bbs@bbs.nju.edu.cn 所发表 】
发信人: BaByAnt (云淡风清), 信区: LinuxUnix
标  题: [转寄] Re: 请教lin下的信号
发信站: 南京大学小百合站 (Wed Nov 28 03:01:38 2001), 站内信件

我觉得好像有问题,因为任何系统调用都会把当前的用户态
转到内核态,而只有中断才能实现,也就是中断是唯一激活
内核的方法

对任何一个系统调用在linux下都应该是通过int 80h实现的,
因为系统初始化的时候,int $0x80和其它中断向量一样,
中断服务程序入口地址被存入中断向量描述表中,其中第
0x80项保存的即系统调用的入口地址:

\Arch\I386\Kernel\Traps.c"中的trap_init()函数
其中0x80入口由语句 set_system_gate(0x80,&system_call)

set_system_gate()是一个宏,在"Include\Asm-i386\System.h"中有它的宏展开:
#define set_system_gate(n,addr) \
_set_gate(&idt[n],15,3,addr)
    其中"_set_gate()"也是在该文件中定义的宏:
#define _set_gate(gate_addr,type,dpl,addr) \
__asm__ __volatile__ ("movw %%dx,%%ax\n\t" \
"movw %2,%%dx\n\t" \
"movl %%eax,%0\n\t" \
"movl %%edx,%1" \
:"=m" (*((long *) (gate_addr))), \
"=m" (*(1+(long *) (gate_addr))) \
:"i" ((short) (0x8000+(dpl<<13)+(type<<8))), \
"d" ((char *) (addr)),"a" (KERNEL_CS << 16) \
:"ax","dx"

这段宏的主要功能是使addr地址放入gate_addr所指向的内存单元中,
那么语句set_system_gate(0x80,&system_call);的含义就很明显:
把中断向量描述表的第0x80项置为&system_call。
fork系统调用的设置由宏语句:_syscall()(int,fork) 完成,
它使int $0x80的参数eax为NR_fork

我觉得应该是这样的吧

【 在 juggernaut (万念俱灰) 的大作中提到: 】
: fork就不用。open就要用,因为要读磁盘。
: 【 在 BaByAnt (云淡风清) 的大作中提到: 】
: : 能举一个不用中断实现的系统函数调用的例子吗?
: : 谢谢!


--
※ 来源:.南京大学小百合站 bbs.nju.edu.cn.[FROM: 137.194.8.113]
--
※ 转寄:.南京大学小百合站 bbs.nju.edu.cn.[FROM: 深圳大学BBS]
--
※ 转载:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.146]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店