TTY之struct console

    xiaoxiao2021-03-25  146

    console是个控制端口,这当然也是一个串口。这里我们利用struct console描述串口驱动, struct console实例来把kernel log导出。当然这里侧重描述其数据处理。 这类设备可以进行读写。读一般是指从硬件读取数据,然后把数据分发到相应的进程中去。而写则是把内核一些log 通过硬件传递给客户。 串口设备驱动描述: struct console {  char name[16];  void (*write)(struct console *, const char *, unsigned);  int (*read)(struct console *, char *, unsigned);  struct tty_driver *(*device)(struct console *, int *);  void (*unblank)(void);  int (*setup)(struct console *, char *);  int (*match)(struct console *, char *name, int idx, char *options);  short flags;  short index;  int cflag;  void *data;  struct  console *next; };   当然对象console是通过函数register_console()注册,而unregister_console()则进行注销操作。 所有的console通过next链接起来。宏for_each_console()可以对所有注册的console迭代。   /*  * for_each_console() allows you to iterate on each console  */ #define for_each_console(con) \  for (con = console_drivers; con != NULL; con = con->next) 所有的console以console_drivers为头,并console_sem保护。 static DEFINE_SEMAPHORE(console_sem); struct console *console_drivers; EXPORT_SYMBOL_GPL(console_drivers);   如果想独占使用console,则可以调用函数console_lock()锁住console,使用函数console_unlock()解锁。 或者尝试性使用console_trylock()获取锁。成功获取锁的标识是console_locked被设置为1.当然在系统suspend时候 是不允许持有这个console_locked的。而console_suspended是console是否Suspen和resume的标志,如果 console_suspended为真,说明系统处于suspend当中,这时获取console_locked时失败,不会设置 console_locked。 注意,获取锁也会设置console_sem信号量。  

    void console_lock(void) {  might_sleep();

     down_console_sem();  if (console_suspended)   return;  console_locked = 1;  console_may_schedule = 1; } EXPORT_SYMBOL(console_lock);

      int console_trylock(void) {  if (down_trylock_console_sem())   return 0;  if (console_suspended) {   up_console_sem();   return 0;  }  console_locked = 1;  console_may_schedule = !oops_in_progress &&    preemptible() &&    !rcu_preempt_depth();  return 1; } EXPORT_SYMBOL(console_trylock);   int is_console_locked(void) {  return console_locked; }      
    转载请注明原文地址: https://ju.6miu.com/read-5596.html

    最新回复(0)