cli指令的具体实现?

0 views
Skip to first unread message

hc huang

unread,
Oct 21, 2008, 9:50:50 AM10/21/08
to 西邮Linux兴趣小组
请问:linux内核在进行关中断时使用了指令cli()进行关中断,但是这条指令的底层实现是怎样的呢?

李则良

unread,
Oct 21, 2008, 9:58:52 AM10/21/08
to hc huang, 西邮Linux兴趣小组
2008/10/21 hc huang <china...@gmail.com>:
> 请问:linux内核在进行关中断时使用了指令cli()进行关中断,但是这条指令的底层实现是怎样的呢?
你是指什么?在不同平台上吗?这和平台相关,在x86上就是借助cli指令来实现的
219static inline void __deprecated cli(void)
220{
221 local_irq_disable();
222}

>
> >
>

hc huang

unread,
Oct 21, 2008, 10:17:55 AM10/21/08
to 李则良, 西邮Linux兴趣小组
刚才我没有说清楚,你看看这条语句中的cli最终实现是什么?
 #define cli() __asm__ ("cli"::) 这里并没有调用任何函数,只是使用了一条汇编指令cli,而你刚才所解释的是2.26内核版本上的解释,我想问 的是cli汇编指令是怎样实现的。麻烦你再帮解答一下!

2008/10/21 李则良 <lizelia...@gmail.com>

Américo Wang

unread,
Oct 21, 2008, 10:31:22 AM10/21/08
to hc huang, 李则良, 西邮Linux兴趣小组
On Tue, Oct 21, 2008 at 10:17:55PM +0800, hc huang wrote:
>刚才我没有说清楚,你看看这条语句中的cli最终实现是什么?
> #define cli() __asm__ ("cli"::)
>这里并没有调用任何函数,只是使用了一条汇编指令cli,而你刚才所解释的是2.26内核版本上的解释,我想问
>的是cli汇编指令是怎样实现的。麻烦你再帮解答一下!
>

Intel手册Vol-2A,3-127。

P.S. 不要在顶部回复。

--
"Sometimes the only way to stay sane is to go a little crazy."

李则良

unread,
Oct 21, 2008, 10:32:02 AM10/21/08
to hc huang, 西邮Linux兴趣小组
2008/10/21 hc huang <china...@gmail.com>:

> 刚才我没有说清楚,你看看这条语句中的cli最终实现是什么?
> #define cli() __asm__ ("cli"::)
> 这里并没有调用任何函数,只是使用了一条汇编指令cli,而你刚才所解释的是2.26内核版本上的解释,我想问
> 的是cli汇编指令是怎样实现的。麻烦你再帮解答一下!
cli是CPU的一条指令,如果再解释其底层实现就需要拆开CPU来看看了:-)
cli在汇编里指关闭eflags中断标志位,这样所有传向CPU的中断,CPU就在也接受不到信号了。这只是针对X86
对其他平台,还有不同的指令。
还是建议使用local_irq_disable();宏

wu gang

unread,
Oct 22, 2008, 7:04:45 AM10/22/08
to 李则良, hc huang, 西邮Linux兴趣小组
2008/10/21 李则良 <lizelia...@gmail.com>
2008/10/21 hc huang <china...@gmail.com>:
> 刚才我没有说清楚,你看看这条语句中的cli最终实现是什么?
>  #define cli() __asm__ ("cli"::)
> 这里并没有调用任何函数,只是使用了一条汇编指令cli,而你刚才所解释的是2.26内核版本上的解释,我想问
> 的是cli汇编指令是怎样实现的。麻烦你再帮解答一下!
cli是CPU的一条指令,如果再解释其底层实现就需要拆开CPU来看看了:-)
cli在汇编里指关闭eflags中断标志位,这样所有传向CPU的中断,CPU就在也接受不到信号了。这只是针对X86
对其他平台,还有不同的指令。
还是建议使用local_irq_disable();宏
>
> 2008/10/21 李则良 <lizelia...@gmail.com>
>>
>> 2008/10/21 hc huang <china...@gmail.com>:
>> > 请问:linux内核在进行关中断时使用了指令cli()进行关中断,但是这条指令的底层实现是怎样的呢?
>> 你是指什么?在不同平台上吗?这和平台相关,在x86上就是借助cli指令来实现的
>>  219static inline void __deprecated cli(void)
>>  220{
>>  221        local_irq_disable();
>>  222}
>>
>> >
>> > >> >
>> >
>
>
 
  而实现local_irq_disable()很简单,只是维护变量计数的作用。
  当为'0'或'1'时,分别表示开中断和关闭中断。






--
学习是平淡的,又是充满激情的。just do it
my blog:http://blog.chinaunix.net/u1/55599/

Chen Fengyang

unread,
Oct 22, 2008, 8:06:37 AM10/22/08
to 李则良, hc huang, 西邮Linux兴趣小组
On Tue, Oct 21, 2008 at 10:32:02PM +0800, 李则良 wrote:

>2008/10/21 hc huang <china...@gmail.com>:
>> 刚才我没有说清楚,你看看这条语句中的cli最终实现是什么?
>> #define cli() __asm__ ("cli"::)
>> 这里并没有调用任何函数,只是使用了一条汇编指令cli,而你刚才所解释的是2.26内核版本上的解释,我想问
>> 的是cli汇编指令是怎样实现的。麻烦你再帮解答一下!
>cli是CPU的一条指令,如果再解释其底层实现就需要拆开CPU来看看了:-)
>cli在汇编里指关闭eflags中断标志位,这样所有传向CPU的中断,CPU就在也接受不到信号了。这只是针对X86
>对其他平台,还有不同的指令。

是所有的中断信号吗?好像还有一种叫做Non-Maskable Interrupt 的东西?前面WangCong已经特意将参考手册的页码都标出来了,里面的描述应该是最权威的了,还是应该好好看看的嘛。

Reply all
Reply to author
Forward
0 new messages