LSM初始化

在linux系统启动中:
start_kernel -> security_init,在此函数中:
1、struct hlist_head {
struct hlist_node *first;
};
将lsm的钩子函数集合security_hook_heads放到hlist_head 结构的 list链表中,有的钩子函数是特定框架才有的;

2、三种安全检查的初始化:
-> capability_add_hooks
1) 实现capability安全模块中的hook函数(函数定义)。
2) 用已实现的hook函数,初始化capability_hooks(结构体定义)。
struct security_hook_list capability_hooks[] __lsm_ro_after_init = {
LSM_HOOK_INIT(capable, cap_capable),
……
};
定义#define LSM_HOOK_INIT(HEAD, HOOK) \
{ .head = &security_hook_heads.HEAD, .hook = { .HEAD = HOOK } }
展开后:
.head = &security_hook_heads.capable, .hook = { .capable = cap_capable }
相当于在capability_hooks数组中,对其中一个security_hook_list类型对象做了初始化。
3) 将capability_hooks的所有成员变量list添加到成员变量head之前,组成一个链表(如果后续有其他安全模块,对capable函数增加其他的hook函数实现,新的hook实现又会被放到当前hook函数之前,类似于一个栈结构)。

-> yama_add_hooks
-> loadpin_add_hooks

3、do_security_initcalls
调用security_initcall_start 和security_initcall_end 之间的各个安全策略的初始化函数,如selinux、apparmor、smack 和 tomoyo。

security_initcall(selinux_init)
security_initcall(apparmor_init)
security_initcall(smack_init)
security_initcall(tomoyo_init)

485 #define SECURITY_INIT \
486 .security_initcall.init : AT(ADDR(.security_initcall.init) - LOAD_OFFSET) { \
487 security_initcall_start = .; \
488 KEEP(*(.security_initcall.init)) \
489 
security_initcall_end = .; \
490 }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个LSM6DS3初始化程序的示例(使用I2C通信): ```c #include <Wire.h> #define LSM6DS3_ADDRESS 0x6B // I2C地址 void setup() { Wire.begin(); // 初始化I2C总线 Serial.begin(9600); // 初始化串口 delay(100); // 等待传感器上电完成 initLSM6DS3(); // 初始化LSM6DS3 } void loop() { // 读取加速度和角速度数据并打印到串口 int16_t ax, ay, az, gx, gy, gz; readLSM6DS3(ax, ay, az, gx, gy, gz); Serial.print("Ax: "); Serial.print(ax); Serial.print(" Ay: "); Serial.print(ay); Serial.print(" Az: "); Serial.print(az); Serial.print(" Gx: "); Serial.print(gx); Serial.print(" Gy: "); Serial.print(gy); Serial.print(" Gz: "); Serial.println(gz); delay(100); } void initLSM6DS3() { // 打开加速度计和陀螺仪 writeRegister(LSM6DS3_ADDRESS, 0x10, 0b01000100); // CTRL1_XL writeRegister(LSM6DS3_ADDRESS, 0x11, 0b01000000); // CTRL2_G // 配置数据输出速率和滤波器 writeRegister(LSM6DS3_ADDRESS, 0x12, 0b01000000); // CTRL3_C // 启用中断并配置中断输出类型 writeRegister(LSM6DS3_ADDRESS, 0x0D, 0b00100000); // INT1_CTRL } void readLSM6DS3(int16_t& ax, int16_t& ay, int16_t& az, int16_t& gx, int16_t& gy, int16_t& gz) { // 读取加速度和角速度数据 Wire.beginTransmission(LSM6DS3_ADDRESS); Wire.write(0x22); // 加速度计数据寄存器地址 Wire.endTransmission(false); Wire.requestFrom(LSM6DS3_ADDRESS, 12, true); ax = Wire.read() | (Wire.read() << 8); ay = Wire.read() | (Wire.read() << 8); az = Wire.read() | (Wire.read() << 8); gx = Wire.read() | (Wire.read() << 8); gy = Wire.read() | (Wire.read() << 8); gz = Wire.read() | (Wire.read() << 8); } void writeRegister(uint8_t address, uint8_t reg, uint8_t value) { Wire.beginTransmission(address); Wire.write(reg); Wire.write(value); Wire.endTransmission(); } ``` 其中,`initLSM6DS3()`函数用于初始化LSM6DS3芯片,`readLSM6DS3()`函数用于读取加速度和角速度数据,`writeRegister()`函数用于向芯片写寄存器。在`setup()`函数中,初始化I2C总线并调用`initLSM6DS3()`函数。在`loop()`函数中,循环读取加速度和角速度数据并打印到串口。需要注意的是,LSM6DS3的输出数据格式和分辨率等参数需要根据实际需求进行配置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值