小编use*_*358的帖子

如何找到连接到哪个物理设备/ dev/console?

有一个名为的设备文件/dev/console,其名称(major,minor)(5,1).当我使用串行控制台启动时,它会像我一样连接到我的UART端口/dev/ttyS0.但是当我禁用串行控制台启动时,/dev/console似乎连接到其他地方,/dev/ttyS0总是连接到同一个物理设备,即UART0.是否有任何迹象(如/proc或某些内容/sys)显示此类信息?我在那里试过但却找不到我想要的东西.我开始追踪Linux内核源代码以澄清它们之间的关系.任何人都可以给我一些提示吗?何时,何地,如何以及如何确定/dev/console连接的物理设备?

编辑:最新的发现是:

  1. /dev/console由配置console=内核参数,而这又是使用的getty打开stdin/stdout/stderr.如果未console=指定,/dev/null则打开为stdin/stdout/stderr.但我不确定它们是否完全相同/dev/console,这意味着/dev/console可以将其I/O连接到不同的物理设备.
  2. /dev/console如果USB HID键盘已插入console=且未配置为UART ,则可以读取.因此/dev/console== /dev/null似乎没什么意义.需要更多调查.

tty linux-device-driver linux-kernel embedded-linux

14
推荐指数
1
解决办法
1万
查看次数

为什么这段代码会阻止gcc&llvm进行尾调优化?

我曾尝试在GCC 4.4.5在Linux在Mac OSX(4.2.1的Xcode)和下面的代码和gcc-LLVM .以下是相关功能的来源和生成的反汇编.(补充:编译gcc -O2 main.c)

#include <stdio.h>
__attribute__((noinline))
static void g(long num)
{
        long m, n;
        printf("%p %ld\n", &m, n);
        return g(num-1);
}
__attribute__((noinline))
static void h(long num)
{
        long m, n;
        printf("%ld %ld\n", m, n);
        return h(num-1);
}
__attribute__((noinline))
static void f(long * num)
{
        scanf("%ld", num);
        g(*num);
        h(*num);        
        return f(num);
}
int main(void)
{
        printf("int:%lu long:%lu unsigned:%lu\n", sizeof(int), sizeof(long), sizeof(unsigned));
        long num;
        f(&num);                 
        return 0;
}
Run Code Online (Sandbox Code Playgroud)
08048430 <g>:
8048430:    55                   push   %ebp
8048431:    89 …
Run Code Online (Sandbox Code Playgroud)

c gcc tail-recursion llvm tail-call-optimization

7
推荐指数
1
解决办法
602
查看次数