免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7169 | 回复: 16
打印 上一主题 下一主题

[内核入门] read()的源代码在哪里? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-13 19:45 |只看该作者 |正序浏览
本帖最后由 rockcanon 于 2012-07-13 19:49 编辑

看linux 0.01的源码,没有找到int read(...)的源码,linux 0.12也没有找到,只在unistd.h里有个定义,那这个函数的源代码到底在哪呢?

比如:open(), open() -> _syscall2(int,open,...) -> system_call -> sys_call_table[] -> sys_open,
但对于read(),我没有找到起点。

论坛徽章:
0
17 [报告]
发表于 2012-07-18 00:07 来自手机 |只看该作者
本帖最后由 wswfc 于 2012-07-18 00:28 编辑

lss和我说的一个意思的哇~

论坛徽章:
0
16 [报告]
发表于 2012-07-17 13:13 |只看该作者
en,总算是有个让我觉得说得过去的说法了。

论坛徽章:
0
15 [报告]
发表于 2012-07-17 10:13 |只看该作者
前端时间我也有这个疑问?还有许多函数,例如mkdir,chmod等等函数,在内核代码中也是没有找到,后来以前看过,是在glib库中实现的

论坛徽章:
0
14 [报告]
发表于 2012-07-17 10:09 |只看该作者
int 0x80的处理程序通过call _sys_call_table(,%eax,4)来调用sys_XXXX,这个我知道,
sys_xxx是进入屋里的事情,read()是扇门,门还没找到,你们老是说屋里的事,
我就是想知道linux 0.01里read()到底有没有实现。

论坛徽章:
0
13 [报告]
发表于 2012-07-17 09:34 |只看该作者
cdtits 发表于 2012-07-17 00:25
如果你要得是应用层的 read 库函数的源码的话,貌似不在内核源代码中,你可以参考 gnu lib


正解!

论坛徽章:
0
12 [报告]
发表于 2012-07-17 09:32 |只看该作者
本帖最后由 wswfc 于 2012-07-17 09:35 编辑

回复 9# rockcanon


那我明白了,确实是内核没有实现,为什么没有实现呢?因为内核代码(包括负责初始化的3个进程(参考《linux内核设计的艺术》))不需要调用read()。

而open和write在内核代码的开机初始化阶段,都要用到(主要对应于串口的初始化),所以就给简单实现出来啦!

那么执行int 0x80的read()到底在哪里呢?

我觉得应该在glibc之类的基础库里面吧?在glibc的源码的unix目录下有一个类似叫system_call.list的文件,里面就说了包括read在内的大部分系统调用。

   

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
11 [报告]
发表于 2012-07-17 00:25 |只看该作者
如果你要得是应用层的 read 库函数的源码的话,貌似不在内核源代码中,你可以参考 gnu lib

论坛徽章:
3
处女座
日期:2015-03-18 14:35:45羊年新春福章
日期:2015-03-18 14:48:23午马
日期:2015-03-18 14:51:09
10 [报告]
发表于 2012-07-16 21:07 |只看该作者
自己在项目中搜sys_read



int sys_read(unsigned int fd,char * buf,int count)
{
        struct file * file;
        struct m_inode * inode;

        if (fd>=NR_OPEN || count<0 || !(file=current->filp[fd]))
                return -EINVAL;
        if (!count)
                return 0;
        verify_area(buf,count);
        inode = file->f_inode;
        if (inode->i_pipe)
                return (file->f_mode&1)?read_pipe(inode,buf,count):-EIO;
        if (S_ISCHR(inode->i_mode))
                return rw_char(READ,inode->i_zone[0],buf,count,&file->f_pos);
        if (S_ISBLK(inode->i_mode))
                return block_read(inode->i_zone[0],&file->f_pos,buf,count);
        if (S_ISDIR(inode->i_mode) || S_ISREG(inode->i_mode)) {
                if (count+file->f_pos > inode->i_size)
                        count = inode->i_size - file->f_pos;
                if (count<=0)
                        return 0;
                return file_read(inode,file,buf,count);
        }
        printk("(Read)inode->i_mode=%06o\n\r",inode->i_mode);
        return -EINVAL;
}

read.png (235.19 KB, 下载次数: 63)

read.png

论坛徽章:
0
9 [报告]
发表于 2012-07-16 15:10 |只看该作者
先回下6楼,_syscall3()是在unistd.h里,我想说的是read()调用int 0x80的代码在哪里。

通过文件搜索,没有找到,应该是linux0.01没有实现read()函数, 可能这个版本本来就是残缺的。
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP