高手指教:正在学习-linux内核完全注释(0.11),对于linux/init/main.c有个问题,请帮忙

时间:2021-08-27 23:37:58
在138行
if (!fork()) { /* we count on this going ok */
 init();
}

对于函数fork(),我搜索了整个文件夹都没有发现它的实现,它是属于C标准库的,是不是因为在
做成内核image时候,gcc已经把它编译为二进制文件???
我想知道fork()函数的实现,哪个地方有标准库函数的实现?我安装了rh4(企业版),里面有所有的源代码吗?

还有一个不明白的是:在内核中,在任何一个文件(.c, .h)中是不是不可以有标准库函数的头文件?如<stdio.h>等?

6 个解决方案

#1


fork是一个系统调用函数。

#2


我也知道是系统调用,可是这份代码是linux的内核部分阿。我是想知道在所有文件夹里面都没有它的实现,也没有包含标准库函数,那它怎么知道去哪里寻找啊?

#3


难道是编译内核代码的时候,它的实现已经用二进制代码完全代替了?

#4


在main函数的开头不是有一条语句是这样的吗:
static inline _syscall0(int,fork)
你需要结合到unistd.h文件中的宏_syscall0来看上面一句代码
等你把unistd.h文件中的宏_syscall0看懂了,再看懂static inline _syscall0(int,fork)就明白了
提示一下:
static inline _syscall0(int,fork)就是通过宏_syscall0替换后,就变成fork函数的实现了,也就是你所说的为何没有在什么地方看到fork的实现

记得在另一个贴子上已回答你这个问题了!!!!!顺便问答一下你那个贴子上问的:

最终经过编译以后,(即变成image文件后)对于机器来说,就是二进制组成的文件,也就是所说的bin文件,而ELF文件还会有文件头的概念。

内核代码里面,如time.h中声明了很多方法的原型,
char * ctime(const time_t * tp);
struct tm * gmtime(const time_t *tp);
这些函数就如同你所遇到的fork一样,它也是通过宏扩展之后,在调用之处才是其实现之处,你仔细看一下那几个宏声明。这里只所以声明函数原型,就是为了让其它地方好调用而已,至于在其它地方有没有被实现,主要是看有没有像在main函数内的fork那样相似的方法处理过的。
内核是自成一体的代码,它不能动态连接任何动态库,而内核又需要做到精减,所以它也不能去连接C库。所以不能使用任何第三方库的函数,只能是自成一体的,内核所用到的函数必须都要自己去实现,用到的结构都是自己去声明,最初的堆栈指针都是在汇编代码阶段时去设置的

#5


哈哈,正碰上我。我看这本书已经看了两遍了。
看这个文件的第23行 static inline _syscall0(int, fork)
然后再去看看_syscall0是什么,它原来是个宏,在文件unistd.h中第133行:
#define _syscall0(type,name) \
type name(void) \
{ \
long __res; \
__asm__volatile("int $0x80" \
       : "=a" (__res) \
       : " "  (__NR_##name)); \
if (__res >= 0) \
   return (type) __res; \
errno = -__res; \
return -1; \
}
,直接替换下就看出来了,呵呵


#6


这位兄台 tb01412(tb) 下手也太快了吧,我刚打完。。。刷了一下,才发现已经被你抢了一脚了,5555555

#1


fork是一个系统调用函数。

#2


我也知道是系统调用,可是这份代码是linux的内核部分阿。我是想知道在所有文件夹里面都没有它的实现,也没有包含标准库函数,那它怎么知道去哪里寻找啊?

#3


难道是编译内核代码的时候,它的实现已经用二进制代码完全代替了?

#4


在main函数的开头不是有一条语句是这样的吗:
static inline _syscall0(int,fork)
你需要结合到unistd.h文件中的宏_syscall0来看上面一句代码
等你把unistd.h文件中的宏_syscall0看懂了,再看懂static inline _syscall0(int,fork)就明白了
提示一下:
static inline _syscall0(int,fork)就是通过宏_syscall0替换后,就变成fork函数的实现了,也就是你所说的为何没有在什么地方看到fork的实现

记得在另一个贴子上已回答你这个问题了!!!!!顺便问答一下你那个贴子上问的:

最终经过编译以后,(即变成image文件后)对于机器来说,就是二进制组成的文件,也就是所说的bin文件,而ELF文件还会有文件头的概念。

内核代码里面,如time.h中声明了很多方法的原型,
char * ctime(const time_t * tp);
struct tm * gmtime(const time_t *tp);
这些函数就如同你所遇到的fork一样,它也是通过宏扩展之后,在调用之处才是其实现之处,你仔细看一下那几个宏声明。这里只所以声明函数原型,就是为了让其它地方好调用而已,至于在其它地方有没有被实现,主要是看有没有像在main函数内的fork那样相似的方法处理过的。
内核是自成一体的代码,它不能动态连接任何动态库,而内核又需要做到精减,所以它也不能去连接C库。所以不能使用任何第三方库的函数,只能是自成一体的,内核所用到的函数必须都要自己去实现,用到的结构都是自己去声明,最初的堆栈指针都是在汇编代码阶段时去设置的

#5


哈哈,正碰上我。我看这本书已经看了两遍了。
看这个文件的第23行 static inline _syscall0(int, fork)
然后再去看看_syscall0是什么,它原来是个宏,在文件unistd.h中第133行:
#define _syscall0(type,name) \
type name(void) \
{ \
long __res; \
__asm__volatile("int $0x80" \
       : "=a" (__res) \
       : " "  (__NR_##name)); \
if (__res >= 0) \
   return (type) __res; \
errno = -__res; \
return -1; \
}
,直接替换下就看出来了,呵呵


#6


这位兄台 tb01412(tb) 下手也太快了吧,我刚打完。。。刷了一下,才发现已经被你抢了一脚了,5555555