日期:2014-05-16  浏览次数:20912 次

[Linux内核小白]深入剖析printf之一:如何不借助第三方库在屏幕上输出"Hello World"?

如何不借助第三方库实现printf?

---用汇编语言实现"Hello World!"


---"你为什么要去登珠穆朗玛?"  

当美国《纽约时报》记者问英国登山家乔治·马洛里。

---“Because it is there(因为山在那里)。”

---题记


一、 内核的诱惑

会当凌绝顶,一览众山小。

内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。

几十年来,内核以它那深深的魅力吸引着无数的码农为之倾倒,一代又一代的码农们从青青葱葱走向硕果累累,从风华正茂走向耄耋之年,也走出了现在多姿多彩的世界。


内核就像一位风姿卓约的美女,多少码农欲一亲芳泽而不得。Linux内核是庞大复杂的,超过 600 万行的代码,就如同珠穆朗玛峰一样那样让人望而生畏。初学者一踏入,绝大多数会不自觉地迷失在这座庞大的迷宫里。


二、用printf撕开一个小小的口子...

作为一名内核小白,我也期望着那天能登上Linux内核这座高峰,一览其风采,但高原反应可不是闹着玩的。

既然等不了珠穆朗玛峰,那就先试试攀登莲花山吧...


每一位初学者都学习过下面这个例子,

没看过?

---拖出去,XX了

/************************************************************************************
** File: - Z:\code\c\LLprintf\print0.1\LLapp.c
**  
** Copyright (C), Long.Luo, All Rights Reserved!
** 
** Description: 
**      LLapp.c 
** 
** Version: 0.1
** Date created: 21:30:00,10/01/2013
** Author: Long.Luo
** 
** --------------------------- Revision History: --------------------------------
** 	<author>	<data>			<desc>
** 
************************************************************************************/

#include <stdio.h>

int main(void)
{
	printf("Hello, World!\n");

	return 0;
}


我们通过调用printf就可以实现在屏幕上输出一段字符?

为什么呢?

加入我们不用printf,怎么做呢?

printf里面蕴含着什么样的秘密呢?

......


我们看看LLapp.c文件经过预处理之后发生了什么?



可见经过预处理之后引入了很多其他函数,正是经过这一系列调用实现了我们想要的功能。

我们再来看看printf的定义:

int printf(const char *fmt, ...)
{
	int i;
	char buf[256];
  
	va_list arg = (va_list)((char*)(&fmt) + 4); 
	i = vsprintf(buf, fmt, arg);
	write(buf, i);
  
	return i;
}

事实上,printf是作为C语言的标准输入输出库里面的一个函数提供给我们的,已经被我们习以为常了。

这些