1.Linux方面的内核内核书籍哪一本好?
2.王洪辉嵌入式专家王洪辉
3.实战教学:用Semantic Kernel框架集成腾讯混元大模型应用
4.掌握QEMU虚拟化技术:搭建ARM64+Linux调试环境实战指南
5.Linux驱动开发笔记(一):helloworld驱动源码编写、makefile编写以及驱动编译基本流程
6.浅析linux 内核 高精度定时器(hrtimer)实现机制(二)
Linux方面的书籍哪一本好?
Abraham Silberschatz的两本书:
1. 实用操作系统概念(影印版)
2. 操作系统概念(第六版 影印版)
这个作者绝对是顶尖级的,来自贝尔实验室,实战是代码目前世界上操作系统方面的****。这两本书第二本和第一本很多地方相似,开源区别在于第二本理论偏重一些,内核内核wait源码分析第一本实例讨论的源码更多一些。这两本书别看很厚,实战但是代码写的非常流畅,属于比较易读的开源一类。
3. 现代操作系统(英文版?内核内核第2版)
Andrew S. Tanenbuam(坦尼伯姆, AST)是第4本书的升级版,里面添加了一些新的源码操作系统方面的讨论,原理部分比第四本稍有增强。实战个人认为,代码是开源除了前面两本之外的最好的书。
4. 操作系统: 设计及实现(第二版)(英文影印版)
这个比较有名了,主要是分析minix源代码的书,顺带着讲了下原理,应该说是偏于实践的,可能当年的linus的教材就是这本,影响较大,可以帮助你了解一个文件系统或系统调用之类是如何实现的。当然,和目前的操作系统来讲,稍简单了一些。想做linux kernel hacker的同学此书可以一读。
5. 操作系统:现代观点(第二版 实验更新版)(英文版)
Operating Systems: A design-Oriented Approach 这两本一般,但是还是比国内抄袭的教材强很多,可以作为补充阅读的书籍。
6. LINUX内核源代码情景分析(上册) LINUX内核源代码情景分析(下册)
Understanding Linux Kernel
Linux internal
这三本是最nb的linux内核分析书籍,后两本讲2.2内核,第一本讲2.4。
7. 4.4BSD操作系统设计与实现(英文影印版)
不说少了,原来berkeley那帮写bsd的其中几个人写的,经典就是它了。
8. UNIX操作系统设计(英文版)
:古老的家园7仓库源码unix设计方面的书籍,应该说这本书在unix世界里面的影
响是十分巨大的,很多后来的unix分枝,思想都是缘于此书。里面主要讲解unix各个部分
实现时所用的算法,其中一些目前还在使用中。想了解一下unix实现但又没什么时间扣
minix或linux内核的朋友可以看看,在这本书上花费几十个小时,绝对超值:)
9.Linux内核完全注释
这一本书我觉得也很棒。它以Linux 0.内核源码为基础进行详细的分析,解释细致到位。虽然不是“经典”,但仍推荐!凭借简洁明了的源码分析,你可以管窥Linux操作系统的奥秘。
王洪辉嵌入式专家王洪辉
王洪辉,江西丰城人,是一位在嵌入式系统和嵌入式操作系统核心开发领域拥有丰富经验的专业人士。自年毕业于北京青云航空仪表公司军品部以来,他的职业生涯涵盖了多个公司,积累了深厚的行业经验。在红向标期间,他专注于研发工作,设计开发了多种电子产品,如嵌入式服务器、数字硬盘录像机等,同时还独立设计并制作了多款开发板,包括使用国产龙芯-2F和TI公司DSP芯片的项目,如“HXB-”和“HXB-”开发板,以及“东风1.0”Bootloader程序。
为了深入理解操作系统,王洪辉甚至辞去了工作,专门研究Linux2.6.内核的ARM平台源代码,结合ARM处理器架构、Linux内核和设备驱动程序的动态爱心的源码学习,他将自己的工作和学习心得整理成了一部详尽的著作——《嵌入式系统Linux内核开发实战指南(ARM平台)》,该书于年出版,深受读者欢迎。他的著作不仅在国内发行,还在台湾出版繁体版,受到广泛关注。
在青云航空仪表公司期间,他独立完成了单片机模块冷水机组集中控制系统的设计和开发,包括功能如温度、压力采集,AD/DA转换,智能控制等,展现了出色的动手能力和技术实力。此外,王洪辉还为社会培养了大量嵌入式技术人才,这些学员在就业后能迅速适应工作并取得显著成果,为他们的单位带来了显著的效益,得到了雇主的高度认可。
实战教学:用Semantic Kernel框架集成腾讯混元大模型应用
实战教学:利用Semantic Kernel框架集成腾讯混元大模型
当开发者希望将Semantic Kernel与国内的大模型如腾讯混元对接时,如何操作?本文将带你通过oneAPI实现这一目标。智用人工智能应用研究院的CTO张善友将亲授实战教程。
张善友,以云原生开发为专长,他借助Semantic Kernel的SDK,能够将大型语言模型与传统编程语言无缝融合。SK支持C#、Python和Java,其中C#版本已发布1.0,提供模板和链接、深度集成等特性,让应用程序更加智能。
在集成过程中,首先了解腾讯混元大模型的强大功能,如强大的振荡指标的源码中文处理和逻辑推理。接下来,通过one-API的开源项目,将SK与OpenAI connector结合,以支持腾讯混元。只需简单部署docker镜像,配置OpenAI连接器,即可实现模型访问。
在配置One-API系统时,需要添加渠道,选择腾讯混元模型,提供API密钥,并创建令牌。终端使用时,只需将OpenAI的API Key替换为自定义的令牌。注意,不同用户组支持多个模型,可指定特定渠道处理请求。
通过自定义HttpClient,将OpenAI Endpoint指向oneAPI,整合到C#项目中,创建内核并配置日志和模型支持。最终,通过SK的流式传输,实现实时聊天应用与大模型的交互。
综上所述,Semantic Kernel为国内大模型的集成提供了有力工具,无论是在桌面还是服务器开发中,都为人工智能的集成开辟了新路径。同时,确保数据隐私合规是至关重要的。在「腾讯云TVP」公众号回复「大模型」,获取完整源代码实例。
掌握QEMU虚拟化技术:搭建ARM+Linux调试环境实战指南
本文详细介绍了如何在Ubuntu .系统上搭建ARM架构的Linux调试环境,利用QEMU虚拟化技术。机智软件指标源码首先,确保主机系统安装了最新的Ubuntu .版本,QEMU模拟ARM处理器,并选择最新Linux内核。 安装步骤如下:安装编译工具链:检查并安装必要的版本,通过官方仓库或源码编译。
QEMU安装:通过仓库安装QEMU 2.1ubuntu,检查安装版本,源码安装时需要注意可能遇到的编译错误。
根文件系统构建:从Busybox官网下载源码,配置为编译特定工具并开启静态库选项,处理可能的ncurses库依赖问题。
根文件系统结构补充:在根目录添加必要的目录如etc、dev和lib,配置文件以指定挂载文件系统。
编译内核:从官方下载源码,指定编译工具,配置内核选项,如添加hotplug和initramfs支持,确保内核页配置正确。
模拟磁盘与文件共享:使用模拟磁盘挂载根文件系统,以保持数据持久性。通过qemu与主机文件共享,测试动态链接应用程序。
内核模块测试与调试:创建Makefile和驱动测试文件,进行交叉编译和在qemu上加载驱动,使用GDB进行内核模块调试。
Eclipse可视化调试:安装arm-none-eabi-gdb和Java环境,配置Eclipse-CDT以支持ARM架构,利用Eclipse进行内核单步调试。
通过以上步骤,你将成功搭建一个适合ARM+Linux调试的环境,进行内核开发和调试工作。
Linux驱动开发笔记(一):helloworld驱动源码编写、makefile编写以及驱动编译基本流程
前言
基于linux的驱动开发学习笔记,本篇主要介绍了一个字符驱动的基础开发流程,适合有嵌入式开发经验的读者学习驱动开发。
笔者自身情况
我具备硬件基础、单片机软硬基础和linux系统基础等,但缺乏linux驱动框架基础,也未进行过linux系统移植和驱动移植开发。因此,学习linux系统移植和驱动开发将有助于打通嵌入式整套流程。虽然作为技术leader不一定要亲自动手,但对产品构架中的每一块业务和技术要有基本了解。
推荐
建议参考xun为的视频教程,教程过程清晰,适合拥有丰富知识基础的资深研发人员学习。该教程不陷入固有思维误区,也不需要理解imx6的庞杂汇报,直接以实现目标为目的,无需从裸机开始开发学习,所有步骤都解释得清清楚楚。结合多年相关从业经验,确实能够融会贯通。从业多年,首次推荐,因为确实非常好。
驱动
驱动分为四个部分
第一个驱动源码:Hello world!
步骤一:包含头文件
包含宏定义的头文件init.h,包括初始化和宏头文件,如module_init、module_exit等。
#include
包含初始化加载模块的头文件
步骤二:写驱动文件的入口和出口
使用module_init()和module_exit()宏定义入口和出口。
module_init(); module_exit();
步骤三:声明开源信息
告诉内核,本模块驱动有开源许可证。
MODULE_LICENSE("GPL");
步骤四:实现基础功能
入口函数
static int hello_init(void) { printk("Hello, I’m hongPangZi\n"); return 0; }
出口函数
static void hello_exit(void) { printk("bye-bye!!!\n"); }
此时可以修改步骤二的入口出口宏
module_init(hello_init); module_exit(hello_exit);
总结,按照四步法,搭建了基础的驱动代码框架。
Linux驱动编译成模块
将驱动编译成模块,然后加载到内核中。将驱动直接编译到内核中,运行内核则会直接加载驱动。
步骤一:编写makefile
1 生成中间文件的名称
obj-m += helloworld.o
2 内核的路径
内核在哪,实际路径在哪
KDIR:=
3 当前路径
PWD?=$(shell pwd)
4 总的编译命令
all: make -C $(KDIR) M=$(PWD) modules
make进入KDIR路径,当前路径编译成模块。
obj-m = helloworld.o KDIR:= PWD?=$(shell pwd) all: make -C $(KDIR) M=$(PWD) modules
步骤二:编译驱动
编译驱动之前需要注意以下几点:
1 内核源码要编译通过
驱动编译成的目标系统需要与内核源码对应,且内核源码需要编译通过。
2 内核源码版本
开发板或系统运行的内核版本需要与编译内核驱动的内核源码版本一致。
3 编译目标环境
在内核目录下,确认是否为需要的构架:
make menu configure export ARCH=arm
修改构架后,使用menu configure查看标题栏的内核构架。
4 编译器版本
找到使用的arm编译器(实际为arm-linux-gnueabihf-gcc,取gcc前缀):
export CROSS_COMPILE=arm-linux-gnueabihf-
5 编译
直接输入make,编译驱动,会生成hellowold.ko文件,ko文件就是编译好的驱动模块。
步骤三:加载卸载驱动
1 加载驱动
将驱动拷贝到开发板或目标系统,然后使用加载指令:
insmod helloworld.ko
会打印入口加载的printk输出。
2 查看当前加载的驱动
lsmod
可以查看到加载的驱动模块。
3 卸载驱动
rmmod helloworld
可以移除指定驱动模块(PS:卸载驱动不需要.ko后缀),卸载成功会打印之前的printk输出。
总结
学习了驱动的基础框架,为了方便测试,下一篇将使用ubuntu.编译驱动,并做好本篇文章的相关实战测试。
浅析linux 内核 高精度定时器(hrtimer)实现机制(二)
分析linux内核高精度定时器(hrtimer)的实现机制时,首先介绍的是定时器的迁移过程switch_hrtimer_base。该函数会尝试选择一个新的hrtimer_cpu_base结构体,用于定时器的激活。get_target_base函数被用于挑选新的迁移位置,这个函数的代码与分析低分辨率定时器层时的定时器迁移概念相似。timers_migration_enabled变量在切换到NO_HZ模式时变为True,退出NO_HZ模式时变为False,用于判断是否可以进行迁移。只有在切换到NO_HZ模式且定时器未绑定到特定CPU的情况下,才会进行迁移选择。get_nohz_timer_target函数会判断当前CPU是否处于空闲状态,如果不是,则返回当前CPU编号,如果是空闲,则会找到最近一个忙碌的处理器并返回其编号。所有条件不满足时,会直接返回传入的hrtimer_cpu_base结构体指针。
接下来分析hrtimer_callback_running函数,用于检查要迁移的定时器是否正是当前正在处理的定时器。hrtimer_check_target函数则用于检查定时器的到期时间是否早于要迁移到的CPU上即将到期的时间。如果高分辨率定时器的到期时间比目标CPU上的所有定时器到期时间还要早,并且目标CPU不是当前CPU,那么激活目标CPU会涉及到通知该CPU重新编程定时器,这通常不如直接在当前CPU上激活定时器来得简单。因此,如果迁移操作与实际激活操作没有关系,即使从get_target_base函数获得的base与定时器中指定的base相同,迁移操作也会进行。
在迁移过程中,内核会临时将定时器的hrtimer_clock_base结构体变量设置为全局变量migration_base的指针。这个全局变量仅用于在获得定时器所属CPU的hrtimer_cpu_base结构体变量时,通过判断base变量是否等于migration_base的指针来判断定时器是否正在迁移。这样的设计可以在未正式加锁之前过滤掉很多情况,从而提高速度。
文章福利提供Linux内核技术交流群,包含学习书籍、视频资料,前名可额外获得价值的内核资料包(含视频教程、电子书、实战项目及代码)。
内核资料直通车:Linux内核源码技术学习路线+视频教程代码资料
学习直通车:Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈-学习视频教程-腾讯课堂
在低精度模式下,高分辨率定时器层通过普通(低分辨率)定时器层驱动。当Tick到来时,其处理函数会调用hrtimer_run_queues函数通知高分辨率定时器层。每次调用该函数时,都会判断是否可以切换到高精度模式。如果可以切换,会调用hrtimer_switch_to_hres完成切换并退出。如果不需要切换,则从时间维护层获得当前时间和各种偏移值,并设置到所有的hrtimer_clock_base结构体中。如果当前时间不早于softirq_expires_next变量的值,表示“软”定时器已到期,需要激活软中断处理程序。在软中断处理程序中,首先调用hrtimer_update_base函数更新当前时间,并在适当时候执行,处理到期的“软”定时器。该处理程序会遍历所有指定类型(“软”或“硬”)的到期定时器,判断定时器的“软”到期时间是否已到,处理到期定时器,并循环取下一个要到期的定时器。最后,会调用hrtimer_reprogram函数对底层定时事件设备进行重编程。
在高精度模式下,周期处理函数hrtimer_interrupt在定时事件设备到期后调用。处理过程包括激活HRTIMER_SOFTIRQ软中断处理程序,处理所有“软”定时器,并对底层定时事件设备进行重编程。重编程确保设备在到期后能正确触发中断,同时避免在一次中断中处理过多定时器,以防止超时。通过查找和设置到期时间时使用“硬”到期时间,而在处理定时器时使用“软”到期时间,内核能尽量减少中断调用,提高性能。
低精度模式切换到高精度模式的hrtimer_switch_to_hres函数通过调用tick_init_highres函数实现切换,将定时事件设备切换到单次触发模式,并设置中断处理函数为hrtimer_interrupt。一旦完成切换,底层定时事件设备将始终工作在单次触发模式。切换成功后,必须找到最近到期的定时器,并用其到期事件对定时事件设备进行重编程,确保设备能正确响应到期。
在高精度模式下,中断处理程序通过直接调用__hrtimer_run_queues函数处理所有“硬”定时器,并激活HRTIMER_SOFTIRQ软中断处理程序来处理所有“软”定时器。在高精度模式下,底层定时事件设备始终处于单次触发模式,因此在到期后必须进行重编程。如果编程失败,重试三次后,适当延迟到期事件后再次尝试编程,并强制执行。
使用实例展示了高精度定时器在实际应用中的精度,时间戳显示其定时精度可达到ms级别。