Linux 0.11内核编译错误记录
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 0.11内核编译错误记录相关的知识,希望对你有一定的参考价值。
参考技术A 现象1: 提示gas gld 比识别
措施: gnu编译器发展到后来,越来越流行,更多使用别名为 as ld gcc等.
现象2: 提示字节对齐需要是 2的倍数
措施: 具体解决方法: 利用命令 sed -i \'s/align 2/align 4/g\' filename 替换align 2 为 align 4(align 3 替换为 align 8)
sed -i \'s/align 2/align 4/g\' boot/head.s
sed -i \'s/align 3/align 8/g\' boot/head.s
现象3: -fcombine-regs -mstring-insns选项不识别
措施: 此两个选项已经过时,直接去掉即可
现象4: warning 特别多
措施: 将-Wall 替换为 -w
现象5: __stack_chk_fail 未定义
措施: 去网上搜了一下,在Makefile中的$(CFLAGS)后面加上-fno-stack-protector,即不需要栈保护
现象6: main.c 中_syscall0重复定义
措施: main.c static inline _syscall0(int, fork) 去掉static即可
现象7: 提示内嵌汇编不符合语法限制
措施: 类似的问题在后面编译中出现好多,C内嵌汇编的格式 asm (汇编语句:输入寄存器:输出寄存器:可能被修改的寄存器),最新的GCC规定 输入或输出寄存器不能出现在可能被修改的寄存器中,目前看到网上的方法是把所有类似问题的可能被修改的寄存器全部删掉 解决方案:find -type f -exec sed -i \'s/:"\\w2"(,"\\w2") )/:) /g\' ; 其中\'s/:"\\w2"(,"\\w2") /:/g\'
现象8: 在 control.c 中清楚定义了 static unsigned char attr = 0x70 ,而在链接 control.o 时,却爆出 attr未定义。
措施: 用 nm -C control.o 查看其符号,发现attr确实处于未定义状态。故单独编译一个小程序定义静态变量,查看其 .o 文件中,发现静态变量定义正常。故考虑为编译选项差异导致,最终发现因为 -O 编译优化选项导致,目前处理方式是去掉该选项。
现象9: build.c:(.text+0xde): undefined reference to `MAJOR\'
措施: 通过分析编译打印信息,发现编译时没有加入头文件路径 -Iinclude
现象10: fs/fs.o: In function check_disk_change\':(.text+0x1b2f): undefined reference to invalidate_buffers\'
措施: 查找发现此函数定义在buffer.c 中,且为内联函数, 故尝试将其更改为普通函数, 然后编译通过.
现象11: 编译 build.c 时报错:/usr/include/i386-linux -gnu/bits/stdio2.h:57:8: error: unknown type name ‘__gnuc_va_list’
措施: 分析发现时此系列错误均由 -Iinclude 选项导致, 而该选项在 想象9 中加入, 故考虑去掉该选项, 直接在build.c 中加入 MAJOR 宏定义.
鸟哥linux摘要-Linux复习必备(Linux命令)
以下内容可能比较少,如要深入了解,可查阅相关书籍,敬请谅解
鸟哥Linux私房菜摘要
文章目录
1.Linux是什么
1.1 Linux是什么
1.1.1 Linux是什么
- Linux是操作系统
- Linux包括内核与系统调用那两层
- 硬件是由内核来控制的
- Windows是开发在x86架构上的系统
1.1.2 unix的历史
- 兼容分时操作系统可以使多个用户分别使用CPU的资源,其实是CPU在每个用户之间的工作之间来回切换
- 内核程序:所有的程序或系统装置都是文件
- unix正式版本是由C语言开发出来的
- 史托曼开始GNU项目,为的是创建一个自由的,开放的UNIX操作系统。先是在Unix上开发GNU软件打开GNU项目的知名度,然后是开发C语言的编译程序(GNU C Complier (GCC))打开项目的能见度。GNU项目开发出来的几个重要软件:GCC,Bash Shell
1.2 linux开发
- 多任务处理的CPU是在不同程序之间的切换
- Linux是许多人不断维护的结果
- Linux的内核版本:
- 主次版本为奇数:开发中版本
- 主次版本为偶数:稳定版本
1.3 Linux的特色
- 自由与开放
- 配备需求低廉
- 内核功能强大稳定
- 多任务多用户
- 用户与用户组的规划
1.4 主机规划与磁盘分区
- 磁盘分区的选择
- 目录树结构
- 根目录最重要,以一条斜线
/
表示
- 根目录最重要,以一条斜线
- 文件系统与目录树的关系(挂载)
- 目录树结构
2.首次登录
命令格式:命令 选项 参数1 参数2…
- 加入选项参数时,参数前通常会带
-
号 - 命令太长时,可以使用反斜杠
\\
转义回车键,让命令在下一行输入 - 大小写字母不一样
2.1 基础命令
- date显示时间
date + %Y/%m/%d
年月日显示date +%H:%M:%S
时分秒显示
- cal 显示日历
cal
显示当前年的月份日历cal 2021
显示2021年的日历cal [[mongth] year]
cal 7 2021
显示2021年的7月份
- bc 计算器
quit
退出scale = number
保留的位数
- man查看帮助
2.2 热键
- Tab键
- 补全文件名及命令
- Ctrl + c强行终止命令
- Ctrl + d离开命令行,退出
2.3. 关机
在Linux上,每个程序都是在后台运行的,我们不知道有多少人在使用我们的服务
- 数据同步写入硬盘:sync
Linux系统中,为了加快数据的读取速度,某些加载内存中的数据不会直接被写入硬盘,而是先暂存在内存之中。在不正常关机时,数据会更新不正常,需要使用sync命令更新数据
- 关机命令shutdown
shutdown -t second
:-t后加秒数,过几秒才关机
shutdown -r
:停掉服务就重启
shutdown -h now
:立刻关机
shutdown -h +30
:三十分钟后关机
shutdown -r +30 "The system will reboot!"
:三十分钟系统重启,并显示消息给在线用户
- 重启关机
reboot
:重启
poweroff -f
:关机
- 切换执行等级init
init 0
:关机
init 3
:纯命令行模式
init 5
:含有图形界面模式
init 6
:重启
3.Linux的文件权限与目录配置
3.1 用户和用户组
用户:可以比喻为家庭的成员
用户组:可以比喻为整个家庭
- 用户身份和用户组记录的文件
- 所有系统上的帐号和一般身份用户,及root的相关信息记录在 /etc/passwd文件中
- 个人的密码记录在 /etc/shadow文件下
- 所有的组名记录在/etc/group内
3.2 Linux的文件权限
3.2.1 Linux文件属性
使用ls -al
命令获取文件相关信息
- 第一列表示文件的类型和权限(共十个字符)
- 第一个字符代表这个文件是
目录,文件或链接文件
d
目录-
文件l
链接文件
- 接下来九个,三个三个为一组,都为
rwx
的组合,没有权限则为-
,保持rwx的顺序- 第一组:拥有者权限
- 第二组:同用户组的用户权限
- 第三组:其他用户权限
- 第一个字符代表这个文件是
- 第二列:有多少个文件名连接到此节点(i-node)
- 第三列:文件所有者的帐号
- 第四列:文件所属的用户组
- 第五列:文件大小
- 第六列:修改日期
- 第七列:文件名
3.2.2 改变文件属性和权限
- chgrp改变文件所属用户组
注意:改变的
chgrp [-R] dirname/filename 进行递归型的更改
eg.
chgrp users install.log 改变为user用户组
- chown改变文件所有者
chown [-R] 帐号名称 文件或目录
chown [-R] 账号名称:组名 文件或目录
- chmod 改变文件的权限
数字形式:
r :4
w : 2
x : 1
owner = rwx = 4 + 2 +1 = 7group = rwx = 4 + 2 + 1 = 7
chmod [-R] xyz 文件或目录
xyz : 为数字类型的权限属性,是数值的相加
eg.
chmod 777 py
- 符号形式
- 命令格式
chmod 身份 操作 文件或目录
- 三种身份 user group others all(代表所有)分别为开头字母u,g,o,a
- 操作:+(加入)-(除去)=(设置)
- r , w , x
- 命令格式
eg
chmod a+w py 所有用户均加入w权限
chmod a-x py 所有用户均去掉可执行权限
3.2.3 权限的意义
-
目录的
x
权限- 具有x权限,表示能够进入该目录,否则就不能(这个要极其注意)
-
目录的w权限
- 可以让用户删除,更新,新建文件或目录,非常重要,谨慎给
-
目录的r权限
- 只具有r权限,只可以用ll查到目录下的文件名,而其它信息全是一堆问号
4.Linux文件与目录管理
4.1 目录与路径
4.1.1 相对路径与绝对路径
- 绝对路径:必须从根目录写起
- 相对路径:相对于某一路径的路径写法
4.1.2 目录的相关操作
cd
切换目录
cd [相对路径或绝对路径]
eg.
cd ~py 回到py这个用户的主文件夹
cd 回到自己主文件夹
cd ..返回上层目录
cd - 回到上次访问的目录
cd /var/spool 绝对路径写法
cd ./py相对路径写法
pwd
显示目前所在的目录
eg.
pwd -P 不适用连接路径,显示当前的路径
pwd 显示目录
- mkdir 创建目录
mkdir [-mp] 目录名称
-m 设置文件权限
-p 递归创建目录
eg.
mkdir test
mkdir -p tese1/test2/test3创建多级目录
mkdir -m 711 test4创建rwx--x--x的目录
- rmdir删除
空
的目录
rmdir [-p] 目录名称
-p 连同上层的空目录也删除掉
eg.
rmdir test 有内容(包括空的目录)不可删除,无内容可以删除
rmdir -p AA/BB/CC递归删除上层空目录
4.1.3 执行文件路径的变量: $PATH
查看文件属性的命令ls的完整文件名为:/bin/ls(绝对路径)
因为有环境变量PATH的配置,故可以使用ls命令
4.2 文件与目录管理
4.2.1 查看文件或目录 ls
ls [-各种参数] 目录名称
ls [--color = {never,auto,always}] 目录名称
ls [--full-time] 目录名称
参数:
-a : 显示全部文件,连同隐藏文件
-l : 列出文件属性与权限等数据
-d : 仅列出目录本身,不列出目录内的文件数据
4.2.2 复制、删除和移动 cp,rm,mv
- cp
cp [-air···] 源文件 目标文件
参数:
-a : 相当于pdr的意思,文件的所有特性复制过去
-p : 文件属性复制过去,而非使用默认属性
-d : 若源文件为连接文件的属性,则复制连接文件属性而非文件本身
-i : 目标文件已经存在时,覆盖前会询问
-r : 递归复制,用于目录的复制
还有许多参数
注意:如果源文件有两个以上,目标文件一定需要是目录
注意文件权限的改变:
默认条件下,cp的源文件和目标文件的权限是不同的,目的文件的所有者通常是命令操作者本身
- rm
rm [-fir] 文件或目录
eg.
参数:
-f : 忽略不存在的文件,不出现警告信息
-i : 互动模式,询问是否操作
-r : 递归删除
- mv
mv [-fiu] 源文件 目标地址
参数:
-f : 目标文件存在不询问直接覆盖
-i : 目标文件已存在,询问是否覆盖
-u : 目标文件已存在,source比较新,才会更新
eg.
mv还可以重命名
mv AA CC只要新名称不存在即可
mv 1.txt 2.txt AA多个源文件一个目录
4.3 文件内容查阅
4.3.1 直接查看文件内容
- cat(concatenate)
cat [-AbEnTv]
参数:
-b : 列出行号,非空白行做出显示,空白行不标行号
-n : 全部标出行号
- tac(反向显示)
从最后一行到第一行显示出来
- nl(添加行号打印)
nl [-bnw] 文件
参数:
-b : 指定行号指定的方式 两种
-b a : 空行也列出行号
-b t : 空行不列出行号
-n : 列出行号的表示方式
-n ln : 行号在屏幕最左方显示
-n rn : 行号靠右显示,不加前缀0
-n rz : 行号靠右显示,加前缀0
-w : 行号占用的位数
eg.
nl -n rz -w 3 2.txt
结果
001
002
003
4.3.2 翻页查看
- more(一页一页的查看)
more 文件名
快捷键:
空格 : 下翻一页
回车 : 向下滚动一行
q : 离开
/字符串 : 查询字符串
- less(一页一页查看)
less功能比more的更全,支持向前翻动
空格 : 下翻一页
q : 离开
/字符串 : 向下查询字符串
?字符串 : 向上查询字符串
还有很多功能,可以man一下
4.3.3 数据选取
- head(取出前面几行)
head [-n number] 文件
eg.
head -n 1.txt默认显示前10行
head -n 20 1.txt 显示前20行
head -n -20 1.txt 若文件公有52行,显示前面32行,后面20行不显示
- tail (取出后面几行)
tail [-n number] 文件
参数:
-n
-f : 持续检测后面的文件,按下CTRL C才结束检测
eg.
默认显示后面的10行
tail -n +100 1.txt 列出100行及以后的数据
tail -f 1.txt该文件有数据写入时就立刻显示到屏幕上
4.3.4 非纯文本文件od
od [-t TYPE] 文件
-t后面可以接各种类型的输出
a : 默认字符输出
c : ASCII码输出
d : 十进制
f : 浮点数
o : 八进制
x : 十六进制
4.3.5 修改文件时间或创建新文件:touch
文件时间:
-
modification time(mtime)
文件数据更改时,就会更新这个时间 -
status time(ctime)
文件状态(权限与属性)改变时,就会更新这个时间 -
access time(atime)
文件内容被取用,就会更新
ll = ls -l
ll 获取文件的时间:
ll --time=atime 1.txt
ll --time=ctime 1.txtctime
注意:ls 默认显示的是文件的mtime
touch [-acdmt] 文件
参数:
-a : 修改访问时间
-c : 仅修改文件的时间,文件不存在不创建新文件
-d : 后面接欲修改的日期,也可使用--date="日期或时间"
-m : 修改mtime
-t : 后接欲修改的时间,格式[YYMMDDhhmm]
touch 还可以创建空文件
4.4 文件与目录的默认权限与隐藏权限
4.4.1 文件默认权限:umask
umask是用户在新建文件或目录时的权限默认值
- 查看默认权限:
umask 获取文默认权限(显示四个数字)数字为需要拿掉的权限
umask -S 以字符形式显示
4.4.2 文件隐藏属性chattr,lsattr
- chattr设置文件的隐藏属性
只在Ext2/Ext3的文件系统上生效
chattr [+-=][ASacdistu] 文件目录或名称
参数:
+ : 增加参数
- : 删除参数
= : 修改参数
i : 让文件不能被删除,改名设置连接也无法写入或添加数据。只有root能够设置该属性
a : 只能增加数据,不能删除和修改数据,root才能设置
- lsattr显示文件隐藏属性
lsattr [-adR] 文件或目录
参数:
-a : 将隐藏文件的属性也显示出来
-d : 接的是目录,仅列出目录本身的属性
—R : 连同子目录的数据也一并列出
4.4.3 文件特殊权限:SUID,SGID,SBIT
先掠过
4.4.4 查看文件类型
file 文件名
4.5 命令与文件的查询
4.5.1 脚本文件名的查询
- which (寻找执行文件)
which [-a] command
参数:
-a : 将所有由PATH目录中可以找到的命令列出
eg.
which ifconfig
4.5.2 文件名的查找
- whereis(寻找特定文件)
whereis [-bmsu] 文件或目录名
参数:
-b : 只找二进制的文件
-m : 只找在说明文件manul路径下的文件
-s : 只找source源文件
-u : 查找不在上面三项的其他文件
- locate
locate [-ir] keyword
参数:
-i : 忽略大小写的差异
-r : 后面接正则表达式的方式
eg.
locate passwd
会查找只要包含关键字的文件,但是在自己创建的数据库寻找文件,不是在硬盘中。
该数据库只会定期的更新数据,如果要查找新创建的文件,需要手动更新数据库—使用命令updatedb
- find
find [PATH] [option] [action]
参数:
---时间相关的---
-atime -ctime -mtime
-mtime n : n天之前的1天内被更改过的文件
-mtime +n : n天之前的(不包括n天)被更改过的文件名
-mtime -n : n天之内的(包括n天)被更改过的文件名
eg.
find / -mtime 0 0代表目前的时间,从现在开始到24小时前
--与用户或用户组名有关的参数--
-uid n : n为数字,为用户的帐号ID,即uid uid是记录在/etc/passwd里面与帐号名称对应的数字
-gid n : n为数字,为用户组名的ID,即gid,gid记录在/etc/group中
-user name : name为用户帐号名称
......
--文件权限及名称有关的参数--
-name filename :查找文件名为filename的文件
-size [+-]SIZE 查找比SIZE规格还大(+)或小(-)的文件,SIZE规格有c:byte k:1024bytes
-type TYPE : 查找文件类型为TYPE的文件,TYPE有正规文件(f)
......
5. Linux磁盘与文件系统管理
5.1 Linux的磁盘文件系统EXT2
-
文件数据:文件权限(rwx)和文件属性(所有者,群组,时间参数),文件系统通常会将这两部分存放在不同的块中。权限和属性存放在inode中,实际数据存放在data block块中。
-
三种数据:
- super block:记录文件系统的整体信息,包括inode/block的总量,使用量,剩余量,以及文件系统的格式和相关信息
- inode:记录文件的权限和属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码
- block:实际记录文件的内容,若文件太大时,会占用多个block
-
挂载:将文件系统和目录树结合的操作成为挂载
- 挂载点一定是目录,该目录为进入该文件系统的入口
5.2 文件系统的简单操作
5.2.1 磁盘与目录的容量
- df(列出文件系统的整体磁盘使用量)
df [-参数] [目录或文件名]
参数:
-h : 以GB、MB、KB的格式显示
-i : 不用硬盘容量显示,而用inode的数量显示
.....
eg.
df -h
......
- du(评估文件系统的磁盘使用量)
du [-参数] 文件或目录名称
参数:
-s : 列出总量而已,不列出个别目录的占用容量
-h : 以人们易读的容量单位格式显示(G/M)
5.2.2 链接文件ln
- 硬连接:通过文件系统的inode连接来产生新文件名,而不是产生新文件
- 软连接:类似Windows的创建快捷方式
ln [-sf] 源文件 目标文件
参数:
-s : 不加参数就是硬连接,加上-s就是软连接(symbolic link)
-f : 若目标文件存在,就主动将目标文件直接删除后再创建
5.3 磁盘分区、格式化、检验、挂载
5.3.1 磁盘分区:fdisk
fdisk [-l] 设备名称
输出后面所接设备的所有分区的内容。如只有fdisk -l,系统会将整个系统能够找到的所有的分区全部列出来
fdisk /dev/hdc
后面会显示等待输入:输入m显示所有的命令介绍
- 只要离开时按下q,所有的操作都不会生效!可以随便练习,最后按下q即可
- 按下w,那么操作生效
5.3.2 格式化:mkfs
mkfs [-t 文件系统格式] 设备文件名
参数:
-t : 可以接文件系统格式,例如ext3,ext2等
eg.
mkfs -t ext3 /dev/hdc6
5.3.3 检验:fsck,badblocks
- fsck(莫名的死机可能导致文件系统错乱,可以使用fsck进行分析)
fsck [-t 文件系统] [-参数] 设备名称
参数:
-a : 自动修复检查到有异常的扇区
...
- badblocks
badblocks [-svw] 设备名称
参数:
-s : 在屏幕上列出进度
-w : 使用写入的方式来测试
-v : 可以在屏幕上看到进度
5.3.4 卸载与挂载
将文件系统挂载到Linux系统上,使用mount命令,卸载使用umount命令
6.文件与文件系统的压缩和打包
7.vim编辑器
7.1 vim的使用
vim分为三种模式
- 一般模式
默认的模式。可以移动光标,删除字符或整行(按下dd删除整行)。 - 编辑模式
可以编辑文件的内容 - 命令模式
可以输出各种命令
一般模式->编辑模式:输入i
,o
,a
,r
中的任意一个
一般模式->命令模式:输入:
,/
,?
中的任意一个
编辑模式或者命令模式->一般模式:按下Esc
键
三种模式的按键:
-
一般模式
dd
删除光标所在的整行yy
复制光标所在的那一行v
选择字符V
整行选择字符
-
编辑模式
- 进入编辑模式按
i
,a
,o
,r
中的一个 - 退出按
Esc
- 进入编辑模式按
-
命令模式
:w
保存文件:wq
保存文件并退出:w!
强制保存文件:w [filename]
将文件数据存为另外一个文件
以上是关于Linux 0.11内核编译错误记录的主要内容,如果未能解决你的问题,请参考以下文章
错误记录编译 Linux 内核报错 ( /bin/sh: 1: flex: not found )
错误记录编译 Linux 内核报错 ( Unable to find the ncurses package. )
错误记录编译 Linux 内核报错 ( fatal error: openssl/opensslv.h: No such file or directory )