关于Linux内核学习(尚观Linux研究室)

尚观C语言培训系列视频下载地址 尚观的c语言视频教程,是两个人对话的形式展开的视频教程,需要的可以看看 立即下载
 
 
1. 请推荐一些好的Linux内核参考书?
a.《Linux Device Drivers, Second Edition》,有中文译本
b.《Understanding the Linux Kernel, 2nd Edition》
c.《Linux内核源代码情景分析》,分上下两册
d.《边干边学-Linux内核指导》


2. 内核源代码问题
2.1 如何得到某一版本的Linux内核源代码?
a. http://www.kernel.org或 ftp://ftp.kernel.org,这是Linux内核版本的发布
网站。
b. 很多镜像或本地网站也提供部分Linux内核版本的下载,多用ftp搜索引擎。
c. 一般的Linux发行版如Redhat之类会随盘提供相应的内核源代码,不过这个源代
码往往是改动过的,与同版本的标准Linux内核可能有些差异。

2.2 请推荐一些源代码查看工具?
a. Windows系统可以用Source Insight,Linux系统可以用Source Navigator。
b. vim或emacs编辑器,配合cscope、ctags、etags等交叉索引工具。
c. vim或emacs编辑器,配合grep、egrep等文本搜索工具,不过最好要对源代码目
录结构有所熟悉
d. LXR,以网页的形式通过浏览器浏览,安装复杂,可从 http://lxr.linux.no/下
载该工具也可以直接访问 http://lxr.linux.no/source/在线阅读Linux内核源
代码。

2.3 xx结构的定义在哪个内核源文件中?
a. 请使用源码查看工具,见问题2.2。
b. 如果用grep等文本搜索工具,主要在include/linux和include/asm两个目录下
搜索。

2.4 volatile和__volatile__是什么意思?
a. volatile是C语言定义的关键字,gcc为了需要又定义了__volatile__,它和
volatile表达的是同一意思。
b. volatile的本意是"易变的",由于访问寄存器的速度快于访存,所以编译器一般
都会作优化以减少访存。如果变量加上volatile修饰,则编译器就不会对此变量
的读写操作进行优化,即不通过寄存器缓冲而直接访存。
c. __asm__ __volatile__一起指示编译器不要改动优化后面的汇编语句。

2.5 do{ ... } while(0)是什么意思?
a. 主要是为了避免宏在不同情况展开可能会出现的一些错误。
b. 在 http://www.kernelnewbies.org/faq/上有详细介绍。

2.6 list_entry的定义是怎么回事?
a. list_entry的定义在内核源文件include/linux/list.h中:
#define list_entry(ptr, type, member) \
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
b. 其功能是根据list_head型指针ptr换算成其宿主结构的起始地址,该宿主结构是
type型的,而ptr在其宿主结构中定义为member成员。如下图:

req>|type型对象起始地址
|
|... ...
ptr>|ptr指针所指的member成员地址
|
|... ...

ptr指向图中所示的位置,通过(unsigned long)(&((type*)0)->member)得到ptr
和req之间的差值,ptr减去这个差值就得到了type型宿主结构的指针req,返回
类型为(type*)。


3. 模块编程问题
3.1 模块编程需要注意什么?
a. 在gcc编译选项中增加-c
b. 在gcc编译选项中定义两个宏:-DMODULE -D__KERENL__
或直接在源文件中定义这两个宏:
#define MODULE
#define __KERNEL__
c. 在源文件中包括module.h文件:
#include
d. 如果要用inline功能,需要在gcc编译选项中增加-O2

3.2 为什么insmod一个模块时显示版本不匹配?
假定你现在运行的内核的源码目录绝对路径是MyKernelSrcPath,在gcc编译时
增加选项:
-I $MyKernelSrcPath/include

3.3 为什么出现Unresolved Symbol?
a. 首先查看文件/proc/ksyms,看内核有没有输出这个符号,不同的内核版本如
2.2和2.4输出的符号会有些变化。
b. 如果内核输出的符号带有版本控制信息如符号printk_R12345678,则性质同
问题3.2。

3.4 为什么出现no license错误?
在源文件加入下面一行:
MODULE_LICENSE("GPL");

3.5 为什么看不到用printk打印的信息?
a. 打印消息受级别的限制,消息级别可以通过printk设置,如:
printk("something"); /* 其中0<=n<=7 */
假设控制台的消息级别为m, 当n
这样一方面可以提高要打印消息本身的级别(数字越小级别越高),
另一方面可以改变控制台的消息级别(可从1到8),如改为8可用以下命令:
# echo "8" > /proc/sys/kernel/printk
b. 用dmesg命令看。
c. 当系统运行klogd和syslogd时,内核消息就会由klogd分发到syslogd,
syslogd会根据配置文件/etc/syslog.conf作相应处理,具体可以查看syslogd
和syslog.conf的man页。


4. 内核开发问题
4.1 怎么制作、使用patch文件?
patch文件是由diff命令生成的,使用patch文件用patch命令,具体可查看diff和
patch的man页和info。

4.2 在内核中可以使用系统调用吗?
a. 可以。内核源代码中就有使用系统调用的例子,如open()、execve()等。
b. 在内核中使用系统调用必须要在源文件中包括以下两行:
#define __KERNEL_SYSCALLS__
#include
c. 内核中使用系统调用的相关定义可查看文件include/asm/unistd.h。
如果要用的系统调用该文件中没有定义,可以按照其格式自行添加。

4.3 在内核中怎么打开并操作一个文件?
a. 直接用open()、read()等系统调用,见问题4.2。
b. 用filp_open()函数打开文件,得到struct file *的指针fp。
使用指针fp进行相应操作,如读文件可以用fp->f_ops->read。
最后用filp_close()函数关闭文件。
filp_open()、filp_close()函数在fs/open.c定义,在include/linux/fs.h中
声明。
c. 自己写包装函数,可参照文件fs/exec.c中的open_exec()和kernel_read()函数。
在 http://www.linuxforum.net/forum/showflat.php?Cat=&Board=linuxK
&Number=363455&page=&view=&sb=&o=&vc=1上有些代码可以参照。

4.4 在内核中读写文件时为什么会出现EFAULT错误?
a. 内核文件系统提供的read()和write()之类的函数,期望是对用户态程序服务的,
所以它会验证读写缓冲区不超过用户空间的上限即0xC000 0000。但现在内核中
要读写文件,缓冲区在内核中即地址会超过0xC000 0000。
b. 在读写文件前先得到当前fs:mm_segment_t old_fs=get_fs();
并设置当前fs为内核fs:set_fs(KERNEL_DS);
在读写文件后再恢复原先fs: set_fs(old_fs);
set_fs()、get_fs()等相关宏在文件include/asm/uaccess.h中定义。


5. 其它

5.1 请问xx命令、xx库的源码是哪个文件?
a. 一个系统除了内核以外,还需要有shell、gcc等一系列工具和命令以及C库等一
系列库,这些作为应用程序其源代码都不在内核中,需要另外下载相应的源代码。
b. 对于Redhat系统,可以用rqm -qf命令来查找某一命令所在的软件包,然后再找
相应的源代码包安装。



linux内核精华网站、国内顶尖Linux内核开发者精华文章 LINUX内核相关的顶尖网站、学习资源,可以阅读最新内核的分析文章、业内大牛技术分析 立即下载

相关推荐

尚观培训linux李阳老师关于linux kernel 系统内核编程方面的笔记和讲义

尚观培训嵌入式linux驱动开发的笔记和讲义,大家想去培训的可以看看,然后决定是否去培训。在我的资源里面还有其他讲义,大家可以找找下载。。

#1 内核学习FAQ大集锦

(转载)   内核学习FAQ大集锦1. 请推荐一些好的Linux内核参考书? a.《Linux Device Drivers, Second Edition》,有中文译本 b.《Understanding the Linux Kernel, 2nd Edition》 c.《Linux内核源代码情景分析》,分上下两册 d.《边干边学-Linux内核指导》 2. 内核源

robinshaw的专栏 1452

Linux 内核开发报告 2017 版

Publication_LinuxKernelReport_2017

C语言老师(*^__^*) 嘻嘻……

     刚上大一,学校要求全体学生学习C语言,我当然不例外。以前我是很向往学习C语言的,但是现在显示却和我想的不一样。      话说那个C语言老师,以前在英国教外国人C,由于讲课太有个性了,被外国人称为:Butterly!       上了几周课后,我对此深有体会,他讲课确实太有个性了。此神讲课不按顺序,飞过来飞过去,上课时我就顾着翻书了,但是我翻到某一页后,他又讲到另一叶了,

杨柳(C/C++) 625

linux内核驱动笔记-尚观

由浅入深 了解驱动 内核 是个好东西 给大家分享哈

vue3 web项目引入高拍仪

高拍仪的引入步骤就两步,安装SDK,然后根据官网的api进行开发。根据自己需要的功能,请求对应的接口。

qq_42480170的博客 4116

c语言指针误区,【深度揭秘】C语言——指针学习10大误区

“终于等到的免费网络公开课”【深度揭秘】C语言——指针学习10大误区【深度揭秘】C语言——指针学习10大误区指针一直是C语言中比较精髓的部分,很多学员学习起来很吃力课中李老师通过10种误区来对指针的一系列精髓部分进行讲解,让初学者对指针不再感到困惑,120分钟打通你C语言的任督二脉。【10大误区】误区1:变量与地址的概念混淆误区2:指针与指针变量混淆误区3:直接访问与间接访问混淆误区4:空指针与空...

weixin_31364787的博客 362

emwin与Modbus通信结合:项目实例

通过实际项目讲解emwin界面设计与Modbus通信协议的融合应用,深入剖析数据交互流程。掌握emwin在工业控制场景中的实用技巧,提升系统人机交互与稳定通信能力。

weixin_34618526的博客 482

尚观视屏

http://old.uplook.cn/

sebastain的专栏 633

一款值得关注的开源企业管理ERP系统

盒木ERP是一款开源的现代化企业管理系统,采用前后端分离架构,后端基于Python+Django,前端使用Vue+Ant Design。系统涵盖采购、销售、库存、财务等核心业务模块,支持移动端操作和PDA扫码。具有开源免费、技术先进、功能完善等特点,适合中小企业使用或二次开发。项目提供详细部署指南,支持Docker容器化部署,是学习ERP系统开发和企业数字化转型的优秀选择。

1105

银行数据仓库体系实践(3)--数据架构

狭义的数据仓库数据架构用来特指数据分布,广义的数据仓库数据架构还包括数据模型、数据标准和数据治理。即包含相对静态部分如元数据、业务对象数据模型、主数据、共享数据,也包含相对动态部分如数据流转、ETL、整合、访问应用和数据全生命周期管控治理。 数据架构层面通过数据分类、分层部署等手段,从非功能性视角将数据合理布局。通过整体架构管控和设计,支持业务操作类和管理分析类应用(系统),满足业...

acumen_leo的博客 7010

尚观学习-ule-编辑器

编辑器:gedit(图形编辑器) nano emacs vi vim eioffice(可执行文件安装) openoffice(编译安装) gedit: gedit a                    打开文件a/创建并打开文件a(前台运行编辑器,终端不能继续使用,关闭终端会关闭gedit) gedit a  &               后台运行编辑器(终能能继续使用,关闭

wuhen1226的专栏 2404

数据结构之栈(Stack)的实现详解

堆栈是一种线性数据结构,其插入新元素和删除现有元素都发生在堆栈的顶部。栈(Stack)按照"后进先出"(Last-In-First-Out,LIFO)的原则存储和访问数据。栈类似于现实生活中的堆叠物体,比如一摞书或者一堆盘子。

swadian2008的博客 3812

Linux的学习之路

Linux的学习之路 很多国家及地区的政府(如新加坡、台湾和德国)已经表明有计划把自己的服务器体系结构由WINDOWS向Linux转移。英国政府在与微软协商一个三年期的合同续约时,利用有可能转向Linux成功地节省了1.5亿美元。美国也不甘落后,其国防部(DOD)、国家安全局(NSA)、国家航空和宇宙航行局(NASA)以及美国国家标准和技术委员会(NIST)都在就部署Li...

weixin_34221036的博客 91

Matlab可调用MODTRAN5封装器之Mod5

MODTRAN 是一个计算地球大气中电磁辐射传输的软件代码。MODTRAN是通过使用具有严格格式的输入文本文件来控制的。这个文件被称为“tape5”,扩展名为.tp5或.ltn。手工创建或编辑这个文件是不方便的。Mod5提供了一组函数来简化MODTRAN用例的处理。这些方法包括将tape5文件格式读取到Mod5类“实例”或“对象”中,更改文件中描述的案例实例,将tape5格式写回文件,在案例上运行MODTRAN并将MODTRAN输出文件中的各种结果读取回Matlab。还有许多绘图方法可用。

qq_19512613的博客 3254

PCL Super4PCS算法实现点云粗配准(版本一)【2025最新版】

Win11系统下实现[Super4PCS: Fast Global Pointcloud Registration via Smart Indexing一文中的配准算法。

点云侠的博客 3378

嵌入式开发学习路线图

ARM+Linux嵌入式底层内核驱动方向学习总体路线图 基础学习Ⅰ---Linux入门 目前嵌入式主要开发环境有 Linux、Wince等;Linux因其开源、开发操作便利而被广泛采用。而Linux操作系 统也只是一个简单的操作系统,简单的使用对于嵌入式开发人 员来说价值并不很高,真正有价值的是掌握Lin...

嵌入式之斋 8959

基于FPGA的万兆以太网学习(1)

万兆(10G) 以太网测速视频:SFP+屏蔽笼可以插入千兆或万兆光模块。SFP+信号定义与 SFP 一致。

baidu_34971492的博客 2249

嵌入式开发学习路线图_嵌入式学习路线,Golangui设计基础ppt

Linux继承了Unix的优点,但是没有用UNIX的代码,所有程序都是重新编写的,而且。在开始学习前,建议有一块自己的开发板,目前ARM9 2440的开发板价格在400-600元之间,ARM11 6410。ARM体系结构的学习。段的学习,我们就可以初步实现一些应用程序的开发了,如做自己的shell命令解析器、简单的聊天软件、视频多。我们是不能完全照抄别人代码的,因为我们自己手中的开发板及处理器与别人是不同的,除非所用的代码是根据你。手中的开发板来编写的。酬高的、最具价值的无疑是嵌入式内核驱动级别的开发者。

2401_84266059的博客 988

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

嵌入式开发学习路线图_嵌入式学习路线(1),2024年最新一个小例子彻底搞懂Golang的MVP模式到底是什么

Linux继承了Unix的优点,但是没有用UNIX的代码,所有程序都是重新编写的,而且。统也只是一个简单的操作系统,简单的使用对于嵌入式开发人 员来说价值并不很高,真正有价值的是掌握Linux的。段的学习,我们就可以初步实现一些应用程序的开发了,如做自己的shell命令解析器、简单的聊天软件、视频多。C语言是整栋嵌入式大厦的基础,所以在学习嵌入式时,必须把C语言重视起来,多敲代码,多练。C++、QT在嵌入式开发领域,是用来开发图形界面的,希望从事上层应用开发及图形界面,那么在C++、QT。

2401_84240369的博客 1413

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

最全嵌入式开发学习路线图_嵌入式学习路线(1),2024年最新电子版已问世

strcopy、strcat、printf等)在内核中是如何实现的,以及编写代码模拟堆栈,这 不仅有利于编写代码质量的提。Linux继承了Unix的优点,但是没有用UNIX的代码,所有程序都是重新编写的,而且。段的学习,我们就可以初步实现一些应用程序的开发了,如做自己的shell命令解析器、简单的聊天软件、视频多。C语言是整栋嵌入式大厦的基础,所以在学习嵌入式时,必须把C语言重视起来,多敲代码,多练。C++、QT在嵌入式开发领域,是用来开发图形界面的,希望从事上层应用开发及图形界面,那么在C++、QT。

2401_84925335的博客 1142

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

2024年物联网嵌入式最全嵌入式开发学习路线图_嵌入式学习路线,2024年最新狂刷200道数据结构与算法

strcopy、strcat、printf等)在内核中是如何实现的,以及编写代码模拟堆栈,这 不仅有利于编写代码质量的提。Linux继承了Unix的优点,但是没有用UNIX的代码,所有程序都是重新编写的,而且。段的学习,我们就可以初步实现一些应用程序的开发了,如做自己的shell命令解析器、简单的聊天软件、视频多。C语言是整栋嵌入式大厦的基础,所以在学习嵌入式时,必须把C语言重视起来,多敲代码,多练。C++、QT在嵌入式开发领域,是用来开发图形界面的,希望从事上层应用开发及图形界面,那么在C++、QT。

2401_85015249的博客 796

2024年物联网嵌入式最新嵌入式开发学习路线图_嵌入式学习路线(1),物联网嵌入式开发开发热门前沿知识

Linux继承了Unix的优点,但是没有用UNIX的代码,所有程序都是重新编写的,而且。在开始学习前,建议有一块自己的开发板,目前ARM9 2440的开发板价格在400-600元之间,ARM11 6410。段的学习,我们就可以初步实现一些应用程序的开发了,如做自己的shell命令解析器、简单的聊天软件、视频多。C语言是整栋嵌入式大厦的基础,所以在学习嵌入式时,必须把C语言重视起来,多敲代码,多练。C++、QT在嵌入式开发领域,是用来开发图形界面的,希望从事上层应用开发及图形界面,那么在C++、QT。

2401_85013565的博客 1060

尚观嵌入式C语言学习

第10节 1、for(;n>0;n–) 2、注释: #if 0 #endif

花开那年 809
上一篇: 白话TCP/IP协议
下一篇: lsof简介
LinuxJoey
博客等级 码龄15年 117粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值