转载于:http://blog.csdn.net/jgdu1981/article/details/8643057

linux启动时uboot传递进console=ttyS0,115200n8的参数

内核中用__setup()宏声明参数处理的方法

关于__setup宏参考 early_param和__setup宏

  1. __setup("console=", console_setup);

console_setup函数处理

1.console_cmdline结构体

  1. struct console_cmdline
  2. {
  3. char    name[8];        //驱动名
  4. int index;      //次设备号
  5. char    *options;       //选项
  6. #ifdef CONFIG_A11Y_BRAILLE_CONSOLE
  7. char    *brl_options;
  8. #endif
  9. };

2.console_setup

  1. static int __init console_setup(char *str)
  2. {
  3. char buf[sizeof(console_cmdline[0].name) + 4]; //分配驱动名+index的缓冲区
  4. char *s, *options, *brl_options = NULL;
  5. int idx;
  6. #ifdef CONFIG_A11Y_BRAILLE_CONSOLE
  7. if (!memcmp(str, "brl,", 4)) {
  8. brl_options = "";
  9. str += 4;
  10. } else if (!memcmp(str, "brl=", 4)) {
  11. brl_options = str + 4;
  12. str = strchr(brl_options, ',');
  13. if (!str) {
  14. printk(KERN_ERR "need port name after brl=\n");
  15. return 1;
  16. }
  17. *(str++) = 0;
  18. }
  19. #endif
  20. if (str[0] >= '0' && str[0] <= '9') { //第一个参数属于[0,9]
  21. strcpy(buf, "ttyS");    //则将其驱动名设为ttyS
  22. strncpy(buf + 4, str, sizeof(buf) - 5);//将次设备号放其后面
  23. } else {
  24. strncpy(buf, str, sizeof(buf) - 1); //放设备号到其后面
  25. }
  26. buf[sizeof(buf) - 1] = 0;
  27. if ((options = strchr(str, ',')) != NULL)   //获取options
  28. *(options++) = 0;
  29. #ifdef __sparc__
  30. if (!strcmp(str, "ttya"))
  31. strcpy(buf, "ttyS0");
  32. if (!strcmp(str, "ttyb"))
  33. strcpy(buf, "ttyS1");
  34. #endif
  35. for (s = buf; *s; s++)
  36. if ((*s >= '0' && *s <= '9') || *s == ',')
  37. break;
  38. idx = simple_strtoul(s, NULL, 10);  //获取次设备号
  39. *s = 0;
  40. __add_preferred_console(buf, idx, options, brl_options);
  41. console_set_on_cmdline = 1;
  42. return 1;
  43. }

__add_preferred_console函数

  1. static int __add_preferred_console(char *name, int idx, char *options,char *brl_options)
  2. {
  3. struct console_cmdline *c;
  4. int i;
  5. for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++)  //可以最多8个console
  6. if (strcmp(console_cmdline[i].name, name) == 0 && console_cmdline[i].index == idx) {
  7. //比较已注册的console_cmdline数组中的项的名字及次设备号,若console_cmdline已经存在
  8. if (!brl_options)
  9. selected_console = i;   //设置全局selected_console索引号
  10. return 0;       //则返回
  11. }
  12. if (i == MAX_CMDLINECONSOLES)   //判断console_cmdline数组是否满了
  13. return -E2BIG;
  14. if (!brl_options)
  15. selected_console = i;   //设置全局selected_console索引号
  16. c = &console_cmdline[i];    //获取全局console_cmdline数组的第i项地址
  17. strlcpy(c->name, name, sizeof(c->name));  //填充全局console_cmdline的驱动名
  18. c->options = options;    //填充配置选项115200n8
  19. #ifdef CONFIG_A11Y_BRAILLE_CONSOLE
  20. c->brl_options = brl_options;
  21. #endif
  22. c->index = idx;  //填充索引号0
  23. return 0;
  24. }

整体的作用是根据uboot传递的参数设置全局console_cmdline数组 该数组及全局selected_console,在register_console中会使用到 二 console 设备驱动

uboot传递参数'console=ttyXXX'的作用的更多相关文章

  1. uboot向内核模块传递参数的方法

    1 模块参数 定义模块参数 1 module_param(name, type, perm); 定义一个模块参数, name 变量名 type 数据类型 bool:布尔型 invbool:一个布尔型( ...

  2. uboot 如何向内核传递参数

    a.uboot 向内核传递的参数有两种类型 1.一个是bootargs 2.一个是环境参数, 而环境参数的设置靠的是 Y:\junda\JdLinuxApp\A1801_uboot\source\u- ...

  3. C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习

    1)形参 形参顾名思义就是形式上的参数,不是实际的参数,它代替实际传入方法的值.在方法体代码中代表了值本身参与运算.形参定义于参数中,它不同于方法体内局部变量,因为是一个变量,在它的作用域内不允许存在 ...

  4. 【openresty】向lua代码中传递参数

    前面介绍FormInputNginxModule模块时,明白了openresty如何获取post提交的数据. 然后,如果需要通过lua处理这些数据,需要把数据作为参数传递到lua中,lua获取了这些数 ...

  5. Vue系列:通过vue-router如何传递参数

    使用vue-router 来实现webapp的页面跳转,有时候需要传递参数,做法如下: 参考文献:http://router.vuejs.org/en/named.html  主要有以下几个步骤: ( ...

  6. 利用call与apply向函数传递参数

    Js中函数对象都有call与apply两个方法属性,二者使用方法和功能一样,只是传递参数的格式不同,call逐个传递单个参数,apply一次性传递一个参数数组. 这两个方法可以改变函数的调用对象,并且 ...

  7. .net中常用的几种页面间传递参数的方法

    转自:http://www.cnblogs.com/lxshanye/archive/2013/04/11/3014207.html 参考:http://www.cnblogs.com/zhangka ...

  8. ref和out 传递参数(C#)

    1.参数传递默认都是传递栈空间里面存储的内容 2.如果添加了ref那么传递的都是栈空间地址,而不再是栈空间里面的内容 3.如果添加了out,那么传递的也是栈空间的地址 //写一个方法计算一个int类型 ...

  9. C#传递参数

    与函数交换数据的最好方式就是传递参数,在C#中有四种方法来控制参数如何传递给目标方法 C#中的参数修饰符 无修饰 如果一个参数没有用参数修饰符,则认为它将按值传递 out 输出参数由被调用的方法赋值. ...

随机推荐

  1. HGOI 20191107 题解

    Problem A 树状数组 给出下列$C++$代码: 设区间加操作$modify(l,r)$为调用两次$update(r,1)$和$update(l-1,-1)$ 设$f(l,r)$表示在初始$cn ...

  2. Django常见命令

    在Django的使用过程中需要使用命令让Django进行一些操作,例如创建Django项目,启动Django程序,创建新的APP,数据库迁移等. 1. 创建Django项目 新建一个文件夹来存放项目文 ...

  3. SpringSecurity学习总结

    第一.SpringSecurity-简介 1.1简介 SpringSecurity融合Spring技术栈,提供JavaEE应 用的整体安全解决方案: Spring Security为基于Java EE ...

  4. 2017 ZSTU寒假排位赛 #7

    题目链接:https://vjudge.net/contest/149498#overview. A题,水题,直接按照题意模拟一下即可. B题,我用的是线段树.大力用的差分标记(上次听zy说过,下次再 ...

  5. centos 安装mariadb 替代mysql

    yum install mariadb-server mariadb systemctl start mariadbmysql -uroot -p默认密码mysql -uroot -pmysql_se ...

  6. 0ctf-Wallbreaker Easy复现

    补坑+1. 有预留的后门,并且给了phpinfo,因此可以从phpinfo中先搜集一波信息: 这里禁用了很多命令执行的函数,所以应该要bypass_disablefunction,先读一下flag在哪 ...

  7. DDCTF-2018-writeup(5misc)

    打了好几天最后也只是80多名,我好菜啊.jpg 0x00  (╯°□°)╯︵ ┻━┻ 题目: (╯°□°)╯︵ ┻━┻ d4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6 ...

  8. RoP

    RoPS特征提取 RoPS为Rotational Projection Statistics的简写,即旋转投影统计特征.RoPS特征具有对点云旋转和平移(即姿态变化)的不变性,具备很强的鉴别力以及对噪 ...

  9. 订阅发布模式eventEmiter

    // 订阅发布模式 class EventEmitter { constructor() { this._events = {}; } on(name, callback) { if (this._e ...

  10. Winform运行外部控制台程序,并在程序结束后执行其他动作

    ProcessStartInfo psi = new ProcessStartInfo(); psi.FileName = @"程序名"; psi.Arguments = @&qu ...