Hello World 5

PyQt5 IDE安装并执行第一个hello world程序 PyQt5 IDE Eric 安装 配置 阅读详情

本文装载自:http://www.cnblogs.com/xuqiang/archive/2010/03/29/1953689.html

微笑

系统调用实现

参考文章:

http://docs.huihoo.com/joyfire.net/6-1.html

 

操作系统为在用户态运行的进程与硬件的通信提供了一组接口,然而用户进程是不能直接和硬件交互的,而是通过系统调用来实现和硬件的交互。

 

首先来说明的是“用户态”和“内核态”。

http://blog.youkuaiyun.com/fatsandwich/archive/2008/02/29/2131707.aspx

当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些类似。 

内核态与用户态是操作系统的两种运行级别,跟intel cpu没有必然的联系, intel cpu提供Ring0-Ring3三种级别的运行模式,Ring0级别最高,Ring3最低。Linux使用了Ring3级别运行用户态,Ring0作为 内核态,没有使用Ring1和Ring2。Ring3状态不能访问Ring0的地址空间,包括代码和数据。Linux进程的4GB地址空间,3G-4G部 分大家是共享的,是内核态的地址空间,这里存放在整个内核的代码和所有的内核模块,以及内核所维护

的数据。用户运行一个程序,该程序所创建的进程开始是运 行在用户态的,如果要执行文件操作,网络数据发送等操作,必须通过write,send等系统调用,这些系统调用会调用内核中的代码来完成操作,这时,必 须切换到Ring0,然后进入3GB-4GB中的内核地址空间去执行这些代码完成操作,完成后,切换回Ring3,回到用户态。这样,用户态的程序就不能 随意操作内核地址空间,具有一定的安全保护作用。
    至于说保护模式,是说通过内存页表操作等机制,保证进程间的地址空间不会互相冲突,一个进程的操作不会修改另一个进程的地址空间中的数据。

 

总结上面的:由于intel cpu的硬件保护机制的存在,在特权级低的情况下,进程是不能访问一些操作系统资源的,所以linux采用了系统调用的机制来允许应用进程来访问一些硬件资源。所有的进程是共享的一个内核空间的实际物理ram。

 

http://tmdnet.nothave.com/man/aka/Lecture-4/index.html

中断通常是被定义为一个事件,该事件改编程序执行的顺序,这是与cpu的硬件是相关的。在每种平台上,都有特定的指令可以使进程的执行由用户态转换为核心态,这种指令称作操作系统陷入。进程通过陷入指令便进入了内核态。

 

linux系统的中断的硬件基础首先是idt表。中断描述符表idt是一个系统表,它与每个中断异常向量相联系,在intel的cpu中使用寄存器idtr来保存idt表在内存中的位置。

 

当执行了一条指令之后,cs和eip寄存器会指向下一条将要执行的指令的逻辑地址,在执行那条指令之前,cpu会检查时候发生了中断或者是异常,如果发生了中断或者是异常的话。

 

1.确定中断或者是异常相关联的i

2.读取idt中的第i项(其中保存的是中断描述符)

3.从gdt中查找gdt基址,在gdt中查找,读取idt表项中的选择描述符所标识的段描述符,这个描述符指定了中断处理程序所在的段的基址。事实上

idt的初始化在系统启动时,对INT 0x80进行一定的初始化。

 

使用汇编子程序setup_idt(linux/arch/i386/kernel/head.S)初始化idt表(中断描述符表),这时所有的入口函数偏移地址都被设为ignore_int

setup_idt:

lea ignore_int,%edx

movl $(__KERNEL_CS << 16),%eax

movw %dx,%ax /* selector = 0x0010 = cs */

movw $0x8E00,%dx /* interrupt gate - dpl=0, present */

lea SYMBOL_NAME(idt_table),%edi

mov $256,%ecx

rp_sidt:

movl %eax,(%edi)

movl %edx,4(%edi)

addl $8,%edi

dec %ecx

jne rp_sidt

ret

selector = __KERNEL_CS, DPL = 0, TYPE = E, P = 1);

 

Start_kernel()(linux/init/main.c)调用trap_init()(linux/arch/i386/kernel/trap.c)函数设置中断描述符表。在该函数里,实际上是通过调用函数set_system_gate(SYSCALL_VECTOR,&system_call)来完成该项的设置的。其中的SYSCALL_VECTOR就是0x80,而system_call则是一个汇编子函数,它即是中断0x80的处理函数,主要完成两项工作:a. 寄存器上下文的保存;b. 跳转到系统调用处理函数。

 

 

4.确定中断源的特权级能够发出这个中断

5.检查是否发生了特权级的变化,如果需要的话,改变特权级。

6.保存相关寄存器

7.现在装载cs和eip,从而指定了中断的处理程序的第一条指令

 

现在程序已经执行到了system_call:

8.保存相关的寄存器

9.判断当前调用是否是合法系统调用(EAX是系统调用号,它应该小于NR_syscalls)

10.在系统调用表sys_call_table中查找处理函数入口地址,并跳转到该入口地址。 

于是开始中断处理函数。

 

现在中断处理程序开始运行。。。。

 

当中断处理程序执行完毕之后,开始中断返回。其中最主要的就是:使用用RESTORE_ALL来弹出所有被SAVE_ALL压入核心栈的内容并且使用iret返回用户态。

 

当然上面的过程中忽略了中断中一个比较重要的部分“参数的传递”:

SAVE_ALL是系统调用参数的传入过程,当执行完SAVE_ALL并且再由CALL指令调用其处理函数时,堆栈的结构应该如上图所示。这时的堆栈结构看起来和执行一个普通带参数的函数调用是一样的,参数在堆栈中对应的顺序是(arg1, ebx),(arg2, ecx),(arg3, edx). . . . . .,这正是SAVE_ALL压栈的反顺序,这些参数正是用户在使用系统调用时试图传送给核心的参数。

 

总结上面:显然在内核态中的中断处理函数使用“寄存器”来传递参数。现在来看一个例子:

int sys_write (unsigned int fd, const char* buf, unsigned int count)

显然在执行这个函数时(运行在内核态),该函数需要在栈顶的位置寻找函数的参数。所以需要在SAVE_ALL宏之后,还需要保存其他的寄存器,

http://blog.youkuaiyun.com/TopEmbedded/archive/2009/02/24/3933683.aspx

“这样就意味着我们只要巧妙地设置好堆栈,让sys_fork()产生一种错觉,好像是上层的一个函数直接调用sys_fork()一样。事实上sys_fork()也的确可以在内核态直接调用。”

 ”通过巧妙的构造堆栈,达到调用内核函数的目的。“

 

好吧整个中断就算完成了。。。


Java多线程:5个线程先打印5个hello,再打印5个world 本文用两种方法实现了5个线程,先打印5个hello,再打印5个world。 阅读详情

相关推荐

【从入门到精通】鸿蒙5.0开发:创建和运行Hello World

DevEco Studio安装完成后,可以通过运行Hello World工程来验证环境设置是否正确。

初一十五的博客 787

PyQt5的例子(一)——hello world

PyQt5的例子(一)——hello world

qq_44906603的博客 487

Android应用构建:2:Android Studio 3.5.3: Hello World示例工程

这篇文章使用前文准备的环境创建一个Android的简单示例应用,主要为后续构建、打包和部署提供基础。

知行合一 止于至善 4439

Cocos2d-html5 搭建开发环境,运行 Hello World,JetBrains IDE Support

勤奋努力,持之以恒!

song_hui_xiang 2万+

Qt creator第一个Qt5小程序:显示带背景颜色或图片的QWidget的Hello World窗口

用“qt-opensource-linux-x64-5.3.0.run”版本,安装完之后已经集成了QtCreator,在Tools目录下。这里用QtCreator作为IDE,创建,编译一个最简单的Qt5小程序。

每天进步一点 5860

T5L 迪文屏 C51开发之Hello World例程 嵌入式

总结起来,本文介绍了如何在T5L迪文屏C51开发板上实现Hello World例程,包括初始化液晶显示屏和串口通信,并在液晶显示屏上显示"Hello World"。函数,用于在液晶显示屏上显示"Hello World"。在主函数中,我们调用了这两个函数,从而实现了在液晶显示屏上显示"Hello World"的功能。在主函数中,我们调用了这两个函数,从而实现了在液晶显示屏上显示"Hello World"的功能。在主函数中,我们调用这两个初始化函数,并在液晶显示屏上显示"Hello World"。

CodeMaven的博客 584

10分钟创建你的第一个鸿蒙5应用(Hello World实战)

《鸿蒙5应用开发快速指南》摘要:本文提供HarmonyOS5应用开发的完整流程指引,包含6个核心步骤:1)环境配置(安装DevEcoStudio及SDK);2)项目创建(选择ArkTS模板);3)代码编写(含交互功能实现);4)运行调试(模拟器/真机部署);5)扩展功能(页面跳转实现);6)应用打包(HAP文件生成)。教程附带常见问题解决方案,10分钟即可完成从零到应用发布的全流程,适合新手开发者快速入门鸿蒙生态开发。

2301_79392153的博客 1168

22、T5L 迪文屏 C51开发之Hello World例程

T5L 迪文屏 C51开发之Hello World例程1、写在前面 1、写在前面   前面已经介绍了如何使用DGUS Tool软件来进行迪文屏GUI界面的开发,列举了一些控件的使用。不知大家是否还记得T5L ASIC内部有两个内核,一个是GUI CPU运行 DGUS II 系统,另一个是 OS CPU 运行用户的 8051 代码 或者 在迪文 DWIN OS系统 ...

嵌入式羊圈 2928

python-pyqt5教程_python PyQt5初级教程hello world

PyQt5初级教程hello world本文主要介绍环境的安装和用QT拖控件实现一个简单的hello程序PyQt5安装经过我的多次尝试,发现python3.5才能顺利装上PyQt5。安装方法很简单,一条命令搞定pip install pyqt5可以用如下代码测试环境是否安装成功,运行成功会出现一个窗口:from PyQt5 import QtWidgets, QtGuiimport sysapp ...

weixin_39692254的博客 355

Outlook日历同步全攻略:Win10+安卓+iOS三端无缝衔接(附常见问题解决)

本文提供了一份详尽的Outlook日历同步指南,帮助用户在Windows 10、安卓和iOS三端实现无缝衔接。文章深入解析了Exchange ActiveSync等核心同步原理,并给出了从账户创建到各设备(特别是华为手机)的具体配置步骤、进阶管理技巧以及针对同步失败、事件重复等常见问题的实战解决方案,旨在彻底解决跨平台日程管理的痛点。

l3m4n的博客 552

神州数码OSPF实战配置详解(手把手教学)

本文提供神州数码设备上OSPF基础配置的详细实战教程。通过搭建典型的两台三层交换机互联实验环境,手把手演示了VLAN创建、接口IP配置、OSPF进程启动、Router-ID设置及网络宣告等核心步骤,并分享了邻居状态验证、路由检查及常见排错方法,帮助网络工程师快速掌握神州数码OSPF的配置要点与操作技巧。

weixin_29210727的博客 79

【qt5_study】1.Hello world

本文介绍了Qt开发中项目创建和文件结构的基本知识。主要内容包括:1.项目模板选择,推荐使用Qt Widgets Application,基类通常选择QMainWindow或QWidget;2.项目文件结构,包含.pro项目管理文件、头文件、源文件和.ui界面文件;3.界面设计器使用,通过拖拽控件和设置属性来设计界面;4.项目构建运行流程,从main()函数入口到窗口显示的基本原理。文章特别强调了在嵌入式开发中通常使用QWidget作为基类,并详细说明了各文件的作用和相互关系,为Qt初学者提供了基础的项目开发

2301_79858368的博客 1216

blenderproc 制作位姿估计数据集

blenderproc 制作位姿估计数据集 准备工作 1.首先需要去下载blenderproc的源码blenderproc,按照作者的readme文件进行编译。 2.其次需要下载bop_toolkit源码,链接如下bop_toolkit 3.说明:blenderproc主要用来生成数据,包括depth,rgb,位姿标签文件(scene_gt.json),bop_toolkit主要用来生成mask和mask_visib,scene_gt_info.json,用于判断物体的可见区域比例,如果遮挡太多考虑去掉。做

qq_43814359的博客 5697

【Python开发技术之PyQt5精品教学】第3课--PyQt5 Hello World示例

添加一个QLabel对象,并将标签的标题设置为“hello world”。一个QWidget对象创建了顶层窗口,其中添加了QLabel对象。使用setGeometry()方法定义窗口的大小和位置。通过setGeometry()方法定义窗口的大小和位置。通过app.exec_()方法进入应用程序的主循环。创建一个QApplication类的应用程序对象。创建一个QApplication类的应用程序对象。将标签的标题设置为”hello world”。基于QWidget类声明窗口类。方法进入应用程序的主循环。

xzs51job的专栏 479

Chkdsk误删文件?5步教你从FOUND.000文件夹找回重要数据(附工具推荐)

本文详细介绍了当Chkdsk误删文件后,如何从FOUND.000文件夹中找回重要数据的5个步骤。包括理解Chkdsk与FOUND.000的关系、定位与访问FOUND.000文件夹、手动恢复CHK文件的技巧、使用UnCHK工具自动化恢复以及预防数据丢失的关键措施。适用于Windows用户解决数据丢失问题,特别是NTFS文件系统下的文件恢复。

weixin_30687051的博客 390

12、硬件工程师笔试面试——MOS管(2025版本)

在设计和测试过程中,可以参考相关的EMC测试标准和指南,如CE认证EMC电磁兼容测试介绍 和电磁兼容性(EMC)测试方法与整改指南 ,以及电磁兼容(EMC)的标准与测试内容 ,来确保MOSFET的EMC性能符合行业标准。在高频应用中,MOSFET的开关速度对电路的整体性能至关重要。是一款高电压同步N沟道MOSFET驱动器,具有自举电源电压至114V的能力,宽VCC电压范围,自适应贯通保护功能,以及高达1.4A的峰值顶端栅极上拉电流,适用于分布式电源架构、汽车电源、高密度电源模块和电信系统等应用。

XU157303764的博客 7090

【先楫HPM5E00_EVK系列-板卡测评1】hpm5e00evk平台Hello World例程

此文介绍了利用先楫半导体(hpm)官方hpm5e00evk开发板输出一个“Hello World”工程,主要汇总了先楫半导体相关资料,完整的说明如何搭建软件开发与编译环境、硬件电路连接方式、实验效果。

西林电子 1940

【图像去噪】论文精读:Restormer: Efficient Transformer for High-Resolution Image Restoration

论文题目:Restormer: Efficient Transformer for High-Resolution Image Restoration —— Restormer:用于高分辨率图像恢复的高效变压器高效Transformer模型用于图像恢复!由于卷积神经网络 (CNN) 在从大规模数据中学习可泛化的图像先验方面表现良好,因此这些模型已广泛应用于图像恢复和相关任务。最近,另一类神经架构 Transformer 在自然语言和高级视觉任务中显示出显着的性能提升。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1526

树莓派CM4安装QT5并通过QML编写Hello World.

这里写目录标题一级目录二级目录三级目录 一级目录 二级目录 三级目录

YerikRyan的博客 1005

光学传播仿真软件:SPEOS_(14).建筑物内光环境仿真

在建筑物内光环境仿真中,材料属性的定义直接影响光的传播和反射效果。SPEOS提供了丰富的材料库,但也可以自定义材料属性以满足特定需求。创建新材料选择Materials->。输入材料名称和类型。配置材料属性选择材料对象,打开属性编辑器。设置反射率、透射率、表面粗糙度和颜色。# 导入SPEOS模块# 创建新材料# 配置材料属性custom_material.set_reflectivity(0.8) # 设置反射率为0.8。

kkchenjj的博客 1246

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

NEORV32快速开始:5分钟从零到Hello World

NEORV32是一款小型、可定制且可扩展的MCU级32位RISC-V软核CPU和类微控制器SoC,采用平台无关的VHDL编写。本教程将带你快速上手NEORV32,在短短5分钟内完成从环境搭建到运行Hello World程序的全过程。 ## 1. 准备工作:获取NEORV32项目 首先,克隆NEORV32项目仓库到本地: ```bash git clone https://gitcode.co

gitblog_00304的博客 832

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java web red5_Red5开发第一步-Hello World

安装好Red5服务器之后,接下来就是测试运行众人皆知的Hello World了。按照教程上一步一步来做,可惜一直没运行起来,老是NetConnection.Connect.Rejected,NetConnection.Connect.Closed,郁闷了半天,最后通过与Red5自带的例子SOSample对比,终于给运行起来了。其过程如下:第一步:把Red5安装目录中doc\templates文件夹...

weixin_33739387的博客 354

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

5分钟上手ncurses-rs:Hello World示例详解

ncurses-rs是一个为Rust语言设计的底层ncurses包装库,让开发者能够轻松创建功能丰富的终端用户界面(TUI)应用程序。本文将通过一个简单的"Hello World"示例,带领你快速掌握ncurses-rs的基本使用方法,即使你是Rust新手也能轻松上手。 ## 📋 准备工作:安装与环境配置 在开始编写代码之前,我们需要先准备好开发环境。首先确保你的系统中已经安装了Rust工具

gitblog_00404的博客 1035

PyQt5入门教程(1)Hello, World!

PyQt是一个创建GUI应用程序的工具包。它是Python编程语言和Qt库的成功融合。Qt库是目前最强大的库之一。PyQt是由Phil Thompson 开发。 之所以会将PyQt称作PyQt5,是因为PyQt的最新版本是5开头的,所以称作PyQt5。 安装PyQt5 pip install PyQt5 -i https://pypi.douban.com/simple pip install PyQy5-tools -i https://pypi.douban.com/simple 第一个PyQt

m0_50949767的博客 355
上一篇: Hello World 4
下一篇: Hello World 6
弱水三千_fllik
博客等级 码龄15年 48粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值