dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | flex | CRM | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>操作系统>linux>文章内容
Linux 内核原代码 init/main 的注释
来源:未知     作者:    
define __LIBRARY__
   #include
   #include
   /*
   * we need this inline - forking from kernel space will result
   * in NO COPY ON WRITE (!!!), until an execve is executed. This
   * is no problem, but for the stack. This is handled by not letting
   * main() use the stack at all after fork(). Thus, no function
   * calls - which means inline code for fork too, as otherwise we
   * would use the stack upon exit from 'fork()'.
   *
   * Actually only pause and fork are needed inline, so that there
   * won't be any messing with the stack from main(), but we define
   * some others too.
   */
   static inline _syscall0(int,fork) @@定义fork
   --sys_fork在unistd.h中定义syscall0
   static inline _syscall0(int,pause)
   static inline _syscall0(int,setup)
   static inline _syscall0(int,sync)

#include
   #include
   #include
   #include
   #include

#include
   #include
   #include
   #include
   #include

#include

static char printbuf[1024];

extern int vsprintf();
   extern void init(void);
   extern void hd_init(void);
   extern long kernel_mktime(struct tm * tm);
   extern long startup_time;

/*
   * Yeah, yeah, it's ugly, but I cannot find how to do this correctly
   * and this seems to work. I anybody has more info on the real-time
   * clock I'd be interested. Most of this was trial and error, and some
   * bios-listing reading. Urghh.
   */

#define CMOS_READ(addr) ({
   outb_p(0x80|addr,0x70);
   inb_p(0x71);
   })

#define BCD_TO_BIN(val) ((val)=((val)&15) + ((val)>>4)*10)

static void time_init(void)
   {
   struct tm time;

do {
   time.tm_sec = CMOS_READ(0);
   time.tm_min = CMOS_READ(2);
   time.tm_hour = CMOS_READ(4);
   time.tm_mday = CMOS_READ(7);
   time.tm_mon = CMOS_READ(8)-1;
   time.tm_year = CMOS_READ(9);
   } while (time.tm_sec != CMOS_READ(0));
   BCD_TO_BIN(time.tm_sec);
   BCD_TO_BIN(time.tm_min);
   BCD_TO_BIN(time.tm_hour);
   BCD_TO_BIN(time.tm_mday);
   BCD_TO_BIN(time.tm_mon);
   BCD_TO_BIN(time.tm_year);
   startup_time = kernel_mktime(&time);
   }

void main(void) /* This really IS void, no error here. */
   { /* The startup routine assumes (well, ...) this */
   /*
   * Interrupts are still disabled. Do necessary setups, then
   * enable them
   */
   time_init();
   tty_init();
   trap_init();
   sched_init();
   buffer_init();
   hd_init();
   sti();
   move_to_user_mode(); @@切至用户模式???到哪去了,回来了!!!
   if (!fork()) { /* we count on this going ok */
   init(); @@fork在unistd.h有其宏扩展int 0x80 
   如何返回两次?应该说子进程如何激活?
   }
   /*
   * NOTE!! For any other task 'pause()' would mean we have to get a
   * signal to awaken, but task0 is the sole exception (see 'schedule()')
   * as task 0 gets activated at every idle moment (when no other tasks
   * can run). For task0 'pause()' just means we go check if some other
   * task can run, and if not we return here.
   */
   for(;;) pause();
   @@pause 同fork在unistd.h有其宏扩展int 0x80 然后调schedule()
   }

static int printf(const char *fmt, ...)
   {
   va_list args;
   int i;

va_start(args, fmt);
   write(1,printbuf,i=vsprintf(printbuf, fmt, args));
   va_end(args);
   return i;
   }

static char * argv[] = { "-",NULL };
   static char * envp[] = { "HOME=/usr/root", NULL };

void init(void)
   {
   int i,j;

setup(); @@系统0号调用
   if (!fork())
   _exit(execve("/bin/update",NULL,NULL));
   (void) open("/dev/tty0",O_RDWR,0); @@打开控制台
   (void) dup(0); @@复制
   (void) dup(0);
   printf("%d buffers = %d bytes buffer spacenr",NR_BUFFERS,
   NR_BUFFERS*BLOCK_SIZE);
   printf(" Ok.nr");
   if ((i=fork())<0)
   printf("Fork failed in initrn");
   else if (!i) { @@启动一root shell进程?
   close(0);close(1);close(2);
   setsid();
   (void) open("/dev/tty0",O_RDWR,0);
   (void) dup(0);
   (void) dup(0);
   _exit(execve("/bin/sh",argv,envp));
   }
   j=wait(&i);
   printf("child %d died with code %04xn",j,i);
   sync();
   _exit(0); /* NOTE! _exit, not exit() */
   }

 

 

上一篇:Linux 内核原代码 boot.s 部分的注释   下一篇:Linux 内核模块和驱动程序的编写
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·Linux常用基本命令及应用技巧
·写得蛮好的linux学习笔记
·学会在Linux下对硬盘分区
·找回Redhat的超级用户密码
·Linux下C语言编程
·GDB教程
·Cron服务配置详解
·Linux与Unix二大操作系统编程的
·Linux 2.6 内核的嵌入式系统应用
·Linux和Windows系统调用的比较
·vim命令(一)
·vim 命令(二)
  相关文章
·Linux 内核原代码 boot.s 部分的
·Linux 内核模块和驱动程序的编写
·Linux 应用程序如何处理当前运行
·Linux 最新稳定内核 2.4.x 的网
·Linux 内核原代码 head.s 部分注
·为 Linux 应用程序编写 DLL
·linux 内核原代码 sched.c 的注
·基于Linux的网络数据帧捕获方法
·编写 Linux 操作系统下的设备驱
·Oracle应用Linux开发C
·Linux 下面截获系统调用
·在 Linux 下建立软体套件
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763