ubuntu 内核模块编程+模块参数传递+模块符号表输出


(注:内核版本号:linux-3.4.106-ubuntu)

 

一.            模块编程(a.         hello模块  b.hello传递参数test  c.符号输出表)

a)        Hello 模块 printk

1.      Makefile文件

b)        Hello.c文件

 

1.        编译测试:终端输入make

   

 

 

2.        安装模块:#insmod hello.ko   

          #dmesg

3.        卸载模块:#sudo rmmod hello.ko

c)        模块参数传递

1.      Hello.c文件,参数test,整形,权限掩码:000

2.      Make文件

#make

#insmod hello.ko

3.      参数test=1401210416

 

 

 

 

 

 

 

 

 

d)       符号表输出

对于模块文件内定义的函数和变量,如果想让其他模块引用,必须经过特殊的处理。即提供一个宏来完成这个工作:EXPORT_SYMBOL(X),模块符号导出

这样子,两个或多个模块间就建立了依赖关系 。

1.      Hello.c文件(部分主要代码)

2.      Export_symbol模块文件代码,

3.       Makefile 文件

 

4.      然后经过#make

    make之后进行模块安装,经多次安装不成功后找找资料,发现:模块之间有依赖关系时,要先安装被依赖的(export_symbol)模块,然后在安装依赖(hello)模块;

模块安装成功:

卸载时,要先卸载hello.ko模块文件后,才能卸载export_symbol模块;

模块之间存在依赖关系时,安装和卸载都要讲究顺序;

5.      输出结果:hello.ko模块依赖于export_symbol.ko模块中的fun_test函数

调用函数计算a=3,b=9和;

 

        

二.系统启动过程兴趣点剖析

剖析:什么是systemd? Systemd优势是什么?如何采用Systemd的启动过程?

1.什么是systemd?Systemd优势?

       systemdLinux电脑操作系统之下的一套中央化系统及设置管理程序init软件),包括有守护进程程序库跟应用软件;

systemd被设计用来改进sysvinit的缺点,它和Ubuntuupstart是竞争对手,预计会取代它们。

systemd的目标是:尽可能启动更少进程;尽可能多地将进程并行启动。systemd尽可能减少对shell脚本的依赖。传统sysvinit使用inittab来决定运行哪些shell脚本,大量使用shell脚本被认为是效率低下无法并行的原因。systemd使用了Linux专属技术,不再顾及POSIX兼容,一度谣传Debian为了它的BSD项目将不会使用systemd

2Systemd如何设置

Ø  安装:

sudo pacman -Rcsnsysvinit syslog-ng           //删除sysvinit

sudo pacman -Ssystemd systemd-arch-units systemd-sysvcompat      

//安装systemd-sysvcompat

我设置的是一个纯的systemd环境。

这样有一个好处是可以不用设置内核启动参数:init=/bin/systemd

Ø  SystemD初始化工具(init tool)来启动系统。

SystemD 含了自己的配置和诊断工具,在使用它处理系统启动问题时用到的技巧不同于SysVinit

SystemD传达命令的主要工具是systemctl它是一个命令行程序。

该工具在改变配置文件或重新启动后台程序时需要root权限,但即使是非root用户也能下达一些诊断的命令。如果在启动该命令时不加任何参数,会看到一个系统启动时执行任务的单位(unit列表,包括挂载及检测磁盘、启动后台服务及配置硬件。

可使用参数让systemctl只列出某个类型的单位,如所有的服务单位:

systemctl –type=service

SystemD自动将其输出结果递交给less显示,列表中:

第一栏是单位的名字;

第二栏则表示该单位的定义是否已由SystemD正确加载。

第三栏则为该单位是否正在运行。如果使用了-a参数,那么该程序将仅显示非正在运行的单位,即已安装但并未在启动时使用的单位,同时也包含引导系统未能正常加载的单位文件。

第四栏则给出了当前状态:“exited”表示该进程已经无任何错误地完成,这种情况适用于,诸如进程在启动后并不在后台继续运行的情况,例如,在系统启动时由于考虑到兼容性因素执行在SysVinit里面常用的/etc/rc.d/rc.local文件的服务单位。“Running”表示正在后台运行的服务,如crondbussshdudev

第五栏是对该单位的描述。标有“LSB”“SYSV”的单位已由systemd自动创建以管理传统启动脚本。

不能启动或启动后崩溃的服务在第四栏中用红色标为“failed”。可用如下命令来察看该服务是何时崩溃的以及在服务程序结束后提供了什么错误代码:

Systemctl status ntpd.service

ystemctl会列出包含文本终端的登录进程(agetty)的服务型单位。

因为SystemD不同于Sysvinit,它会像管理普通的后台服务一样以服务单位的形式对这些进程进行管理。

1.   SystemD服务管理

systemctl is-enabled.service                 #查询服务是否开机启动

sudo systemctl enable.service                 #开机运行服务

sudo systemctl disable.service               #取消开机运行

sudo systemctl start.service                 #启动服务

sudo systemctl stop .service                   #停止服务

sudo systemctl restart.service               #重启服务

sudo systemctl reload.service                 #重新加载服务配置文件

systemctl status.service                     #查询服务运行状态

systemctl–failed                             #显示启动失败的服务

2. 开机模块加载

/etc/modules-load.d/.conf,相当于原rc.conf中的MODULES变量

模块黑名单仍在/etc/modprobe.d/下,如blacklist.conf:

3. Locale

/etc/locale.conf,相当于原rc.conf中的LOCALE

4. 日志服务

systemd自带日志服务,参考systemd Journal

可以删除syslog-ng

5. 主机名

/etc/hostname,相当于原来rc.conf中的HOSTNAME变量

6. 网络

还是用NetworkManager工具



 

猜你喜欢

转载自blog.csdn.net/debug_snail/article/details/44785607