请教read()函数

glibc库:在Fileops.c中的定义:# define read(FD, Buf, NBytes) __read (FD, Buf, NBytes)

glibc库:在unistd.h中的定义:extern ssize_t __read (int __fd, void *__buf, size_t __nbytes);



但是我始终没找到 __read()这个函数(或者宏) ,包括内核源码。

问问大家,它怎样到内核的函数的???

作者: shaohui973   发布时间: 2011-02-17

#define _Fread(str, buf, cnt)   _Read((str)->handle, buf, cnt)

_Read 为系统调用 int 0x80 ......

作者: zd零   发布时间: 2011-02-17

回复 zd零


_ _read()到 int 0x80,是怎么跑到这个int 0x80的???

0x80对应的中断号是128吧?  那这个base+128*4所指向的CS:IP是多少?是那个程序?

作者: shaohui973   发布时间: 2011-02-17

sys_read, 找找看

作者: amarant   发布时间: 2011-02-17

回复 amarant


    在 syscalls.h中   asmlinkage long sys_read(unsigned int fd, char __user *buf, size_t count);也没见着定义处,只有这个声明。还有这个asmlinkage 是什么含义?

作者: shaohui973   发布时间: 2011-02-17

回复 shaohui973


    这个是在syscall里面的,有一个表的。你可以百度下系统调用入口

作者: amarant   发布时间: 2011-02-17

刚百度了下,
在内核源码目录下使用下面命令:
grep SYSCALL_DEFINE[0-6]\(XXXX * -R --include=*.c   
   XXXX可以替换为任何系统调用名。未必能找到所有的,八九不离十吧。至少2.6.32下是这样。

作者: amarant   发布时间: 2011-02-17

回复 shaohui973


    asmlinkage通知编译器仅从栈中提取该函数的参数。所有的系统调用都需要这个限定词!

作者: angeltears   发布时间: 2011-02-17

回复 angeltears


    仁兄,可以给出read系统调用的详细资料吗???从glic开始,一直到read的系统调用号 _ _NR_read 以及之后怎么调到文件系统的read函数。

作者: shaohui973   发布时间: 2011-02-17