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

深入理解linux内核笔记六:linux系统调用

一般情况下,进程不能存取系统内核的,只有系统调用是一个例外,在intel结构的计算机中,是通过中断0x80实现的
进程可以可以跳转到内核中的位置是system_call。在此检查系统调用号,它告诉内核进程请求何种服务,然后查找系统调用表sys_call_table,找到希望调用的内核地址函数,调用此函数,然后返回。
      
1、  宏定义(unistd.h)
_syscallN(type,name,x…),N是系统调用所需参数数目,type是返回类型,name是面向用户的系统调用函数名,x…是参数,个数为N
如:#define _syscall1(type,name,type1,arg1) \
type name(type1 arg1) \
{ \
long __res; \
__asm__ volatile ("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx" \
: "=a" (__res) \
: "0" (__NR_##name),"ri" ((long)(arg1)) : "memory"); \
__syscall_return(type,__res); \
}
分析:
ouput: _res 0%  __NR##name  “=a”表示存放在eax寄存器
       也就是表示把变量_res存放在eax中,“0”表示把_NR##name关联到0%即_res.返回值也存放在eax中.
 
       #define _syscall2(type,name,type1,arg1,type2,arg2) \
type name(type1 arg1,type2 arg2) \
{ \
long __res; \
__asm__ volatile ("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx" \
       : "=a" (__res) \
       : "0" (__NR_##name),"ri" ((long)(arg1)),"c" ((long)(arg2)) \
              : "memory"); \
__syscall_return(type,__res); \
}
同理可以知道arg1存放在eax中,arg2存放在ebx中
 
当我们在程序中用到系统调用时,对于linux预定义的系统调用,编译器会在预处理时自动加入宏_syscallN()并将其展开,对于自己添加的系统调用,需要在程序中显示地调用宏_syscallN.
 
2         系统调用入口函数
在_syscallN()中执行了int 0x80后,程序进入内核态,我们在陷阱门和系统门的初始化里做了如下设置
set_system_gate(SYSCALL_VECTOR,&system_call);
程序跳到system_call(entry.s)处
ENTRY(system_call)
  &nb


相关文档:

实战Linux Bluetooth编程 (七) SDP协议

Service Discovery Protocol(SDP)提供一种能力,让应用程序有方法发现哪种服务可用以及这种服务的特性。
服务发现协议(SDP或Bluetooth SDP)在蓝牙协议栈中对蓝牙环境中的应用程序有特殊的含意,发现哪个服务是可用的和确定这些可用服务的特征。SDP定义了bluetooth client发现可用bluetooth server服务和它们的特征的方法。 ......

解决Red Hat Enterprise Linux AS 4 中文乱码问题

 解决Red Hat Enterprise Linux AS 4 中文乱码问题
我用的系统是Red Hat Enterprise Linux AS 4,在X-windows桌面环境下的“终端”窗口操作是能正确显示汉字,但是在用SSH登陆Linux操作系统,我用的是putty远程管理Linux,发现返回中文提示信息全都是乱码,简单的解决办法就是在SSH端执行:
export LC_ALL ......

Linux makefile 教程 非常详细,且易懂

 最近在学习Linux下的C编程,买了一本叫《Linux环境下的C编程指南》读到makefile就越看越迷糊,可能是我的理解能不行。
            于是google到了以下这篇文章。通俗易懂。然后把它贴出来,方便学习。
        & ......

PostgreSQL Linux安装,使用简易手册

 
PostgreSQL Linux
安装及使用,简易手册
一,配置方法:
1
,首先下载任意版本的PostgreSQL For Linux X86_64
wget http://downloads.enterprisedb.com/postgresql/postgresql-8.4.1-1-linux-x64.bin
2
,文本模式安装
[root@imdba.cn ~]# ./postgresql-8.4.1-1-linux-x64.bin –mode text
&mda ......

linux 命令

linux 挂载命令 : Mount 
http://www.zhiweinet.com/jiaocheng/2009-02/2602.htm
 
mount挂载命令使用方法:
 
mount -t 类型 -o 挂接方式 源 目标
 
-t 详细选项
  光盘或光盘镜像:iso9660
DOS fat16文件系统:msdos
  Windows 9x fat32文件系统:vfat
  Windows NT ntfs文件系统:n ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号