_nosay 发表于 2016-07-14 11:22

setup.S beep疑问?

arch/i386/boot/setup.S, line 197~208:prtchr:        pushw        %ax
        pushw        %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不是专门控制显示的吗,怎么声音也要它?

Tinnal 发表于 2016-07-14 15:22

根据标准ASCII定义,输出007字符,代表要PC响铃。

ASCII表里定了很多非显示的符号,详情请看:
http://baike.baidu.com/item/ASCII

_nosay 发表于 2016-07-14 15:39

回复 2# Tinnal

噢:em09: ,那么printf("%c\n", 7);为啥不响?显卡和声卡都“接收”到这个7了吗?

Tinnal 发表于 2016-07-14 23:14

在我的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

_nosay 发表于 2016-07-15 00:41

回复 4# Tinnal

If that fails, then try inserting the "snd_pcsp" kernel module instead of the "pcspkr" module.
不知道是不是这个原因,我明天再试试噢。

nswcfd 发表于 2016-07-15 09:21

好问题,还真没仔细想过……

跟终端有关系吧,比如ssh里面printf '\a',总不至于触发远程的server去beep一下吧?

nswcfd 发表于 2016-07-15 18:11

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。

_nosay 发表于 2016-07-15 18:34

回复 7# nswcfd

我对终端不了解,看不懂{:yxh17:},总之就是跟bash和tty有关是吧?

nswcfd 发表于 2016-07-15 20:24

对于pty的场景,则直接通过tty->link发送给ptm了,然后被app的sys_read获得。
* 如果是是远程ssh,则被sshd发送给登录的client,由client的软件负责回显\a。*
* 如果是本地ssh,sshd发送给ssh,ssh发送给当前终端,又回到了楼上con_write的情况。

_nosay 发表于 2016-07-16 13:40

回复 9# nswcfd

:shock: :em09:
页: [1] 2
查看完整版本: setup.S beep疑问?