2017-2018-1 20179205《Linux内核原理与设计》第十周作业
《Linux内核原理与设计》第十周作业
教材17、19、20章学习及收获
1、在Linux以及所有unix系统中,设备被分为以下三种:块设备(blkdev)以块为单位寻址,通过块设备节点来访问;字符设备(cdev),不可寻址,通过字符设备节点访问;网络设备:对网络的访问,通过物理适配器和协议进行访问。
2、可装载内核模块:单独的二进制镜像,允许内核在运行时动态插入或删除代码。如果编译到内核中,入口点init存放在内核映像中,并且退出函数不会被包含和调用。
3、导出符号表:只有被导出后的内核函数,才可以被模块调用,代码被配置为模块的时候必须确保接口全部被导出。导出的内核符号表被看做导出的内核接口,内核API。导出指令:EXPORT_SYMBOL()
内核模块相关操作:
make modules_install //把随内核编译出来的模块安装到合适的目录/lib/modules/version/kernel下
depmod //产生内核依赖关系信息
depmod -A // 只为新模块生成依赖信息(速度更快)
insmod module.ko //以root身份运行命令
modprobe module [module parameters] //modprobe提供了模块依赖性分析、错误智能检查、错误报告以及许多其他功能和选项,需以root身份运行,强烈建议使用
rmmod module.ko //以root身份运行命令
modprobe -r module // 同模块的加载类似,modprobe命令也会卸载给定模块所依赖的相关模块
EXPORT_SYMBOL(函数名) //接在要导出的函数后面即可
EXPORT_SYMBOL_GPL(函数名) //和EXPORT_SYMBOL一样,区别在于只对标记为GPL协议的模块可见
内核模块导出符号表 示例:
编写一个导出函数的模块 module_A: test_module_A.c
#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>
MODULE_LICENSE("Dual BSD/GPL");
static int test_export_A_init(void)
{
/* 进入内核模块 */
printk(KERN_ALERT "*************************\n");
printk(KERN_ALERT "ENTRY test_export_A!\n");
printk(KERN_ALERT "*************************\n");
printk(KERN_ALERT "\n\n\n\n\n");
return 0;
}
static void test_export_A_exit(void)
{
/* 退出内核模块 */
printk(KERN_ALERT "*************************\n");
printk(KERN_ALERT "EXIT test_export_A!\n");
printk(KERN_ALERT "*************************\n");
printk(KERN_ALERT "\n\n\n\n\n");
}
/* 要导出的函数 */
int export_add10(int param)
{
printk(KERN_ALERT "param from other module is : %d\n", param);
return param + 10;
}
EXPORT_SYMBOL(export_add10);
module_init(test_export_A_init);
module_exit(test_export_A_exit);
4、在安装和卸载多个模块时,要按照先安装模块A,再安装模块B;先卸载模块B,再卸载模块A的顺序进行。
5、统一设备模型的最初动机是为了实现智能的电源管理,linux 内核为了实现智能电源管理,需要建立表示系统中所有设备拓扑关系的树结构,这样在关闭电源时,可以从树的节点开始关闭。统一设备模型的核心部分就是 kobject,使得各个物理设备能够以树结构的形式组织起来。kset是kobject对象的集合体,可以所有相关的kobject置于一个kset之中,比如所有“块设备”可以放在一个表示块设备的kset中。

5、kset,ktype和sysfs都是和kobject息息相关的。
6、在编码可移植性代码时,使用不透明的数据结构不要假设该类型的长度,因为它们在不同的体系结构中可能会发生改变;长度确定的类型只能在内核空间使用, 用户空间无法使用. 用户空间有对应的变量类型, 名称前多了2个下划线。这个在敲代码时很容易出错,本周的linux实验在编译内核模块时我只敲了一个下划线,结果报错。
7、在协调数据对齐时,虽然调整结构体中元素的顺序可以减少填充的字节, 从而降低内存的消耗。但是对于内核中已有的那些结构, 千万不能随便调整其元素顺序, 因为内核中很多现存的方法都是通过元素在结构体中位置偏移来获取元素的。
8、使用 rmb() wmb() 等内存屏障来确保处理器的执行顺序。
9、起初编写的程序时常会有出现bug或者不完善的地方,这时可以通过提交补丁来改善。生成BUG或者改善代码的补丁有2种方法:
- 用diff命令创建补丁
生成patch
diff -urN linux-old/ linux-new/ > my-patch // 比对整个内核代码文件夹
OR
diff -u linux-old/some/file linux-new/some/file > my-patch // 比对某个文件
应用patch 应用了patch之后, linux-old 和 linux-new 中的代码就一样了
cd linux-old
patch -p1 < ../my-patch // 这个命令是进入linux内核代码根目录内执行的
diffstat -p1 my-patch //diffstat工具,列出补丁所引起的变更的统计(加入或移去的代码行)
- 用git命令创建补丁
提交修改的或新增的代码
git commit -a // 提交所有修改的代码
OR
git commit linux-src/some/file.c // 提交某个修改的代码
OR
git add linux-src/some/new-file.c // 把新增的文件加入版本库
git commit -a // 提交新增的文件
生成patch
git format-patch -N //N是正整数, 这条命令生成最后N次提交产生的补丁
OR
git format-patch -1 //最后1次提交产生的补丁
应用patch
和第一种方法一样
总结:
在学习了Linux内核设计与实现这本书后,想要利用Linux系统去做一些实践,比如敲些代码等,那么加入linux社区是很有必要的,因为可以在社区中获取内核最新的消息,而且可以及时和社区内有经验的内核开发者交流经验。同时也是提交代码和讨论代码的地方, 了解社区的规则, 融入社区环境之中, 才能更好的学习内核, 体会内核开发的乐趣和成就感。
问题:
数据对齐是增强可移植性的一个重要方面,意思是数据结构的内存地址可以被4整除。char 类型只占 1个字节, 它的地址不一定能被4整除, 那么转换为 4个字节或者8个字节的 usigned long之后,为什么会导致 unsigned long 出现数据不对齐的现象?
2017-2018-1 20179205《Linux内核原理与设计》第十周作业的更多相关文章
- 2017-2018-1 20179205《Linux内核原理与设计》第九周作业
<Linux内核原理与设计>第九周作业 视频学习及代码分析 一.进程调度时机与进程的切换 不同类型的进程有不同的调度需求,第一种分类:I/O-bound 会频繁的进程I/O,通常会花费很多 ...
- 2017-2018-1 20179205《Linux内核原理与设计》第二周作业
<Linux内核原理与分析>第二周作业 本周视频学习情况: 通过孟老师的视频教程,大致对风诺依曼体系结构有了一个初步的认识,视频从硬件角度和程序员角度对CPU和Main Memory(内存 ...
- 20169212《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...
- 20169210《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...
- 2018-2019-1 20189221 《Linux内核原理与分析》第九周作业
2018-2019-1 20189221 <Linux内核原理与分析>第九周作业 实验八 理理解进程调度时机跟踪分析进程调度与进程切换的过程 进程调度 进度调度时机: 1.中断处理过程(包 ...
- 2017-2018-1 20179215《Linux内核原理与分析》第二周作业
20179215<Linux内核原理与分析>第二周作业 这一周主要了解了计算机是如何工作的,包括现在存储程序计算机的工作模型.X86汇编指令包括几种内存地址的寻址方式和push.pop.c ...
- 2019-2020-1 20199329《Linux内核原理与分析》第九周作业
<Linux内核原理与分析>第九周作业 一.本周内容概述: 阐释linux操作系统的整体构架 理解linux系统的一般执行过程和进程调度的时机 理解linux系统的中断和进程上下文切换 二 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 一.上周问题总结: 未能及时整理笔记 Linux还需要多用 markdown格式不熟练 发布博客时间超过规定期限 二.本周学习内容: <庖丁解 ...
- 2019-2020-1 20209313《Linux内核原理与分析》第二周作业
2019-2020-1 20209313<Linux内核原理与分析>第二周作业 零.总结 阐明自己对"计算机是如何工作的"理解. 一.myod 步骤 复习c文件处理内容 ...
- 2017-2018-1 20179205《Linux内核原理与设计》第四周作业
<Linux内核原理与分析> 视频学习及实验操作 Linux内核源代码 视频中提到了三个我们要重点专注的目录下的代码,一个是arch目录下的x86,支持不同cpu体系架构的源代码:第二个是 ...
随机推荐
- sql语句中的insert 和 insert into 的区别?into有什么用?
insert into tableName values(........) insert tableName (字段名1,字段名2,...)values(......)看语句结构就知道区别了 .in ...
- 【Linux】linux中删除指定文件外所有其他文件(夹)的问题
今天碰到要删除指定文件(夹)外的其他文件的问题.网上查到的方法是这样的 需要在当前文件夹中进行: rm -rf !(keep) #删除keep文件之外的所有文件 rm -rf !(keep1|keep ...
- 【hdu4734】F(x) 数位dp
题目描述 对于一个非负整数 $x=\overline{a_na_{n-1}...a_2a_1}$ ,设 $F(x)=a_n·2^{n-1}+a_{n-1}·2^{n-2}+...+a_2·2^1+ ...
- BZOJ4770 图样(概率期望+动态规划)
考虑求出所有MST的权值和再除以方案数,方案数显然是2mn. 按位考虑,显然应该让MST里的边高位尽量为0.那么根据最高位是0还是1将点集划分成两部分,整张图的MST就是由两部分各自的MST之间连一条 ...
- [SDOI2015]约数个数和 莫比乌斯反演
---题面--- 题解: 为什么SDOI这么喜欢莫比乌斯反演,,, 首先有一个结论$$d(ij) = \sum_{x|i}\sum_{y|j}[gcd(x, y) == 1]$$为什么呢?首先,可以看 ...
- BZOJ4337:[BJOI2015]树的同构——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4337 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根, ...
- BZOJ2597 [Wc2007]剪刀石头布 【费用流】
题目链接 BZOJ2597 题解 orz思维差 既然是一张竞赛图,我们选出任意三个点都可能成环 总方案数为 \[{n \choose 3}\] 如果三个点不成环,会发现它们的度数是确定的,入度分别为\ ...
- Linux内核中的常用宏container_of其实很简单
http://blog.csdn.net/npy_lp/article/details/7010752 通过一个结构体变量的地址,求该结构体的首地址. #ifndef CONTAINER_OF #de ...
- JavaScript中Unicode值转字符
在JavaScript中,将Unicode值转字符的方法: <!DOCTYPE html> <html> <head> <meta charset=" ...
- Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) A B C D 水 模拟 构造
A. Neverending competitions time limit per test 2 seconds memory limit per test 512 megabytes input ...