字符串函数
因为在内核中,大部分的c标准库函数无法使用,字符串操作的函数又比较常用,所有自己实现一些
include/string.h
1 |
|
libs/string.c
1 |
|
屏幕输出函数
现在我们来尝试一下实现printf函数
首先是函数声明
include/debug.h (部分)
1 |
|
参数表的三个点代表的就是任意个数的实参,然后就是如何在没有形参名的情况下获取到实参
注意到上面的代码包含了另一个头文件,内容如下
includ/vargs.h
1 |
|
这个里面定义的一些宏是用于取得printk函数调用时的所有参数 ,__builtin_va_list这些是gcc内部实现的
当然也可以自己实现,一般定义为宏,如
1 |
来分析一下这些宏都干了什么,
- va_list是一个char*指针
- __va_rounded_size(TYPE)是字节对齐,在x86的机器上低于4字节会按照四字节对齐,大于4小于8会按照8字节对齐
- va_start(AP, LASTARG) LASTARG是函数的最后一个固定参数,那么这个宏就是让AP指向可变参数的第一个参数
- va_arg (AP,TYPE) 的作用就是在已知参数类型的情况下获取当前参数,然后让AP指向下一个参数
- va_end(ap) 就是最后让ap指向0,结束
这些在gcc内部都实现了,就不用我们自己管了
当然这些成立的条件就是参数在内存中是顺序存储的,事实也就是这样,参数会被按顺序压入栈中
弄明白这些就可以开始写printk函数了
今天就先到这,明天再来写printk函数