当前位置: 技术问答>linux和unix
高手指教:正在学习-linux内核完全注释(0.11),对于linux/init/main.c有个问题,请帮忙
来源: 互联网 发布时间:2015-11-14
本文导语: 在138行 if (!fork()) { /* we count on this going ok */ init(); } 对于函数fork(),我搜索了整个文件夹都没有发现它的实现,它是属于C标准库的,是不是因为在 做成内核image时候,gcc已经把它编译为二进制文件??? 我...
在138行
if (!fork()) { /* we count on this going ok */
init();
}
对于函数fork(),我搜索了整个文件夹都没有发现它的实现,它是属于C标准库的,是不是因为在
做成内核image时候,gcc已经把它编译为二进制文件???
我想知道fork()函数的实现,哪个地方有标准库函数的实现?我安装了rh4(企业版),里面有所有的源代码吗?
还有一个不明白的是:在内核中,在任何一个文件(.c, .h)中是不是不可以有标准库函数的头文件?如等?
if (!fork()) { /* we count on this going ok */
init();
}
对于函数fork(),我搜索了整个文件夹都没有发现它的实现,它是属于C标准库的,是不是因为在
做成内核image时候,gcc已经把它编译为二进制文件???
我想知道fork()函数的实现,哪个地方有标准库函数的实现?我安装了rh4(企业版),里面有所有的源代码吗?
还有一个不明白的是:在内核中,在任何一个文件(.c, .h)中是不是不可以有标准库函数的头文件?如等?
|
在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库。所以不能使用任何第三方库的函数,只能是自成一体的,内核所用到的函数必须都要自己去实现,用到的结构都是自己去声明,最初的堆栈指针都是在汇编代码阶段时去设置的
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库。所以不能使用任何第三方库的函数,只能是自成一体的,内核所用到的函数必须都要自己去实现,用到的结构都是自己去声明,最初的堆栈指针都是在汇编代码阶段时去设置的
|
哈哈,正碰上我。我看这本书已经看了两遍了。
看这个文件的第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;
}
,直接替换下就看出来了,呵呵
看这个文件的第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;
}
,直接替换下就看出来了,呵呵
|
fork是一个系统调用函数。