linux学习笔记
使用书籍:Linux程序设计(第四版) Neil Matthew 等著
1 建立C环境
1.在gcc中使用—I标志包含在非标准目录中的头文件
例如: $ gcc -I/usr/openwin/inlcude fred.c
库文件:.a 代表传统的静态函数库。包含在可执行程序中,类似于.lib
.so代表共享函数库。运行时加载,类似于.dll
给出完整的库文件路径或使用-l 标志来告诉编译器要搜索的库文件。
例如:$ gcc -o fred fred.c /usr/lib/libm.a
2.静态库的实例
1.建两个源文件(假定fred.c bill.c)
2.编译 $gcc -c fred.c bill.c
3. 建头文件,把fred. c 和bill.c 包括进来
5.建调用程序program.c
6.测试:$gcc -c program.c
$gcc -o program program.o bill.o
$./program
7.用ar程序建归档文件,把目标文件添加进去,建成库文件
$ar crv bibfoo.a bill.o fred.o
二.shell程序设计
1.在文件中查找字符串
grep 字符 文件(如*.h, *.c, ....)
例如:grep EXIT_ *.h(查找当前目录下所有.h文件中含有Exit_的文件;
2.grep "lxz" lxz.test 在文本中查询内容
manual 手册 缩写 man
find 查找 find / -name lxz.test
grep "lxz" lxz.test > back.bak 管道定向命令,把grep "lxz" lxz.test 的结果保存到 back.bak
linux ln 命令的使用 收藏
ln
这是linux中一个非常重要命令,请大家一定要熟悉。它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln -s 源文件 目标文件。
当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。例如:ln -s /bin/less /usr/local/bin/less
-s 是代号(symbolic)的意思。
这里有两点要注意:第一,ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;第二,ln的链接又软链接和硬链接两种,软链接就是ln -s ** **,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接ln ** **,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。
如果你用ls察看一个目录时,发现有的文件后面有一个@的符号,那就是一个用ln命令生成的文件,用ls -l命令去察看,就可以看到显示的link的路径了。
module_param 模块参数
module_parm(name,type,perm)
name 模块名称, type 参数类型, perm模块参数的访问权限
type常见值:
bool int charp:字符串型
perm 常见值:
S_IRUGO:
S_IWUSR:
例如:
int a=3;
char *st;
module_param(a, int, S_IRUGO);
module_param(st,charp,S_IRUGO);
内核符号导出:
嵌入式系统的软件层次:
1. 引导加载程序
2. linux内核
3. 文件系统
linux地址:(x86以16位的cpu为例)
物理地址 physical address
线性地址(虚拟地址)linear Address
逻辑地址 logical address: 逻辑地址=段基地址+偏移地址
地址转换:
段式管理,页式管理
20位的地址线,1M空间。而寄存器只有16位,只能访问64K
为了能够访问1M的内存空间,cpu就采用了内存分段的管理模式
在cpu的内部加入了段寄存器。
32位的cpu
采用了两种工作模式:实模式,保护模式
在实模式下,和16位的内存管理一致
在保护模式下,每个段的最大容量可达4G,段寄存器的值是段地址的“选择器”,
从内存中得到一个32位的段地址,物理地址就是该段地址加上段内偏移地址。
页式管理:
线性地址被分为固定长度的的组,称为页
linux内存管理;
所以段的基地址均为0;
逻辑地址和线性地址保持一致;
有限制(没有)使用段式管理
完全使用页式管理,分为四级;
1,页全局目录(page global directory)
2,页上级目录(page upper directory)
3,页中间目录(page middle directory)
4,页表(page tableentry): pte
linux进程空间
用户空间对应进程,每当进程切换,用户空间就会跟着变化
内核的内存分配:
#include<linux/slab.h>
void *kmalloc(size_t, int flags)
参数:size:分配的大小,flags,控制kmalloc的行为
如果模块需要分配大块的内存,使用页的分配会更好
chkconfig --list 查看系统服务设定
chkconfig --level N [ 服务名称] 指定状态 : 对指定的服务指定系统服务级别
例如: 将sshd设置为开机不启动
chkconfig --level 3 sshd off
fcntl 函数:(可以改变文件的性质)
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
int fcntl<int filedes(文件描述符), int cmd, ...);
出错返回-1
fcntl有五种功能
1,复制现存的描述符
2,获得/设置文件描述符(cmd=F_GETFD或F_SETFD)
3,获得/设置文件状态标志(cmd=F_GETFL或F_SETFL)
4,获得/设置异步I/o有权
5, 获得/设置记录锁
O_RDONLY
O_WRONLY
O_APPEND
用fcntl给文件加锁(避免死锁);
fcntl函数结构
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
struct flock结构
struct flock{
short l_type;
off_t l _start;
short l_whence;
off_t l_len;
off_t l_pid;
}