关于C编程的疑惑,请高手给我指点迷津!!十分感激!!
我是计算机专业的,学习C语言的时间有两年多了,虽然专业也开了其它高级语言,但我还是没有放弃C,因为C仅靠一些简单的语法却能实现操作系统的内核,自然有它的强大之处!而且自己...
我是计算机专业的,学习C语言的时间有两年多了,虽然专业也开了其它高级语言,但我还是没有放弃C,因为C仅靠一些简单的语法却能实现操作系统的内核,自然有它的强大之处!而且自己也热衷于底层开发的学习,所以一直话时间学C。
但当我学了操作系统原理后发现我们平时学的C程序设计和系统内核编程有很大区别:C语言有自己标准的库函数,而且这些库函数是不依赖于系统调用的,但是C标准库函数里有个动态内存分配函数malloc,这个函数就是让我疑惑的地方!这个函数的功能是让系统内核动态分配一定大小的内存。既然是C的库函数,而且当初unix的设计者也是用C重写了unix内核,那么在写内核的时候如何用到了这个函数,还会让谁来分配内存呢??
还有我粗略地看了一下linux内核代码,发现每个文件里面所包含的头文件没有一个是C标准库文件,里面的函数也都是开发者自己实现的。既然是C的标准库文件,那么在用C开发东西的时候就可以用啊,难道是那些库函数在开发系统内核时用不上,而只是在开发软件时才能用上??
希望有学习过系统内核的高手不要吝惜笔墨,多给我讲解一下用C语言做内核编程和普通程序设计的区别,让我能走出这团迷雾!感激不已!!!
我在linux内核代码中还发现一个问题,就是每个文件都使用很多指针,却没见到一个malloc和free函数,这是怎么回事??谢谢!! 展开
但当我学了操作系统原理后发现我们平时学的C程序设计和系统内核编程有很大区别:C语言有自己标准的库函数,而且这些库函数是不依赖于系统调用的,但是C标准库函数里有个动态内存分配函数malloc,这个函数就是让我疑惑的地方!这个函数的功能是让系统内核动态分配一定大小的内存。既然是C的库函数,而且当初unix的设计者也是用C重写了unix内核,那么在写内核的时候如何用到了这个函数,还会让谁来分配内存呢??
还有我粗略地看了一下linux内核代码,发现每个文件里面所包含的头文件没有一个是C标准库文件,里面的函数也都是开发者自己实现的。既然是C的标准库文件,那么在用C开发东西的时候就可以用啊,难道是那些库函数在开发系统内核时用不上,而只是在开发软件时才能用上??
希望有学习过系统内核的高手不要吝惜笔墨,多给我讲解一下用C语言做内核编程和普通程序设计的区别,让我能走出这团迷雾!感激不已!!!
我在linux内核代码中还发现一个问题,就是每个文件都使用很多指针,却没见到一个malloc和free函数,这是怎么回事??谢谢!! 展开
2个回答
展开全部
内核编程和普通应用程序设计其实是很大差别的。
内核除了为应用程序和底层的硬件驱动程序提供接口外,其最基本的功能就是任务调度和内存分配。任务调度的意思是内核会决定你这个应用程序什么时候运行(进入运行态)、什么时候不运行(进入非运行态),运行时候占用多长的CPU时间。而内存分配就是决定你这个应用程序运行是占用多少内存,以及占用内存的哪一个地方。
现在看回你的问题。
第一个问题,为什么内核里面包含的头文件没有一个是C标准库文件的呢?
这是因为内核根本不需要用到标准库文件里面的函数的功能。例如像printf这样的语句,内核为什么无端端要输出一个字符串呢?又例如math.h里面的什么求开方啊,求次方啊这些功能内核根本不需要用到。这些东西都是给用户在写应用程序的时候用的。
再说内核的编译器可能不支持c标准库文件,因为真的没有必要用到,没有工程师会为内核编译器写标准库文件的。就像单片机程序,你绝对不会看到一个单片机程序会有c语言标准库文件的。
第二个问题,问什么内核中没有malloc和free函数?
这是因为malloc动态内存分配所谓的动态是相对于用户而言的,即用户不需要知道自己申请的这块内存是哪一个地址。但是对于内核而言,内存地址的分配必须是确定明了的!因为如果连内核都不知道内存的哪些区域被用到了,哪些区域没用到的话,在为这个程序写内存的时候就很容易把别的程序的内存或者系统文件占用的内存覆盖掉,这会导致系统崩盘的!
内存分配是一个很复杂的算法,如果这么简单一个malloc和free就搞定的话,人人能写内核了。呵...
内核除了为应用程序和底层的硬件驱动程序提供接口外,其最基本的功能就是任务调度和内存分配。任务调度的意思是内核会决定你这个应用程序什么时候运行(进入运行态)、什么时候不运行(进入非运行态),运行时候占用多长的CPU时间。而内存分配就是决定你这个应用程序运行是占用多少内存,以及占用内存的哪一个地方。
现在看回你的问题。
第一个问题,为什么内核里面包含的头文件没有一个是C标准库文件的呢?
这是因为内核根本不需要用到标准库文件里面的函数的功能。例如像printf这样的语句,内核为什么无端端要输出一个字符串呢?又例如math.h里面的什么求开方啊,求次方啊这些功能内核根本不需要用到。这些东西都是给用户在写应用程序的时候用的。
再说内核的编译器可能不支持c标准库文件,因为真的没有必要用到,没有工程师会为内核编译器写标准库文件的。就像单片机程序,你绝对不会看到一个单片机程序会有c语言标准库文件的。
第二个问题,问什么内核中没有malloc和free函数?
这是因为malloc动态内存分配所谓的动态是相对于用户而言的,即用户不需要知道自己申请的这块内存是哪一个地址。但是对于内核而言,内存地址的分配必须是确定明了的!因为如果连内核都不知道内存的哪些区域被用到了,哪些区域没用到的话,在为这个程序写内存的时候就很容易把别的程序的内存或者系统文件占用的内存覆盖掉,这会导致系统崩盘的!
内存分配是一个很复杂的算法,如果这么简单一个malloc和free就搞定的话,人人能写内核了。呵...
追问
原来写单片机程序也不调用C的库函数的啊!这下算是明白了。我很想学嵌入式开发,所以才没有放弃学C。像我们专业的很多人愿意学C的都没几个了,大多数都学java,而我平时一个人学连个交流的人都找不到。能把你QQ留下吗?
追答
其实我觉得嘛,你学计算机的,向搞上位机应用程序开发那个方向发展会适合你们专业一些,或者学好javascript、asp向搞网络方面发展。这些都更好找工作,而且薪水会非常的不错,尤其是搞网络的。再或者学安卓,现在那个火啊。这些都是计算机专业的出路。
如果你以后想搞嵌入式的吧,现在就先学单片机吧。
我平时很少上QQ的,邮箱交流吧:gy.linys@163.com
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询