C语言开发应用程序
1.简介
前边跳了几节 一个是内容比较细碎 另一个是原老师的文章链接挂掉了
我也不太好做笔记 所以就跳过去啦 中间修复了一些bug和加了一些功能
也不是那么重要 所以就忽略啦
我们的操作系统通过增添内核接口导出机制后
已经可以作为平台 运行应用程序了
但目前应用程序的开发有一个不足就是
我们只能使用汇编语言开发应用程序 用汇编语言开发程序实在太累了
如果能使用C语言就好了
例如当我们想要开发一个在控制台上输出一个字符的应用程序
如果代码能用C语言这么写就好了(app.c):
void api_putchar(int c); void main() { api_putchar('C'); return; }
如果上面的代码能编译成二进制文件 并能通过系统加载执行
那么在我们的操作系统上开发应用程序就不必要像以前那么痛苦
我们这一节要做的是 研究如何使用C语言开发运行在我们系统之上的应用程序
2.代码
实际上 我们用C语言开发内核的步骤 可以平移到开发应用程序上
我们开发内核时 实际上遵循着的基本逻辑是这样的
用汇编开发底层接口 然后用C语言调用汇编语言导出的接口 实现业务逻辑
然后把C代码编译成二进制文件
接着使用objconv 工具把C语言反编译成汇编语言
下一步就是把原来的用汇编开发的代码跟反编译后得到的汇编代码合二为一
最后用汇编编译器把整合起来的汇编代码编译成一个统一的二进制可执行文件
我们用C语言开发应用程序也遵循上面的逻辑
首先我们用汇编语言导出内核API接口
用C语言调用汇编语言导出的接口完成业务逻辑的编写
接着把C语言代码编译成二进制 再使用objconv反汇编
最后把两个汇编语言代码合二为一 统一编译成一个可执行的二进制文件
基于上面的逻辑步骤
我们第一步要做的就是用汇编语言导出api_putchar函数调用的接口
实现代码如下api_call.asm
[SECTION .s32] BITS 32 call main retf api_putchar: mov edx, 1 mov al, [esp + 4] int 02Dh ret %include "app.asm"
我们先看api_putchar部分
前面我们讲过 内核所有api都对应一个编号 向控制台输出一个字符的api编号就是1
要调用对应api时 只要把对应编号放入寄存器edx
同时把参数提交给指定寄存器 最后调用2D号中断就可以了
在代码的前面
我们首先执行语句call main
也就直接调用main函数 这意味着用C语言开发程序时 主入口函数必须是main
所有C语言开发的程序代码编译成二进制文件后 然后反汇编成汇编程序
反汇编后的程序文件就是app.asm
通过include指令把app.asm的代码整合到api_call.asm中来
最后使用汇编编译器nasm 编译 api_call.asm 所得到的二进制文件就是用C语言开发的应用程序
3.编译和运行
编译运行后(注意makefile更新了)
运行后
切换焦点 输入hlt运行程序
打印了如下的结果