使用Qemu模拟Arm处理器,修改串口名称

对于基于Arm的Linux嵌入式系统,串口设备名称在
drivers/tty/serial/amba-pl011.c定义。实际的串口设备名称在类型struct uart_driver的实例amba_reg和类型struct console的实例amba_console里定义。我们就试着修改这两个实例变量来修改串口设备名。

static struct uart_driver amba_reg = {
	.owner			= THIS_MODULE,
	.driver_name		= "ttyAMA",
	.dev_name		= "ttyAMAhanj", //修改之前是ttyAMA
	.major			= SERIAL_AMBA_MAJOR,
	.minor			= SERIAL_AMBA_MINOR,
	.nr			= UART_NR,
	.cons			= &amba_console,
};

这个amba_reg变量的dev_name域定义了串口设备名称,是实实在在的设备名称,在/dev目录里会生成具体设备文件的。

static struct console amba_console = {
	.name		= "ttyAMAconhanj",//修改之前是 ttyAMA
	.write		= pl011_console_write,
	.device		= uart_console_device,
	.setup		= pl011_console_setup,
	.match		= pl011_console_match,
	.flags		= CON_PRINTBUFFER | CON_ANYTIME,
	.index		= -1,
	.data		= &amba_reg,
};

这个amba_console变量的name域是内核控制台设备名称,它与amba_reg.dev_name定义的设备一一对应。内核控制台设备是内核输出日志的,是虚拟设备,相当于/dev下面的设备文件在内核代码里的别名。可以看到amba_console.data 指向了amba_reg,而amba_reg.cons 指向了amba_console,它们捉对取暖。

代码修改之前,串口设备名和内核控制台设备名都是以ttyAMA开头,后面加上数字作为名称。经过这样修改后,我们再编译并更新内核后者两个名称就会区分不开来,达到我们对内核代码的实践性学习。

由于内核控制台设备名称,启动qemu-arm-system时给的内核命令行参数console的值也需要修改,从 "console=ttyAMA0"修改为 "console=ttyAMAconhanj0"。否则的话,启动就会失败。

下面的演示修改之后的编译和运行模拟器:

cd ~/linuxQemuEvb/linux-work/
  ./build.sh
cd aqemu
cat cp-kernel.sh 
#! /bin/bash
cp ../arch/arm/boot/zImage .
cp ../arch/arm/boot/dts/vexpress-v2p-ca9.dtb .
./run-nolcd.sh

进入模拟器控制台之后,我们看看串口设备名和内核控制台设备名修改了没有。
列出/dev下面以ttyAMA开头的设备:

/ # ls /dev/ttyAMA* -l
crw-rw----    1 root     0         204,  64 Jul 16 08:58 /dev/ttyAMA0
crw-rw----    1 root     0         204,  65 Jul 16 08:58 /dev/ttyAMA1
crw-rw----    1 root     0         204,  66 Jul 16 08:57 /dev/ttyAMA2
crw-rw----    1 root     0         204,  67 Jul 16 08:58 /dev/ttyAMA3
-rw-r--r--    1 root     0                3 Aug  1 01:46 /dev/ttyAMA4
crw-rw----    1 root     0         204,  64 Aug  1 03:30 /dev/ttyAMAhanj0
crw-rw----    1 root     0         204,  65 Aug  1 03:30 /dev/ttyAMAhanj1
crw-rw----    1 root     0         204,  66 Aug  1 03:30 /dev/ttyAMAhanj2
crw-rw----    1 root     0         204,  67 Aug  1 03:30 /dev/ttyAMAhanj3

可以看出来7~10行已经列出来来ttyAMAhanj0~4设备,修改成功。

再看看内核控制台设备名称,从下面的日志看出来名称里也含有hanj,修改成功。

/ # cat /proc/consoles 
ttyAMAconhanj0       -W- (EC p a)  204:64

本文使用Qemu模拟Arm处理器,测试修改内核源码的修改效果,这是一个学习linux内核快捷的方法。源码参考:
https://gitee.com/han263012/linux-sty/commit/b177d8d

原文链接:,转发请注明来源!