66、操作系统内核配置与调制解调器知识详解

操作系统内核配置与调制解调器知识详解

1. 消息队列相关参数

消息队列有一系列重要参数,如下所示:

int          msgmap;   /* # of entries in msg map */
int          msgmax;   /* max message size */
int          msgmnb;   /* max # bytes on queue */
int          msgmni;   /* # of message queue identifiers */
int          msgssz;   /* msg segment size (should be word size multiple) */
int          msgtql;   /* # of system message headers */
ushort_t     msgseg;   /* # of msg segments (MUST BE < 32768) */

对应的“消息队列”值如下:
| 参数 | 值 |
| ---- | ---- |
| msgmap | 10 |
| msgmax | 65535 |
| msgmnb | 65535 |
| msgmni | 50 |
| msgssz | 16 |
| msgtql | 40 |
| msgseg | 8192 |

2. Solaris 内核重新配置失败的回退方案

如果 Solaris 内核重新配置出现问题,导致系统无法正常启动,可以采用以下回退方案:
1. 将系统引导到单用户模式。具体操作是,先通过输入“halt”命令或向控制台发送“break”信号( )停止系统,然后使用额外的可选标志“ - a”将系统引导到单用户模式,此时会询问内核执行相关信息,如系统文件位置、根挂载位置等,默认响应会包含在方括号中,按回车键即可确认。
2. 用“旧的良好”数据替换内核或内核配置文件。
3. 将系统重新引导到多用户模式,之后可以继续进行重新配置活动。

需要注意的是,在进行任何内核修改之前,不要忘记保存内核核心映像和 /etc/system 文件。

3. Linux 内核配置

Linux 官方的内核配置文件是隐藏文件 /usr/src/linux/.config,该文件几乎包含了所有内核配置数据,但调优内核参数并不在这个文件中,Linux 对它们的处理方式不同。

3.1 配置新内核的工具

为了避免直接编辑 /usr/src/linux/.config 文件可能出现的错误,Linux 推荐使用以下“make”目标工具:
- make xconfig :启动基于 X 的图形用户界面(GUI)。
- make menuconfig :调用基于光标控制的菜单。
- make config :启动基于字符的问答对话。
- make oldconfig :以最小的工作量将现有配置应用到新版本。

这些工具的使用难度逐渐增加,GUI 最舒适,但需要可用的 X 环境。

3.2 内核配置示例

以下是 Linux 内核 v.2.4.2 配置文件的一小部分内容:

# cat /usr/src/linux/.config
#
# Automatically generated by make xconfig: don't edit
#
CONFIG_X86 = y
CONFIG_ISA = y
#
# Processor type and features
# CONFIG_M386 is not set
CONFIG_M686 = y
#
# General setup
CONFIG_NET = y
CONFIG_PCI = y
#
# ARCnet devices
CONFIG_DUMMY = m
#
# Filesystems
# CONFIG_QUOTA is not set
CONFIG_AUTOFS4_FS = y
CONFIG_VFAT_FS = m
#
# Kernel hacking
# CONFIG_MAGIC_SYSRQ is not set

配置文件涵盖了 40 多个不同方面的内核配置,每个方面可能有多个配置项,可设置为“y”(启用)、注释掉(未设置)或“m”(作为可加载模块)。

3.3 内核配置注意事项
  • 包含不必要的驱动会使内核变大,在某些情况下可能导致问题。
  • 使用更高“处理器类型”编译内核可能导致内核无法工作。
  • 编译了数学仿真的内核在有协处理器时仍会使用协处理器,内核会稍大,但可在不同机器上工作。
  • “内核黑客”配置细节通常会使内核变大或变慢,甚至使内核不稳定。
3.4 重建内核步骤

修改 .config 文件后,需要重建内核使更改生效,步骤如下:
1. 运行 make depend make dep 正确设置所有依赖项。
2. 运行 make clean 创建干净的构建环境(可选)。
3. 运行 make bzImage 创建压缩内核映像。若要制作启动盘(无根文件系统或 LILO),插入软盘并运行 make bzdisk
4. 如果内核的任何部分指定为模块,运行 make modules 后再运行 make modules_install
5. 保存备份内核及相应模块,以防出现问题。
6. 将新内核映像 /usr/src/linux/arch/i386/boot/bzImage 复制到常规可引导内核所在位置,通常是 /boot/vmlinuz,同时保存旧内核映像。
7. 编辑 /etc/lilo.conf 文件以反映内核配置更改,指定新的和回退内核映像,运行 /sbin/lilo 命令重新安装引导加载程序 LILO。
8. 重新安装 LILO 后,重启系统使更改生效。

如果保留了通常的内核命名,并且新的和旧的内核映像已复制到现有 /etc/lilo.conf 文件中指定的可引导和回退内核位置,则可以跳过步骤 7。

以下是一个实际的 LILO 配置文件示例:

$ cat /etc/lilo.conf
boot = /dev/sda
map = /boot/map
install = /boot/boot.b
prompt
timeout = 30
linear
compact
image = /boot/vmlinuz−2.4.2
label = l−2.4.2
initrd = /boot/initrd−2. 4.2.img
read−only
root = /dev/md0
image = /boot/vmlinuz−2.2.14 –5.0smp
label = linux
initrd = /boot/initrd−2. 2.14–5.0smp.img
read−only
root = /dev/md0
image = /boot/vmlinuz−2.2.14 –5.0
label = linux−up
initrd = /boot/initrd−2. 2.14–5.0.img
read−only
root = /dev/md0
4. 调优 Linux 内核参数

Linux 通过 /proc 文件系统中的“虚拟文件”,特别是 /proc/sys/kernel 目录,提供了广泛的内核到用户的接口。为避免对 /proc 文件读写权限的混淆,可使用 /sbin/sysctl 命令。

4.1 sysctl 命令选项
  • sysctl [−n] variable :读取指定参数,例如 sysctl kernel.ostype 会输出 kernel.ostype = Linux ,使用 -n 选项可禁用打印键名。
  • sysctl [−n] variable = value :在线设置单个变量,下次重启前有效。
  • sysctl –w variable = value :更改 /etc/sysctl.conf 文件中的设置。
  • sysctl –p /etc/sysctl.conf :加载并使指定 sysctl 配置文件的内容生效,系统启动时会应用此命令选项。
  • sysctl –a :列出所有系统配置参数,包括内核参数。

以下是 sysctl –a 命令的部分输出,仅列出内核参数:

$ /sbin/sysctl −a
sunrpc.nlm_debug = 0
dev.raid.speed_limit_max = 100 000
fs.binfmt_misc.status = enabled
net.unix.max_dgram_qlen = 10
vm.page−cluster = 4
kernel.overflowgid = 65534
kernel.overflowuid = 65534
kernel.random.uuid = 2c396920 −8db7−4d2a−8dde−ed9fd456a0fe
kernel.random.boot_id = bc469e 92−1bc6−424d−9f81−abb2469eb495
kernel.random.write_wakeup_threshold = 128
kernel.random.read_wakeup_threshold = 8
kernel.random.entropy_avail = 0
kernel.random.poolsize = 512
kernel.threads−max = 131070
kernel.sem = 250  32000  32  128
kernel.msgmnb = 16384
kernel.msgmni = 16
kernel.msgmax = 8192
kernel.shmmni = 4096
kernel.shmall = 2097152
kernel.shmmax = 524288000
kernel.rtsig−max = 10 24
kernel.rtsig−nr = 0
kernel.modprobe = /sbin /modprobe
kernel.printk=64  1  7
kernel.ctrl−alt−del = 0
kernel.real−root−dev = 2304
kernel.cap−bound = –257
kernel.panic = 60
kernel.domainname =
kernel.hostname = atlas.scps.nyu.edu
kernel.version = #2 SMP Fri Feb 23 18:38:55 GMT 2001
kernel.osrelease = 2.4.2
kernel.ostype = Linux
4.2 /etc/sysctl.conf 文件示例
$ cat /etc/sysctl.conf
   #net.ipv4.ip_local_port_range = 32768–61000
   #net.ipv4.ip_forward = 0
   #net.ipv4.tcp_syncookies = 0
   #net.ipv4.tcp_keepalive_probes = 1
   #net.ipv4.ip_default_ttl = 64
   #net.ipv4.tcp_keepalive_probes = 3
   #net.ipv4.tcp_keepalive_time = 360
   #net.ipv4.tcp_max_ka_probes = 5
   #net.core.netdev_max_backlog = 1000
   #net.core.rmem_default = 32768
   #net.core.wmem_default = 131072
   #net.core.rmem_max = 32768
   #net.core.wmem_max = 131072
   #net.core.optmem_max = 40960
   fs.file−max = 16384
   #fs.inode−nr = 65536
   #net.ipv4.tcp_window_scaling = 0
   kernel.shmmax = 524288000
   kernel.panic = 60

在这个特定示例中,大多数内核参数使用默认值。

4.3 新内核配置失败的回退方法

假设 LILO 配置正确,指定了可引导和一个或多个回退内核映像,回退操作很简单。启动时,引导加载程序默认等待四秒(40 分秒,1 分秒为 1/10 秒),或按 LILO 配置文件指定的时间等待用户按下 Shift 键。如果不按,将引导第一个指定的内核映像;如果按下,引导加载程序会询问要引导哪个映像。若忘记可选选项,按 [TAB] 或 [?] 会显示可用内核映像的菜单,最多可在 /etc/lilo.conf 文件中指定 16 个内核映像。

5. 调制解调器介绍

调制解调器是一种电信设备,可通过传输线实现远程数据传输,其工作原理是将数据流调制到适合远程传输的健壮载波上,在接收端再进行解调。它由两部分组成:
- 发送器(调制器):将输入数据调制到适合远程数据传输的载波中。
- 接收器(解调器):对接收到的载波进行解调并提取传输的数据。

调制解调器的名称是“MOdulator - DEModulator”的缩写,代表一个双向传输设备,传输方式可以是串行、异步或同步,工作模式有半双工(数据发送和接收在不同时间进行)和全双工(数据发送和接收同时进行)。参与通信的两个调制解调器必须相互兼容。

5.1 调制解调器的发展

过去,调制解调器是“哑”设备,仅将串行数据信号转换为适合远程传输的形式,计算机串行接口(DCE)和调制解调器(DTE)之间仅使用少数控制信号,如请求发送(RTS)、清除发送(CTS)和数据载波检测(DCD)等。

新技术使调制解调器成为“智能”设备,引入了基于 ASCII 的 AT 命令协议,可通过计算机发出一系列 AT 命令灵活配置调制解调器。AT 命令以“AT”开头,几个 AT 命令可组合在同一个“AT”前缀后面,虽然对用户来说比较晦涩,但对调制解调器来说很全面,能优化调制解调器配置,提高数据传输效率。调制解调器在建立连接时会自动检查互连介质的实际质量,并调整到最佳速度和调制参数,保证最佳数据传输。

5.2 文件传输协议

为了在低速调制解调器上高效传输数据,出现了许多文件传输协议,至今仍在使用的有:
- Xmodem:最常用的文件传输协议之一,最初使用 128B 数据包和简单的校验和错误检测方法,后来有 Xmodem - CRC 和 Xmodem - 1K 等改进版本。
- Ymodem:本质上是 Xmodem - 1K 协议,允许批量传输多个文件,其改进版本 Ymodem - g 支持误差控制调制解调器。
- Zmodem:通常是最好的协议,具有高效和支持崩溃恢复的特点,若传输中断,可恢复传输,无需重新发送已传输的数据。

这些协议分别由 sx 和 rx、sy 和 ry、sz 和 rz 发送/接收程序支持,在 UNIX 平台上也可用。

6. UNIX 与调制解调器的关系

长期以来,调制解调器主要被视为传输线的一部分,而不是计算机系统本身。UNIX 主要关注如何控制与调制解调器相连的串行接口。

大多数 UNIX 实现存在一个长期缺陷,即同一调制解调器无法同时用于拨入和拨出的全双工模式,主要原因如下:
- 控制串行端口的驱动程序是为控制终端和系统之间的数据流而设计的,它会监控数据载波检测信号(DCD)以确定线路上是否有数据,从而开始与连接的终端进行通信。
- 当检测到 DCD 信号时,会调用 getty 程序启动登录过程,即在线路上显示登录提示。

当系统本身要通过调制解调器发起通信时,会出现问题。系统拨出时,DCD 信号缺失,getty 程序也可能成为障碍。如果远程系统尝试发起通信,getty 可能会对拨入的远程信号做出响应。

综上所述,无论是操作系统内核配置还是调制解调器的使用,都有各自的特点和需要注意的地方。在进行内核配置时,要严格按照步骤操作,并做好备份和回退准备;在使用调制解调器时,要根据实际需求选择合适的传输协议,并了解 UNIX 系统对调制解调器的控制机制。

操作系统内核配置与调制解调器知识详解

7. 调制解调器通信流程分析

为了更清晰地理解调制解调器的工作过程,我们可以通过 mermaid 流程图来展示其通信流程。

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;

    A([开始通信]):::startend --> B{调制解调器初始化}:::decision
    B -->|成功| C(发送端调制数据):::process
    B -->|失败| D([通信失败]):::startend
    C --> E(数据通过传输线传输):::process
    E --> F(接收端解调数据):::process
    F --> G{数据完整性检查}:::decision
    G -->|通过| H([通信成功]):::startend
    G -->|未通过| I(请求重传数据):::process
    I --> C

从这个流程图可以看出,调制解调器通信的第一步是初始化。如果初始化成功,发送端将数据进行调制,然后通过传输线将调制后的数据传输到接收端。接收端对数据进行解调,并进行数据完整性检查。如果检查通过,则通信成功;如果未通过,则请求发送端重传数据。

8. 调制解调器配置示例

假设我们要配置一个调制解调器来连接到远程服务器,以下是一个简单的配置步骤和示例代码(假设使用 AT 命令):

  1. 连接调制解调器 :将调制解调器通过串口连接到计算机。
  2. 打开串口通信 :使用串口通信工具(如 minicom 等)打开与调制解调器的连接。
  3. 发送 AT 命令进行配置
    • AT :测试调制解调器是否响应。
    • AT+CGDCONT=1,"IP","your_apn" :设置接入点名称(APN)。
    • ATD*99# :拨号连接到远程服务器。

以下是一个使用 Python 脚本通过串口发送 AT 命令的示例:

import serial

# 打开串口
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)

# 发送 AT 命令测试调制解调器
ser.write(b'AT\r\n')
response = ser.readline()
print(f"AT 命令响应: {response.decode('utf-8').strip()}")

# 设置 APN
apn = 'your_apn'
at_command = f'AT+CGDCONT=1,"IP","{apn}"\r\n'
ser.write(at_command.encode('utf-8'))
response = ser.readline()
print(f"设置 APN 响应: {response.decode('utf-8').strip()}")

# 拨号连接
ser.write(b'ATD*99#\r\n')
response = ser.readline()
print(f"拨号响应: {response.decode('utf-8').strip()}")

# 关闭串口
ser.close()
9. 调制解调器故障排除

在使用调制解调器的过程中,可能会遇到各种故障。以下是一些常见故障及排除方法:

故障现象 可能原因 排除方法
调制解调器无响应 电源问题、串口连接问题、调制解调器损坏 检查电源是否正常,重新插拔串口线,尝试更换调制解调器
无法连接到远程服务器 APN 设置错误、信号弱、网络问题 检查 APN 设置是否正确,移动调制解调器到信号强的地方,检查网络是否正常
数据传输不稳定 调制解调器性能问题、传输线问题 尝试更换调制解调器,检查传输线是否损坏
10. 内核配置与调制解调器的关联

操作系统内核配置与调制解调器的使用密切相关。例如,内核中的串口驱动配置会影响调制解调器与计算机的通信。如果内核中没有正确配置串口驱动,调制解调器可能无法正常工作。

在 Linux 系统中,可以通过修改内核配置文件来确保串口驱动的正确配置。以下是一些可能需要关注的内核配置项:

  • CONFIG_SERIAL_8250 :支持 8250 系列串口芯片。
  • CONFIG_SERIAL_CORE :串口核心驱动。

可以使用 make menuconfig 工具来检查和修改这些配置项:

  1. 进入内核源代码目录: cd /usr/src/linux
  2. 运行 make menuconfig 命令。
  3. 在菜单中找到 Device Drivers -> Character devices -> Serial drivers 选项。
  4. 确保 8250/16550 and compatible serial support Serial core driver support 选项被选中。
  5. 保存配置并退出。
11. 总结与展望

本文详细介绍了操作系统内核配置和调制解调器的相关知识。在操作系统内核配置方面,我们了解了 Solaris 和 Linux 内核的配置方法、内核参数调优以及新内核配置失败的回退方案。在调制解调器方面,我们介绍了调制解调器的工作原理、发展历程、文件传输协议以及 UNIX 系统与调制解调器的关系。

随着技术的不断发展,操作系统内核配置将变得更加自动化和智能化,用户可以更方便地进行内核定制。调制解调器也在不断升级,传输速度和稳定性将得到进一步提高。未来,我们可以期待操作系统和调制解调器在更多领域发挥更大的作用,为人们的生活和工作带来更多便利。

同时,对于开发者和系统管理员来说,深入了解内核配置和调制解调器知识是非常必要的。只有掌握了这些知识,才能更好地应对各种系统问题,提高系统的性能和稳定性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值