初始引导时/dev/console /dev/ram0来历

Linux系统启动设备文件创建
我们知道linux 使用程序udev来在/dev目录下建立各种设备文件。然而,系统引导时,udev并没有执行。那么,系统初始化时用到的/dev/console /dev/ram0从哪里来的呢?
见main.c init()函数中:
if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)

/dev/ram 来历:
[init>prepare_namespace>initrd_load]
create_dev("/dev/ram", Root_RAM0);

/dev/console来历:
[init>do_basic_setup>do_basic_setup>do_initcalls>tty_init]
register_chrdev_region(MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console") < 0)
<think> 根据提供的`/proc/tty/drivers`内容,系统确实加载了`ttyH`驱动(主设备号为4),关联设备节点为`/dev/ttyH*`。但之前`dmesg`日志显示硬件实际使用的是`ttyAMA`驱动(主设备号204)。冲突的核心在于**同一串口硬件被多个驱动声明**。 ### 问题根源分析: 1. **驱动冲突** - `ttyH`驱动(主设备号4)和`ttyAMA`驱动(主设备号204)同存在 - 硬件地址`0xff812000`可能被两个驱动重复绑定,导致行为异常 2. **设备节点有效性验证** ```bash # 检查串口硬件实际绑定的驱动 ls -l /sys/class/tty/ttyH0/device/driver ls -l /sys/class/tty/ttyAMA0/device/driver ``` 若两者指向同一物理设备,则证明冲突 ### 解决方案: #### 方法1:强制卸载冲突驱动 ```bash # 卸载ttyH驱动(根据模块名) rmmod hsuart # 模块名来自`/proc/tty/drivers`第一列 # 重新绑定AMA驱动 echo ff812000.serial0 > /sys/bus/platform/drivers/pl011/bind ``` #### 方法2:修改内核启动参数(永久生效) 在U-Boot或grub中追加: ```text console=ttyAMA0,115200 earlycon=pl011,0xff812000 **ignore_locked** ``` #### 方法3:设备树黑名单(嵌入式专用) 在设备树中禁用`ttyH`驱动: ```dts &hsuart { status = "disabled"; }; ``` §§相关问题§§ 1. Linux内核如何通过`compatible`属性决定加载哪个设备驱动(如设备树中的`arm,pl011` vs `ns16550a`)? 2. 当多个驱动匹配同一硬件,如何通过`/sys/bus/platform/drivers`下的`bind`/`unbind`文件手动解绑冲突驱动? 3. 在U-Boot阶段,`earlycon`参数如何影响内核后续的串口驱动初始化顺序? 4. 如何通过`lsof /dev/ttyH0`命令检查是否有其他进程占用了该串口设备? 5. 主设备号(如4和204)在Linux设备管理中如何避免冲突? </think>根据您提供的 `/proc/tty/drivers` 输出,系统确实加载了 `ttyH` 驱动(主设备号4),但设备仍无法使用的问题可能是由以下原因造成的: ### 问题诊断与解决方案: 1. **驱动与硬件不匹配(核心问题)** - `dmesg` 显示硬件使用 **ttyAMA** 驱动(物理地址 0xff812000) - `/proc/tty/drivers` 显示 **ttyH** 驱动(主设备号4)和 **ttyAMA** 驱动(主设备号204)共存 - **冲突原因**:同一硬件可能被两个驱动同声明 **解决方案**: ```bash # 1. 查看实际硬件绑定 ls -l /sys/class/tty/ttyH0/device/driver ls -l /sys/class/tty/ttyAMA0/device/driver # 2. 强制解绑错误驱动 echo ff812000.serial0 > /sys/bus/platform/drivers/hsuart/unbind # 解绑ttyH # 3. 绑定正确驱动 echo ff812000.serial0 > /sys/bus/platform/drivers/pl011/bind # 绑定ttyAMA ``` 2. **权限问题(次要可能)** ```bash # 检查设备权限 ls -l /dev/ttyH0 # 临添加权限 chmod 666 /dev/ttyH0 ``` 3. **硬件资源冲突** ```bash # 检查中断和IO地址冲突 dmesg | grep -e ff812000 -e tty -e serial # 查看资源分配 cat /proc/ioports | grep serial cat /proc/interrupts | grep 73 ``` ### 根本解决建议: **修改设备树配置**(永久方案): ```dts // 在设备树中禁用hsuart驱动 &hsuart { status = "disabled"; }; // 确保pl011驱动正确启用 &serial0 { compatible = "arm,pl011"; reg = <0xff812000 0x1000>; interrupts = <73>; status = "okay"; }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值