关于内核/应用程序 编译 所用到的头文件和库

qq_40396547 2017-10-23 08:44:05
这问题一直有点不清楚 .
1)按我的理解,内核 和 应用程序 进行编译时,,都可以用glibc库 或者 也可以用标准库,之所以用glibc库多一些,只是因为 内核本身程序 是用gnu c写的,兼容性会比标准库(ansi c库)好些?
2)所以在glibc库中,其实包含了 内核所用到的系统调用 ,以及封闭好的,供应用程序所用的api接口,但初安装linux系统 后,只是安装 了header 头文件,这个头文件就只把glibc库中的api接口部分列了出来,以供编译其他 的应用程序 使用.
3)所以我们如果要编译内核模块 或者 新版本内核 时,就需要另外安装 内核头文件(一般在include/linux下),这样相当于把glibc中的系统调用 开放给 需要编译的程序使用.

请教下以上认识,是否有问题?如果有问题,那么正确的理解 是什么?\
...全文
872 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
CHENG Jian 2018-09-07
  • 打赏
  • 举报
回复
首先你要明白 库,运行时库,程序 之间的关系。 你做开发的时候,别人因为某种不想给你源码,就给你一些头文件,和库文件。 头文件中包含了接口的声明,从而你引用了头文件就可以使用接口 库中包含了接口的定位,这样你的编写的代码在编译链接时,编译器可以正确的找到函数实现并生成二进制。 从这种角度上来讲: 驱动编程:内核头文件和你本地运行的内核,就构成了你编写驱动的环境。 应用编程:以glibc库为例,系统中只提供了glibc的头文件和库,这样你就可以正常编写和运行你的应用。 当然还有一种开发方式,你就是库的作者,你有源码,你可以直接把你的应用跟库的源码写在一起,编译,运行。 下面说你问题: 1)按我的理解,内核 和 应用程序 进行编译时,,都可以用glibc库 或者 也可以用标准库,之所以用glibc库多一些,只是因为 内核本身程序 是用gnu c写的,兼容性会比标准库(ansi c库)好些? 首先内核是肯定不可能依赖于任何C库或者其他运行库的,即使需要一些简单的函数,比如字符串处理,math库什么的,都会自己实现。因为内核是你程序运行的基石,他需要提供你C库运行的环境(进程调度,内存管理,程序加载等等),如果你的内核还依赖C库,那将是一个死循环。(内核运行需要C库,可是系统启动的时候,C库的环境都没有。那内核永远无法启动。) 应用程序,你可以随意选择标准库,你可以选择glibc,你也可以选择其他C库。 2)所以在glibc库中,其实包含了 内核所用到的系统调用 ,以及封闭好的,供应用程序所用的api接口,但初安装linux系统 后,只是安装 了header 头文件,这个头文件就只把glibc库中的api接口部分列了出来,以供编译其他 的应用程序 使用. glibc库封装了系统调用,glibc是跨平台的库,他封装了linux(posix)的系统调用和window的系统调用。封装成C库标准里面的函数。 C标准库只是一套标准。任何人可以用自己的方法实现,只要你符合标准。你能保证程序按照预期的方式运行即可。 头文件和库构成了你编写程序的基石,告诉编译器你使用的变量或者函数,是叫什么(头文件),什么样子(库),运行时库则为你的程序运行提供环境,加载系统环境变量,程序参数,然后从main函数开始加载,然后运行等等。 3)所以我们如果要编译内核模块 或者 新版本内核 时,就需要另外安装 内核头文件(一般在include/linux下),这样相当于把glibc中的系统调用 开放给 需要编译的程序使用 内核编程, 驱动编程,用户态编程 是不一样的。但是仅仅是使用的库和头文件不同。 驱动编程,使用的头文件就是内核kernel-header,库就是你本地的内核,或者你(交叉编译)构建的内核镜像。运行时库就是你本地运行的内核 用户态变成,使用的头文件是用户态的头文件和库文件。 内核编程,就相当于你有内核的源码,你想在里面自己搞点啥。。。。。
qq_40396547 2017-10-23
  • 打赏
  • 举报
回复
引用 1 楼 runsunlg 的回复:
内核一般不能直接用标准C库,它自己有类似标准库的部分接口
内核编译,实际上很少用标准c库吧?现在基本上都是用的glibc库.理论上用c库,也行.只是理论上. 我们在编译内核 的时候,可是 用的一样的gcc,一样的glibc..只是所用的头文件有所改动...需要把路径指向 include/linux目录下. 所以,实际 用到的lib还是gnc的lib,只是有些内核专用的系统调用 接口,需要专门的这个目录的头文件 来 外释 出来...对吧?
runsunlg 2017-10-23
  • 打赏
  • 举报
回复
内核一般不能直接用标准C库,它自己有类似标准库的部分接口

4,469

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧