llinux对内存空间的描述&&malloc的工作原理

本文详细介绍了通过实验观察进程内存布局的方法,包括代码区、全局栈等,并深入探讨了malloc的工作原理及其注意事项。此外,还对比了new/new[]与malloc的区别。

一、



二、实验

1、编写代码



解释:

getpid():获取当前进程的PID


2、打开一个新的TERMINAL。依次键入以下命令


cd /proc/${PID}

cat maps


ps aue 

ldd 可执行文件名



这时你会看到以下界面:


解释:

8048 —— 8049 :代码区

8049后面的 : 全局栈


三、malloc的工作原理

malloc使用一个数据结构(链表)维护分配空间。

这个链表的构成是:分配的空间/上一个空间数据/下一个空间数据/空间的大小

对malloc的分配的空间不要月结访问。因为容易破坏后台的维护结构



四、new和new[]、malloc的区别






五、定位分配





<think>我们正在讨论的是在Linux下使用SimpleBLE库配对BLE设备的方法。根据之前的讨论,SimpleBLE是一个专注于低功耗蓝牙(BLE)的库,因此它支持BLE设备的配对操作。在BLE中,配对通常涉及安全连接和密钥交换过程。 参考引用: - 引用[1]提到了蓝牙的简单配对(Simple Pairing)方式,这是BT2.1及之后版本新增的配对方式,比传统的PIN码配对更简单、更安全。在BLE中,配对过程通常使用类似的安全机制(如LE Secure Connections)[^1]。 - 引用[2]提到BlueZ是Linux平台上的蓝牙协议栈,而SimpleBLE库可能是基于BlueZ的封装[^2]。 - 引用[3][4]涉及Linux设备驱动模型,虽然与配对过程不直接相关,但说明了设备与驱动的匹配机制,这有助于理解底层原理[^3][^4]。 在Linux下使用SimpleBLE库配对BLE设备的步骤: 1. **安装SimpleBLE库**:首先需要确保在Linux系统上安装了SimpleBLE库。可以通过源码编译安装,具体步骤可参考官方文档。 2. **扫描BLE设备**:使用SimpleBLE的扫描功能发现周围的BLE设备。 3. **连接设备**:选择目标设备并建立连接。 4. **配对请求**:在连接后,可以发起配对请求。配对过程通常由库自动处理,但可能需要用户交互(如确认配对码)。 5. **处理配对回调**:SimpleBLE库通常会提供回调函数来处理配对过程中发生的事件,例如需要用户确认配对码、配对成功或失败等。 下面是一个使用SimpleBLE库进行配对的示例代码框架(基于C++): ```cpp #include <simpleble/SimpleBLE.h> int main() { // 获取蓝牙适配器 auto adapters = SimpleBLE::Adapter::get_adapters(); if (adapters.empty()) { std::cerr << "No adapter found" << std::endl; return 1; } // 使用第一个适配器 auto adapter = adapters[0]; adapter.set_callback_on_scan_found([](SimpleBLE::Peripheral peripheral) { std::cout << "Found device: " << peripheral.identifier() << " [" << peripheral.address() << "]" << std::endl; }); // 开始扫描 adapter.scan_start(); // 等待一段时间,让扫描到设备 std::this_thread::sleep_for(std::chrono::seconds(5)); adapter.scan_stop(); // 获取扫描到的设备列表 auto peripherals = adapter.scan_get_results(); if (peripherals.empty()) { std::cerr << "No devices found" << std::endl; return 1; } // 选择第一个设备 auto peripheral = peripherals[0]; std::cout << "Connecting to: " << peripheral.identifier() << " [" << peripheral.address() << "]" << std::endl; // 设置配对回调(如果需要) // 注意:SimpleBLE库可能通过异常或回调来报告配对状态,具体取决于库的实现 // 以下代码为假设的配对回调设置方式,实际请参考SimpleBLE文档 // 连接设备 try { peripheral.connect(); // 发起配对(在连接后,配对可能自动进行,或者需要显式调用) // 在BLE中,配对通常在连接后由安全要求触发,例如当尝试读取受保护的特性时。 // 如果设备需要配对,连接后可能会触发配对过程。 // 例如,我们可以尝试读取一个需要认证的特性来触发配对 // 但首先需要确保已发现服务和特性 peripheral.discover_services(); // 假设我们有一个需要配对才能读取的特性 // 这里只是示例,实际使用需要根据设备的具体服务UUID和特性UUID来操作 // 如果读取受保护特性,而设备未配对,则会触发配对过程 // 等待配对完成(这里可能需要用户交互,比如确认配对码) // 在实际应用中,应该通过回调或事件来处理配对过程 // 保持连接一段时间,或者进行其他操作 std::this_thread::sleep_for(std::chrono::seconds(10)); peripheral.disconnect(); } catch (const std::exception& e) { std::cerr << "Error: " << e.what() << std::endl; } return 0; } ``` **注意**: - 实际配对过程可能因设备而异。有些设备在连接后会自动启动配对,而有些则需要尝试访问受保护的资源(如需要认证的GATT特性)时才会触发配对。 - SimpleBLE库的具体API可能会有所变化,请参考其官方文档。 - 在配对过程中,如果设备需要用户确认(如显示配对码),则可能需要通过回调函数来处理。SimpleBLE库可能提供了设置配对回调的接口,例如`peripheral.set_callback_on_pairing_request()`(具体函数名需查阅文档)。 如果SimpleBLE库没有提供直接的配对控制API,那么配对过程将由底层协议栈(如BlueZ)自动处理。在这种情况下,用户可能需要通过系统级的代理(如bluetoothctl)来确认配对码。 **安全配对流程**: 在BLE中,配对过程通常使用LE Secure Connections,它使用椭圆曲线Diffie-Hellman(ECDH)进行密钥交换。配对过程中会生成一个6位数字的配对码(称为Passkey),用户需要在两个设备上确认这个数字相同(或输入)[^1]。 因此,在开发应用程序时,需要处理配对码的显示和用户确认。这可以通过SimpleBLE库的回调机制实现。例如: ```cpp // 假设的回调函数设置 peripheral.set_callback_on_passkey_request([](std::string passkey) { // 显示passkey给用户,并等待用户确认 std::cout << "Passkey: " << passkey << std::endl; // 然后需要调用确认方法 peripheral.passkey_confirm(); // 或者输入passkey确认 }); ``` 但是,请注意,SimpleBLE库的API可能不同,上述代码仅为示例。请务必查阅SimpleBLE的文档或示例代码。 如果遇到问题,可以考虑以下替代方案: 1. 使用BlueZ的DBus API直接控制配对过程。 2. 使用命令行工具`bluetoothctl`进行配对(通过系统调用)。 但使用SimpleBLE库的目标是简化开发,因此建议优先查阅其文档。 最后,确保Linux系统具有蓝牙适配器,并且已安装BlueZ(通常版本需要5.50以上以支持BLE)。 参考文献: [^1]: 蓝牙简单配对(Simple Pairing)的描述,说明配对过程需要用户确认6位随机数。 [^2]: BlueZ作为Linux蓝牙协议栈的基础。 [^3][^4]: 设备驱动匹配机制,虽然不直接相关,但有助于理解底层。 相关问题: 1. 如何在SimpleBLE中处理配对码的显示和用户确认? 2. 如果SimpleBLE库没有提供配对回调,如何通过DBus或bluetoothctl实现配对? 3. BLE配对失败的可能原因有哪些? 4. 如何配置Linux系统以支持BLE安全配对?</think>### Linux下使用SimpleBLE库配对BLE设备的方法 根据引用[1][2][5]提供的蓝牙协议栈背景和Linux开发环境,以下是使用SimpleBLE库进行BLE设备配对的完整流程: --- #### 核心步骤 1. **环境准备** ```bash # 安装依赖库 sudo apt install libbluetooth-dev libboost-dev # 编译安装SimpleBLE git clone https://github.com/OpenBluetoothToolbox/SimpleBLE cd SimpleBLE mkdir build && cd build cmake .. -DSIMPLEBLE_EXAMPLES=ON make sudo make install ``` 2. **配对代码实现** ```cpp #include <simpleble/SimpleBLE.h> #include <iostream> int main() { // 获取蓝牙适配器 auto adapters = SimpleBLE::Adapter::get_adapters(); if (adapters.empty()) { std::cerr << "No Bluetooth adapter found!" << std::endl; return 1; } // 使用第一个适配器 auto adapter = adapters[0]; adapter.scan_start(); // 开始扫描 // 扫描5秒发现设备 std::this_thread::sleep_for(std::chrono::seconds(5)); auto peripherals = adapter.scan_get_results(); // 查找目标设备(示例:MyBLEDevice) SimpleBLE::Peripheral target; for (auto& p : peripherals) { if (p.identifier() == "MyBLEDevice") { target = p; break; } } if (!target.is_connectable()) { std::cerr << "Target device not found" << std::endl; return 1; } // 连接与配对 target.connect(); if (target.is_connected()) { // 触发配对(根据BLE规范,访问安全服务自动触发配对) target.read(service_uuid, characteristic_uuid); // 处理配对回调(参考SimpleBLE安全回调机制) target.set_callback_on_authentication_request([](){ std::cout << "Confirm pairing on device screen" << std::endl; }); } return 0; } ``` 3. **关键配置说明** - **配对触发机制**:BLE设备通常在访问安全服务时自动触发配对流程[^1] - **安全回调**:`set_callback_on_authentication_request`处理用户交互确认 - **配对模式**:SimpleBLE默认使用LE Secure Connections (LESC) 安全配对[^1] - **参数说明**: ```cpp // 典型安全服务UUID (根据设备规格调整) const std::string service_uuid = "0000180A-0000-1000-8000-00805F9B34FB"; const std::string characteristic_uuid = "00002A56-0000-1000-8000-00805F9B34FB"; ``` --- #### 配对流程原理 1. **BLE安全协议栈** $$ \text{连接建立} \rightarrow \text{安全请求} \rightarrow \text{密钥交换} \rightarrow \text{认证确认} $$ 采用椭圆曲线Diffie-Hellman (ECDH) 密钥交换协议[^1] 2. **用户交互场景** - 设备有显示屏:用户确认6位随机数[^1] - 设备无显示屏:使用Just Works模式(自动确认) - 输入设备:需要输入Passkey 3. **协议栈交互** ```mermaid sequenceDiagram App->>SimpleBLE: connect() SimpleBLE->>BlueZ: DBus连接请求 BlueZ->>Device: 建立L2CAP通道 Device->>BlueZ: 发送安全请求 BlueZ->>SimpleBLE: 触发认证回调 SimpleBLE->>App: 显示配对码 App->>SimpleBLE: 确认配对 SimpleBLE->>BlueZ: 发送密钥确认 BlueZ->>Device: 完成密钥分发 ``` --- #### 常见问题解决 1. **配对失败** - 检查设备可见性:`bluetoothctl scan on` - 验证服务UUID:使用`bluetoothctl info <MAC>` - 查看系统日志:`journalctl -u bluetooth` 2. **权限问题** ```bash # 添加用户到蓝牙组 sudo usermod -aG bluetooth $USER # 重启蓝牙服务 sudo systemctl restart bluetooth ``` 3. **调试模式** 编译时启用调试信息: ```bash cmake .. -DSIMPLEBLE_LOGGING=ON ``` > **注意**:SimpleBLE依赖于BlueZ协议栈(Linux 5.50+),低版本系统需先升级BlueZ[^2][^5] --- #### 相关问题 1. 如何通过SimpleBLE实现BLE文件传输? 2. 如何处理BLE配对过程中的安全密钥交换? 3. SimpleBLE与BlueZ DBus API有何性能差异? 4. 如何为无显示屏的BLE设备实现自动配对?
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅气的东哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值