setup.S beep疑问?
arch/i386/boot/setup.S, line 197~208:prtchr: pushw %axpushw %cx
xorb %bh, %bh
movw $0x01, %cx
movb $0x0e, %ah
int $0x10
popw %cx
popw %ax
ret
beep: movb $0x07, %al
jmp prtchr请问"beep:movb $0x07, %al"这条指令是发出个声音吗?为什么将al设置成0x07后去调用int 0x10,int 0x10不是专门控制显示的吗,怎么声音也要它? 根据标准ASCII定义,输出007字符,代表要PC响铃。
ASCII表里定了很多非显示的符号,详情请看:
http://baike.baidu.com/item/ASCII 回复 2# Tinnal
噢:em09: ,那么printf("%c\n", 7);为啥不响?显卡和声卡都“接收”到这个7了吗? 在我的Fedora环境能响呀,用你的的程序我自己试了一下,是OK的。。你也可以在终端按退格,或TAB键,电脑也会响,如果不想就是你的终端没有实现的了。因为这个字符是终端去处理的,PC的BIOS也能处理。
可以参考一下下面的连接:
http://www.linux.org/threads/enabling-the-ascii-bell-or-system-beep.7944/
http://stackoverflow.com/questions/3456138/this-program-sounds-the-bell 回复 4# Tinnal
If that fails, then try inserting the "snd_pcsp" kernel module instead of the "pcspkr" module.
不知道是不是这个原因,我明天再试试噢。 好问题,还真没仔细想过……
跟终端有关系吧,比如ssh里面printf '\a',总不至于触发远程的server去beep一下吧? 1. 第一个层面,bash/readline库有bell-style选项,搜了一下bash的代码,
audible模式调用printf("\b"),而visible模式调用curses::tputs输出termcap的vb转义串(例如\e[?5h\e[?5l),
termcap的visual bell相当于terminfo的flash,也就是让屏幕闪一下。
2. 无论是\b还是escape串,通过vfs送入各种tty,
tty会有一个ldisc,缺省是N_TTY (存在其它ldisc,例如N_PPP),主要用来实现termios里定义的各种行为(例如回显,退格\b,raw/canonical模式的转换),
vfs_write -> tty_write -> tty.ldisc.ops.write -> N_TTY:write_chan -> tty.driver.write -> 分支为con_write/pty_write等。
对于/dev/ttyN, con_write -> do_con_write -> do_con_trol,对escape序列进行解释(使用一个状态机),
上述的5h和5l分别触发set_mode/invert_screen,造成屏幕的闪烁。
同样,在do_con_trol里,会调用kd_mksound,通过kbd子系统与各种输入设备产生关联,
典型的虚拟机会有at&t keyboad, pc speaker等input device,都有可能产生最终的beep。 回复 7# nswcfd
我对终端不了解,看不懂{:yxh17:},总之就是跟bash和tty有关是吧? 对于pty的场景,则直接通过tty->link发送给ptm了,然后被app的sys_read获得。
* 如果是是远程ssh,则被sshd发送给登录的client,由client的软件负责回显\a。*
* 如果是本地ssh,sshd发送给ssh,ssh发送给当前终端,又回到了楼上con_write的情况。 回复 9# nswcfd
:shock: :em09:
页:
[1]
2