无论什么语言,要编译成 ELF文件格式(或者定一个其他的标准)
int main()
{
while(1){};
return 0;
}
链接可以指定最终生成的可执行文件的起始虚拟地址,我们 指定 内核加载到 0x1500的地方,内核初始化的时候跳转内核要跳转到这个地方。
ld kernel/main.o -Ttext Oxc0001500 -e main -o kernel/kernel.bin
$$ ~>ld -help entry
Usage: ld [options] file...
Options:
-e ADDRESS, --entry ADDRESS Set start address
把编译完的内核代码加载到内存,分两步:
我们把 MBR , loader的代码 放到 虚拟硬盘的前两个扇区, 同样的,我们把 编译完的 kernel 的二进制写到 磁盘的第9扇区后的200个扇区,不超过100k, loader里面 先拷贝 磁盘内容到 内存,初始化内核后,调到 内核入口点
dd if=kernel.bin of=/your_path/hd60M.img bs=512 count=200 seek=9 conv=notrunc
cdecl(C declaration,即C声明)是源起C语言的一种调用约定,也是C语言的事实上的标准。在x86架构上,其内容包括:
Linux 的系统调用通过 int 80h 实现,用系统调用号来区分入口函数。操作系统实现系统调用的基本过程是:
应用程序调用系统调用的过程是:
例子:
调用中断号,前提是这个中断函数已经写好了,系统已经提供,所以才称为 系统调用。
char* str=”hello,world\n”;
int count = 0;
void main() {
asm (”pusha; \
movl $4 ,%eax ; \
movl $1 , %ebx; \
movl str , %ecx;\
movl $12 ,%edx ; \
int $0x80; \
mov %eax,count;\
pop a \
”) ;
}