linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘建议留言网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > article > Linux开发区 > 内核研究 >
栏目导栏
资料搜索
热门文章
·linux-2.6内核升级文档
·Linux源代码的注释
·linux2.6内核编译方法详述
·Linux操作系统内核编译详解
·Linux内核结构详解
·Linux配置与编译内核
·定时器
·Linux内核升级全攻略
·FC5(Fedora Core5)下编译内核总
·Ubuntu 6.06 dapper 内核编译初
·Linux 内核编译详解
·Linux内核管理基础知识概述
·Linux2.4升级到2.6内核升级指南
·第八章 设备驱动
·如何编译linux内核
最新文章
·Linux内核bootsplash功能的实现
·Linux内核2.6.25全新发布加入众
·Debian Linux系统编译内核标准
·Linux2.4内核和2.6内核对Initr
·2.6.24内核编译 initrd-2.6.24
·Qtopia应用程序与Linux内核数据
·Linux 2.6内核中sysfs文件系统
·Linux2.6内核驱动移植参考
·Andrew Morton:Linux内核的执法
·Fedora 8 Linux系统的内核配置
·Kernel中的irq.c函数
·Linux核心出现权限扩张及记忆体
·Linux 2.6本地权限提升漏洞
·结合Linux系统内核源码理解SYN
·关于Linux 内核中五个主要子系
Google
 
linux2.6内核启动传递命令行分析
[ 作者:  加入时间:2007-02-01 11:27:54  来自:Linux联盟收集整理 ]

内核在启动时可以传递一个字符串命令行,来控制内核启动的过程,例如:nUJLinux联盟
"console=ttyS2,115200 mem=64M@0xA0000000"nUJLinux联盟
这里指定了控制台是串口2,波特率是115200,内存大小是64M,物理基地址是0xA0000000。nUJLinux联盟
另外我们可以在内核中定义一些全局变量,使用这些全局变量控制内核的配置,例如usb驱动中定义了nUJLinux联盟
static int nousb; /* Disable USB when built into kernel image */nUJLinux联盟
这个变量为1,则整个usb驱动不初始化,如果想将其置1,可在字符串命令行中添加nousb=1。nUJLinux联盟
在操作该变量之前,还要让系统知道该变量,方法是:nUJLinux联盟
__module_param_call("",nousb,param_set_bool,param_get_bool,&nousb,0444);nUJLinux联盟
__module_param_call这个宏定义在kernel\include\linux\moduleparam.hnUJLinux联盟
原型如下:nUJLinux联盟
#define __module_param_call(prefix, name, set, get, arg, perm)  \nUJLinux联盟
 static char __param_str_##name[] = prefix #name;  \nUJLinux联盟
 static struct kernel_param const __param_##name   \nUJLinux联盟
 __attribute_used__      \nUJLinux联盟
    __attribute__ ((unused,__section__ ("__param"),aligned(sizeof(void *)))) \nUJLinux联盟
 = { __param_str_##name, perm, set, get, arg }nUJLinux联盟
 nUJLinux联盟
它定义了一个kernel_param类型的变量,这个变量被放到了段__param,nUJLinux联盟
kernel_param结构体的定义是:nUJLinux联盟
struct kernel_param {nUJLinux联盟
 const char *name;nUJLinux联盟
 unsigned int perm;nUJLinux联盟
 param_set_fn set;nUJLinux联盟
 param_get_fn get;nUJLinux联盟
 void *arg;nUJLinux联盟
};nUJLinux联盟
__param这个段的声明有些平台是在arch/../../vmlinux.lds.S,而大多数平台是放到nUJLinux联盟
kernel\include\asm-generic\vmlinux.lds.h中,定义如下:nUJLinux联盟
 __param : AT(ADDR(__param) - LOAD_OFFSET) {   \nUJLinux联盟
  VMLINUX_SYMBOL(__start___param) = .;   \nUJLinux联盟
  *(__param)      \nUJLinux联盟
  VMLINUX_SYMBOL(__stop___param) = .;   \nUJLinux联盟
 }nUJLinux联盟
内核启动时就会对字符串命令进行解析,在kernel\init\main.c中,内核启动函数start_kernel中nUJLinux联盟
对外部数组进行了声明:nUJLinux联盟
extern struct kernel_param __start___param[], __stop___param[];nUJLinux联盟
然后调用函数parse_args对数组进行解析:nUJLinux联盟
 parse_args("Booting kernel", command_line, __start___param,nUJLinux联盟
     __stop___param - __start___param,nUJLinux联盟
     &unknown_bootoption);

其中command_line就是要解析的字符串命令行,unknown_bootoption是函数指针,它用来获取指定参数的=右边的值。nUJLinux联盟
parse_args就会在数组中找到和nousb名称一样的kernel_param变量,并调用它的set函数对其进行付值。

Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·Linux系统2.6内核改进的内存管理剖析  (2006-12-26 10:48:26)
 ·Linux系统2.4和2.6内核上Web服务比较  (2006-12-22 11:28:06)
 ·基于Linux2.6内核ACL功能体验之旅  (2006-12-14 11:10:24)
 ·编写简单的Linux2.6内核模块  (2006-10-29 12:12:27)
 ·剖析Linux 2.6内核移植—超线程篇  (2006-09-21 10:55:28)
 ·在Debian的Linux 2.6内核Ipv6的问题  (2006-09-20 11:29:07)
 ·剖析Linux 2.6内核移植-内核设置篇  (2006-09-20 11:23:32)
 ·剖析Linux 2.6内核移植—硬件驱动篇  (2006-09-20 11:18:34)
 ·剖析Linux 2.6内核移植—应用程序篇  (2006-09-20 10:47:42)
 ·剖析Linux 2.6内核移植—系统移植篇  (2006-09-20 10:42:21)