linux 内核 set_bit和clear_bit的用法

set_bit (int nr, volatile unsigned long *addr) : 设置addr内存地址所指向的值的第bit为1.

int  flag=0x01;
unsigned long  key=0x1110;
pr_info("key = 0x%x\n", (int)key);
set_bit(flag,&key);

如上,设置set_bit开始的内存地址的第1位(flag的值)为 1 ,注意是从0 开始计数的 。

也就是设置 0x1110的bit位的第二位为1 。,所以结果就是 0x1112.

clear_bit (int nr, volatile unsigned long *addr) : 设置addr内存地址所指向的值的第bit为0.

int flag=0x01;
unsigned long key=0x1112
clear_bit(flag,&key);

0x1112 的二进制的最后两位是 10 ,clear第二位之后 就是 00 ,也就是 key 的值变为了 0x1110.

test_bit (int nr, volatile unsigned long *addr) 测试某一位是否为1 。

以下是测试代码:

#include <linux/bug.h>			/* For BUG_ON.  */
#include <linux/init.h> /* Needed for the macros */
#include <linux/kernel.h> /* Needed for pr_info() */
#include <linux/module.h>


#define  TRUE(condition)  BUG_ON(!(condition))


static int __init foo_init(void)
{

int  flag=0x01;
unsigned long  key=0x1110;
pr_info("key = 0x%x\n", (int)key);
set_bit(flag,&key);
pr_info("key = 0x%x\n", (int)key);
TRUE(key==0x1112);
TRUE(test_bit(flag,&key));

clear_bit(flag,&key);
pr_info("key = 0x%x\n", (int)key);
TRUE(key==0x1110);

  flag=0x04;
  set_bit(flag,&key);
  pr_info("key = 0x%x\n", (int)key);
  TRUE(key==(0x1110));
  TRUE(test_bit(flag,&key));

  flag=0x03;
  set_bit(flag,&key);
  pr_info("key = 0x%x\n", (int)key);
  TRUE(key==(0x1118));
  clear_bit(flag,&key);
  TRUE(!test_bit(flag,&key));
  TRUE(key==(0x1110));

  flag=0x04;
  clear_bit(flag,&key);
  TRUE(key==(0x1100));
  TRUE(!test_bit(flag,&key));

  TRUE(key==(0x1100));
  flag = 0x08;
  change_bit(flag,&key);
  TRUE(key==(0x1000));


pr_info("key = 0x%x\n", (int)key);

return  0;
}

static void __exit foo_cleanup(void)
{



}

module_init(foo_init);
module_exit(foo_cleanup);

MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("Andy");
MODULE_DESCRIPTION("andy one-key driver");
MODULE_ALIAS("one-key");

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
set_trap_gate是Linux内核中的一个函数,用于设置中断门(trap gate),即用于处理异常和中断的特殊代码段。在操作系统运行时,如果出现异常或中断,处理器会自动跳转到对应的中断门,执行其中的代码来处理异常或中断。set_trap_gate函数可以将一个中断门与一个特定的中断或异常向量关联起来,并设置中断门的特权级、段选择子和偏移量等信息,以便让处理器正确地跳转到中断门并执行其中的代码。 set_trap_gate函数的原型定义如下: ```c void set_trap_gate(unsigned int n, unsigned long addr, unsigned int ist, unsigned int flags); ``` 其中,n参数指定要设置的中断或异常向量号,addr参数指定中断门的偏移地址,ist参数指定中断堆栈表索引(IST),flags参数指定中断门的特权级、类型和标志位等信息。具体参数的含义如下: - n:中断或异常向量号,取值范围为0~255。 - addr:中断门的偏移地址,即中断处理程序的入口地址。需要注意的是,中断处理程序必须是内核空间中的代码,且不能被交换出去。 - ist:中断堆栈表索引(IST),用于指定中断处理程序的堆栈。IST是一种特殊的堆栈,用于存储中断处理程序的状态和临时数据,以避免在处理中断时出现堆栈溢出的情况。IST的索引值可以是0~7,表示8个不同的中断堆栈表。 - flags:中断门的标志位,由下列标志组成: - P:存在标志(Present),指定中断门是否存在。如果该标志为0,表示中断门不存在,处理器会触发“通用保护性异常”(#GP)。 - DPL:特权级(Descriptor Privilege Level),指定中断门的特权级别,取值为0~3,表示最高特权级(内核级)到最低特权级(用户级)。 - IST:中断堆栈表索引(Interrupt Stack Table),用于指定中断处理程序的堆栈。IST的索引值可以是0~7,表示8个不同的中断堆栈表。 - Type:类型标志,指定中断门的类型。常用的类型有中断门(trap gate)、陷阱门(interrupt gate)和任务门(task gate)等。 set_trap_gate函数的实现比较复杂,需要对GDT(全局描述符表)和IDT(中断描述符表)进行修改。由于涉及到内核权限和硬件底层细节,一般不建议用户直接调用该函数进行编程,而是使用更高层次的API或库函数来处理中断和异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值