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 启动传递命令行分析
[ 作者:taoyuetao  加入时间:2007-08-29 12:13:09  来自:Linux联盟收集整理 ]

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

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

xDZLinux联盟

Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·linux2.6.21 kernel移植到AT91SAM9261EK  (2007-07-13 11:09:44)
 ·Linux2.6内核epoll 网络编程  (2007-06-01 10:18:27)
 ·内核操作 Linux2.6内核驱动移植参考  (2007-04-27 10:08:26)
 ·移植linux2.6.14到S3C2410平台上的内核配置文件  (2007-04-23 13:00:51)
 ·将驱动及应用软件移植到Linux2.6内核  (2007-03-01 12:34:19)
 ·linux2.6内核启动传递命令行分析  (2007-02-01 11:27:54)
 ·基于Linux2.6内核ACL功能体验之旅  (2006-12-14 11:10:24)
 ·Linux2.6对新型CPU快速系统调用的支持  (2006-10-30 11:06:46)
 ·编写简单的Linux2.6内核模块  (2006-10-29 12:12:27)
 ·linux2.6内核编译方法详述  (2006-08-09 11:15:14)