Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4511127
  • 博文数量: 356
  • 博客积分: 10458
  • 博客等级: 上将
  • 技术积分: 4734
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-24 14:59
文章分类

全部博文(356)

文章存档

2020年(17)

2019年(9)

2018年(26)

2017年(5)

2016年(11)

2015年(20)

2014年(2)

2013年(17)

2012年(15)

2011年(4)

2010年(7)

2009年(14)

2008年(209)

分类: C/C++

2010-05-21 23:27:13

/*
作者:帅得不敢出门   程序群 3503799
看了程序员的自我修养 --链接 装载 与库 后写的
直接使用系统调用实现打印hello world kernel 2.6.23
原理:写stdout来实现输出 stdout对应fd是1不是0 这个书中有误
smlinkage ssize_t sys_write(unsigned int fd, const char __user * buf, size_t count)
高版本的kernel好像这个接口变了  改成用某个宏实现了
gcc $file  -o $file.o
ld -e nomain -o $file  $file.o
*/
void exit(int status)
{
__asm__ __volatile__(
"movl $1, %%eax\n\
 movl $0, %%ebx\n\
 int $0x80\n"
:::
);
}//这里会报warning   警告:‘noreturn’函数确实会返回 不知道怎么修改 后来看了下链接装载与库这本书 它ebx传的是42
//暂时没有测试  不知道这个42有何特殊意义
int puts(const char *s)
{
unsigned int  writelen = 0;
    //unsigned int ret;
if (s==(void*)0)
return -1;
while('\0' != s[writelen]) //此处调用putchar可能会更高效些
++writelen;
__asm__ __volatile__(
"movl $4, %%eax \n\
 movl $1, %%ebx \n\
     int $0x80"
    ://:"=a"(ret)
:"c"(s), "d"(writelen)
);
//return ret; //eax做为返回值 所以这里没有必要为ret分配空间
}
void nomain(void)
{
puts("Hello World!\n");
exit(0);
}
阅读(2065) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~