ts0612 发表于 2009-07-08 18:47

有关malloc的问题

各位,

我想请教一下,lcc 的 malloc 函数是如何实现的? 我看了一下 lcc 的 source,感觉lcc 是用 旧的 c 语法(非ANSI)写的,并用旧的C编译器进行编译的(当然,用gcc也行,它也支持旧的C语法)。里面的 malloc 函数应该不是重新写的,是调用库里的函数。不知道我的理解对不对?我看的是 lcc-3.6版本

ts0612 发表于 2009-07-08 18:48

回复 #1 ts0612 的帖子

先顶一下

prolj 发表于 2009-07-08 21:52

malloc是libc,不是compiler的部分。lcc是C89写的,BURS不错,我唯一有印象的地方。

beepbug 发表于 2009-07-11 06:02

传统的malloc(),形式上是个库函数。做堆分配,虚存这块工作,在库函数里做完,物理内存的分配由系统调用完成。

ts0612 发表于 2009-07-11 08:38

回复 #4 beepbug 的帖子

谢谢各位的回复。

我再细想了一下,那是不是应该是这样子的:

在LCC代码里面只有2种内容:

1、LCC代码开发者自己定义的变量,函数等(自定义的信息)

2、C标准函数库里的函数(如:printf, malloc等,这些由操作系统提供)

最后,用GCC编译器去编译LCC的代码。GCC编译器所做的工作是将LCC代码中自定义的信息(即上面第1点的内容)翻译成汇编语言并设置好“用到的C标准函数库里的函数”的导入声明(即extern语句),然后用汇编编译器编译翻译后的汇编文件,最后经过链接标准函数库里的函数而形成LCC编译器。在整个LCC编译的过程里面,并不依赖C的“资源”(因为标准函数库是操作系统提供的)。

是这样吗?

[ 本帖最后由 ts0612 于 2009-7-11 08:41 编辑 ]

mik 发表于 2009-07-11 09:28

>> 1、LCC代码开发者自己定义的变量,函数等(自定义的信息)

      没错,绝大部分情况下,每个软件都提供自己的函数


>> 2、C标准函数库里的函数(如:printf, malloc等,这些由操作系统提供)

   库函数是由 glibc 类似的库提供的,不是操作系统提供

  操作系统提供的是 api ,也就是操作系统对外界提供接口和服务,用来访问操作系统的资源

beepbug 发表于 2009-07-11 14:18

原帖由 ts0612 于 2009-7-11 08:38 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
谢谢各位的回复。

我再细想了一下,那是不是应该是这样子的:

在LCC代码里面只有2种内容:

1、LCC代码开发者自己定义的变量,函数等(自定义的信息)

2、C标准函数库里的函数(如:printf, malloc等,这些由操作系统提供)

最后,用GCC编译器去编译LCC的代码。GCC编译器所做的工作是将LCC代码中自定义的信息(即上面第1点的内容)翻译成汇编语言并设置好“用到的C标准函数库里的函数”的导入声明(即extern语句),然后用汇编编译器编译翻译后的汇编文件,最后经过链接标准函数库里的函数而形成LCC编译器。在整个LCC编译的过程里面,并不依赖C的“资源”(因为标准函数库是操作系统提供的)。

是这样吗?

1)我在前面的回帖并非针对LCC的。我不熟悉LCC。
2)标准的说法,C库函数不属于C本身,或者明确地说:不属于C内核。C开发工具生产商把C编译器、链接器、C库函数,还有一些实用工具打包在一起提供给开发者的。
3)库函数不是由操作系统提供的。操作系统提供的是系统调用。在类UNIX系统里,由于系统与C的特殊关系,系统调用与C库函数的形式是相似的,容易混淆。
4)很多C库函数,里面做一些实质性工作时,其实是调用某些系统调用。譬如,malloc(),在调用过程中,前后两段走的是用户态,中间一段走的是系统态。它调用的是系统调用sbrk()。
5)因为3),你的“最后。。。”可能要重新思考。

[ 本帖最后由 beepbug 于 2009-7-12 05:57 编辑 ]
页: [1]
查看完整版本: 有关malloc的问题