转载于: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. AtCoder Beginner Contest 137 D题【贪心】

    [题意]一共有N个任务和M天,一个人一天只能做一个任务,做完任务之后可以在这一天之后的(Ai-1)天拿到Bi的工资,问M天内最多可以拿到多少工资. 链接:https://atcoder.jp/cont ...

  2. BUUCTF平台-web-边刷边记录-1

    1.WarmUp 思路很清晰,文件包含,漏洞点在代码会二次解码,只需注入一个?就可以使用../../进行路径穿越,然后去包含flag,flag路径在hint.php里面有 2.easy_tornado ...

  3. substring(x)和substring(x,y)的用法

    substring(x)和substring(x,y)的用法 代码: public class textmu { /** * @param args */ public static void mai ...

  4. QTcpSocket 发送数据的几种方法

    1.QTcpSocket 继承于QAbstractSocket继承于QIODevice 2.QTcpSocket 提供的几种接收和发送数据方法 write ( const char *, qint64 ...

  5. 解决Android Studio 升级时提示 Connection failed. Please check your network connection and try again问题

    一,问题: 无论mac还是windows可能都会出现这个问题,解决方案大同小异,就是修改VMOptions而已. 解决方案: Windows: 在\Android Studio\bin目录下找到 st ...

  6. Ruby on Rails 的模型 validates 验证

    validate(), 这个方法在每次保存数据时都会被调用.如:def validate if name.blank? && email.blank?  errors.add_to_b ...

  7. Mysql 查询当前数据上一条和下一条的记录

    获取当前文件上一条与下一条记录的原理是上一条的sql语句,从news表里按从大到小的顺序选择一条比当前ID小的新闻,下一条的sql语句,从news表里按从小到大的顺序选择一条比当前ID大的新闻. 如果 ...

  8. vue 组件属性props,特性驼峰命名,连接线使用

    网址:https://www.cnblogs.com/alasq/p/6363160.html 总结如下:vue的组件的props属性支持驼峰命名,不支持连接线命名,使用是用连接线进行赋值或者数据绑定 ...

  9. selenium 2019 笔记

    1.get打开本地目录的方法

  10. 来自iSpy整理的最全海康大华IPC的RTSP连接地址

    来自iSpy整理的最全海康大华IPC的RTSP连接地址 先贴出处: 海康:http://www.ispyconnect.com/man.aspx?n=Hikvision 大华:http://www.i ...